Служба Cloudpods работает в кластере Kubernetes, а сетевая схема кластера Kubernetes принимаетCalico. Таким образом, правила iptables для узлов, на которых работает служба Cloudpods, берет на себя Calico. В результате правила брандмауэра, которые мы настроили на сервисном узле Cloudpods, будут перезаписаны правилами iptables, настроенными Calico, в результате чего правила брандмауэра не вступят в силу. В этой статье описывается, как использовать HostEndpoint и GlobalNetworkPolicy Calico для установки правил брандмауэра для хост-узлов.
1. Подготовьте инструмент calicoctl
скачать двоичный файл
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.12.1/calicoctl
chmod +x calicoctl
Установить переменные среды
export DATASTORE_TYPE=kubernetes
export KUBECONFIG=/etc/kubernetes/admin.conf
2. Настройте правила HostEndpoint
Для каждого интерфейса каждого хоста, который должен управлять правилом брандмауэра, определите соответствующее правило HostEndpoint.
- apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
name: <node_name>-<interface_name>
labels:
role: master
env: production
spec:
interfaceName: <interface_name>
node: <node_name>
expectedIPs: ["<interface_ip>"]
- apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
name: <node_name>-<interface_name>
labels:
role: master
env: production
spec:
interfaceName: <interface_name>
node: <node_name>
expectedIPs: ["<interface_ip>"]
Примените правило:
./calicoctl apply -f hep.yaml
3. Определите сетевые правила
После определения HostEndpoint используйте GlobalNetworkPolicy Calico для определения правил брандмауэра.
- apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: <whitelist_gnp_name>
spec:
order: 10
preDNAT: true
applyOnForward: true
ingress:
- action: Allow
protocol: TCP
source:
nets: [<src_net_block1>, <src_net_block2>]
destination:
ports: [<dst_port1>, <dst_port2>]
selector: "role=="master""
- apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: drop-other-ingress
spec:
order: 20
preDNAT: true
applyOnForward: true
ingress:
- action: Deny
selector: "role=="master""
Применить правила
./calicoctl apply -f gnp.yaml
4. отказоустойчивый механизм
Чтобы предотвратить риск того, что узел не сможет получить доступ к сети из-за неправильной настройки пользователя, в calico разработан механизм отказоустойчивости, то есть, если пользователь напишет неправильные правила, некоторые порты не будут заблокированы, что приведет к отказу узла функция. Вот информация для порта FailSafe:docs.project calico.org/reference/… также…
5. Пример конфигурации
Например: внешний сетевой порт главного узла разрешает только порты 80 и 443, а все остальные запрещены:
Определение HostEndpoint:
- apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
name: master1-em4
labels:
role: master
type: external
spec:
interfaceName: em4
node: master1
expectedIPs: ["120.133.60.219"]
- apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
name: master2-em4
labels:
role: master
type: external
spec:
interfaceName: em4
node: master2
expectedIPs: ["120.133.60.220"]
- apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
name: master3-em4
labels:
role: master
type: external
spec:
interfaceName: em4
node: master3
expectedIPs: ["120.133.60.221"]
Глобалнетворкполисидефинитион
- apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: allow-http-https-traffic-only
spec:
order: 10
preDNAT: true
applyOnForward: true
ingress:
- action: Allow
protocol: TCP
destination:
ports: [80,443]
selector: "role=="master" && type=="external""
- apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: drop-other-ingress
spec:
order: 20
preDNAT: true
applyOnForward: true
ingress:
- action: Deny