k8s使用calico网络插件时,集群内节点防火墙策略配置方法

前言

我们在内网使用k8s时,有时候需要针对整个集群的节点设置防火墙,阻止一些外部访问,或者是仅允许白名单内的ip访问,传统做法是使用firewall之类的防火墙软件,但是,使用firewall存在如下问题:

  1. firewall针对k8s的nodeport端口设置的防火墙规则不生效
  2. 集群内节点较多时,挨个主机设置防火墙会比较繁琐。

如果集群的节点是托管到云平台上的,可以忽略本文章,直接去云平台设置防火墙策略。

如果我们的k8s插件是calico,可以通过calico的扩展功能来设置整个集群所有节点的防火墙,不会有上面两个问题的困扰。

calico的网络策略

calico网络策略的官方文档是: https://docs.tigera.io/calico/latest/network-policy/get-started/calico-policy/calico-network-policy

想要在安装了calico网络插件的k8s集群里面配置节点防火墙,首先我们需要将节点注册到calico上,在calico这个叫做 Host endpoint, 一个Host endpoint 指的是节点对外的出口,一般是一块网卡,网卡上带有ip地址,我们需要通过声明HostEndpoint来注册。

在声明HostEndpoint时,还可以指定该节点的标签,后期在进行防火墙配置时,可以通过标签来批量配置。

当声明HostEndpoint后,节点的网络策略将由Calico接管,默认的规则是拒绝所有连接。Calico为了防止整个节点的网络瘫痪,默认开放了一些端口,比如22等,后面会详细说明。

声明HostEndpoint

如前所述,我们首先需要声明一个HostEndpoint,下面是声明的Yaml:

yaml 复制代码
apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: node1-eth0
  labels:
    kubernetes-host: ingress
spec:
  interfaceName: eth0
  node: node1
  expectedIPs:
    - INSERT_IP_HERE

这个是全局配置,不需要namespace。
metadata.name是HostEndpoint的名字,一般是节点名-网卡
spec.interfaceName 是节点的网卡名,可以通过 ip addr 或者 ifconfig 等命令查看。
spec.node 是该节点在k8s中的name,可以通过 kubectl get node来查看
spec.expectedIPs 是该网卡的ip,这个是必填项。

下面是一个配置好的样例:

yaml 复制代码
apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: localhost.localdomain-enp0s8
  labels:
    kubernetes-host: ingress
spec:
  interfaceName: enp0s8
  node: localhost.localdomain
  expectedIPs:
    - 192.168.88.5

将上述内容保存到hostendpoint.yaml中执行 kubectl apply -f hostendpoint.yaml创建:

bash 复制代码
[root@localhost calico]# kubectl apply -f hostendpoint.yaml
hostendpoint.projectcalico.org/localhost.localdomain-enp0s8 created

配置默认开放的端口

接入calico的HostEndpoint默认开放了一些端口,官方清单如下:
https://docs.tigera.io/calico/latest/reference/host-endpoints/failsafe

下面是摘抄:

如果想要关闭这里面的部分端口,或者默认在所有节点上开放其他端口,可以通过配置 FelixConfiguration来完成,官方文档地址为: https://docs.tigera.io/calico/latest/reference/resources/felixconfig

如果想要修改,可以通过kubectl edit FelixConfiguration default来修改配置,下面是一个样例,默认开放的端口仅保留了22,其他全部删掉了(实际操作过程不要这么做!这里只是为了方便演示,仅仅保留一个)。

yaml 复制代码
apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
  name: default
spec:
  bpfLogLevel: ""
  floatingIPs: Disabled
  healthPort: 9099
  logSeverityScreen: Info
  reportingInterval: 0s
  failsafeInboundHostPorts:
    - port: 22
      protocol: tcp

开放ip白名单,其他ip默认禁止访问

设置好默认开放的端口后,下一步一般是拒绝其他的ip,仅保留指定的ip可以访问,下面是一个样例:

yaml 复制代码
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-cluster-internal-ingress-only
spec:
# 生效顺序从小到大排序,后面再增加开放端口的策略时,order < 20, 即可在这之前生效
  order: 20
  preDNAT: true
  applyOnForward: true
  ingress:
  # 首先接受白名单的所有请求
    - action: Allow
      source:
      # source 配置方法可以参考  https://docs.tigera.io/calico/latest/reference/resources/networkpolicy#entityrule
        nets: 
          - 192.168.88.0/24
  # 然后拒绝白名单ip以外的所有请求
    - action: Deny
      source:
      # Deny规则要加上排除白名单的网段,理论上不需要这个,但是遇到过奇怪的BUG,没加上导致把上面开放的ip都Drop掉了
        notNets: 
          - 192.168.88.0/24
  selector: has(kubernetes-host)   # 选择器。选择了包含kubernetes-host标签的所有HostEndpoint

开放指定端口

yaml 复制代码
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-external-port-ingress
spec:
  order: 10
  preDNAT: true
  applyOnForward: true
  ingress:
  # 放通目标是指定端口的所有请求  当然也可以增加source字段指定来源ip/ip段
    - action: Allow
      destination:
      # 配置方法可以参考  https://docs.tigera.io/calico/latest/reference/resources/networkpolicy#entityrule
        ports:
          - 3306
          - 30030
  selector: has(kubernetes-host)   # 选择器。选择了包含kubernetes-host标签的所有HostEndpoint

注意这里的selector可以给某一两个节点打上特殊标签,选择到指定的一两个节点,给他们开放端口。

更多细节请查阅官方文档,这里仅给出了少量用法,官方支持的功能还是很多的。

修改或查看已有的网络策略/HostEndpoint

查看已有的网络策略:
kubectl get GlobalNetworkPolicy
kubectl describe GlobalNetworkPolicy xxx

修改已有的网络策略
kubectl edit GlobalNetworkPolicy xxx

删除网络策略
kubectl delete GlobalNetworkPolicy xx

HostEndpoint的操作也是一样的,只是把GlobalNetworkPolicy改成HostEndpoint就可以了

相关推荐
sunfove1 小时前
光网络的立交桥:光开关 (Optical Switch) 原理与主流技术解析
网络
唯情于酒1 小时前
Docker学习
学习·docker·容器
喵叔哟2 小时前
20.部署与运维
运维·docker·容器·.net
Kevin Wang7274 小时前
欧拉系统服务部署注意事项
网络·windows
min1811234564 小时前
深度伪造内容的检测与溯源技术
大数据·网络·人工智能
汤愈韬4 小时前
Full Cone Nat
网络·网络协议·网络安全·security·huawei
zbtlink5 小时前
现在还需要带电池的路由器吗?是用来干嘛的?
网络·智能路由器
桌面运维家5 小时前
vDisk配置漂移怎么办?VOI/IDV架构故障快速修复
网络·架构
dalerkd5 小时前
忙里偷闲叙-谈谈最近两年
网络·安全·web安全
汤愈韬6 小时前
NAT ALG (应用层网关)
网络·网络协议·网络安全·security·huawei