KubeSphere 最佳实战:KubeSphere 和 Kubernetes 安全加固之 Iptables 防火墙配置
2024 年云原生运维实战文档 99 篇原创计划 第 055 篇 |KubeSphere 最佳实战「2024」系列 第 027 篇
你好,欢迎来到运维有术。
本文是一篇实战短文,重点介绍 KubeKey 部署的 KubeSphere 和 Kubernetes 如何使用 Iptables 进行安全加固。
实战服务器配置(架构1:1复刻小规模生产环境,只是配置略有不同)
| 主机名 | IP | CPU | 内存 | 系统盘 | 数据盘 | 用途 |
|---|---|---|---|---|---|---|
| ksp-control-1 | 192.168.9.161 | 8 | 16 | 40 | 100 | KubeSphere/k8s-control-plane |
| ksp-control-2 | 192.168.9.162 | 8 | 16 | 40 | 100 | KubeSphere/k8s-control-plane |
| ksp-control-3 | 192.168.9.163 | 8 | 16 | 40 | 100 | KubeSphere/k8s-control-plane |
| 合计 | 3 | 24 | 48 | 120 | 300 |
实战环境涉及软件版本信息
- 操作系统:openEuler 22.03 LTS SP3 x86_64
- KubeSphere:v4.1.2
- Kubernetes:v1.30.6
- KubeKey: v3.1.7
1. 前言
本文防火墙规则适用于以下场景:
- 使用 KubeKey 部署的 KubeSphere 和 Kubernetes
- 使用 Iptables 而不是 Firewalld 配置防火墙规则
- 默认禁止所有 INPUT 流量,开放指定端口,并限制访问IP
为什么不用 Firewalld?
- Firewalld 默认禁用
- Kubernetes 使用 Iptables 进行流量转发和控制
- Firewalld 配置看似简单,实则没那么灵活,尤其是端口和IP不连续的场景
2. Control plane 需开放端口
| 协议 | 流量方向 | 端口/端口范围 | 用途(服务) | 使用者 |
|---|---|---|---|---|
| TCP | Inbound | 443,6443 | Kubernetes API server | All |
| TCP | Inbound | 2379,2380 | etcd server client API | kube-apiserver, etcd |
| TCP | Inbound | 10250 | Kubelet API | K8s 集群内部, Control plane |
| TCP | Inbound | 10259 | kube-scheduler | K8s 集群内部 |
| TCP | Inbound | 10257 | kube-controller-manager | K8s 集群内部 |
| TCP | Inbound | 10256 | kube-proxy | K8s 集群内部, Load balancers |
| TCP | Inbound | 30000-32767 | NodePort Services | All |
| TCP | Inbound | 53,9253,9254,9353 | DNS Node Cache | K8s 集群内部 |
| UDP | Inbound | 53 | DNS Node Cache | K8s 集群内部 |
3. Worker node(s) 需开放端口
| 协议 | 流量方向 | 端口/端口范围 | 用途(服务) | 使用者 |
|---|---|---|---|---|
| TCP | Inbound | 10250 | Kubelet API | K8s 集群内部, Control plane |
| TCP | Inbound | 10256 | kube-proxy | K8s 集群内部, Load balancers |
| TCP | Inbound | 30000-32767 | NodePort Services | All |
| TCP | Inbound | 53,9253,9254,9353 | DNS Node Cache | K8s 集群内部 |
| UDP | Inbound | 53 | DNS Node Cache | K8s 集群内部 |
4. 其它端口
如果启用了其它服务或是组件,则需要开放额外端口:
- 比如 Istio,需要开放
15090、15021、15020、15000等 - 比如 NFS,需要开放
111
不同版本的 Kubernetes,开放端口也有区别,请查看k8s 端口开放官方说明。
5. Iptables 规则示例
出于某些原因,本节不提供完整的脚本,仅提供思路和核心的配置命令。请根据端口、开放列表和下面的命令自行编写完整的脚本。
- 添加 TCP 规则
iptables -t filter -A INPUT -p tcp -m multiport --ports 10250 -s 192.168.9.0/24 -m comment --comment "Kubelet Service" -j ACCEPT
- 添加 UDP 规则
iptables -t filter -A INPUT -p udp -m multiport --ports 53 -s 192.168.9.0/24 -m comment --comment "DNS Node Cache" -j ACCEPT
- 添加默认规则
iptables -t filter -A INPUT -m comment --comment "999 drop all other requests" -j DROP
特别注意: 该规则会禁止所有进入主机的流量,请谨慎使用。
最终结果预览:
$ iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 13 /* 000 icmp security */
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 14 /* 000 icmp security */
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 11 /* 000 icmp security */
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 /* 000 accept all icmp requests */
223 31856 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 /* 001 accept all to lo interface */
356 36293 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 /* 002 accept related established rules */ state RELATED,ESTABLISHED
0 0 CUSTOM-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 22 /* 003 ssh */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 53,9253,9254,9353 /* DNS Node Cache */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 30000:32767 /* Kubernetes NodePort Services */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 111,2049,875,32803,32769,892,892,662,2020 /* NFS Service */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 10250 /* Kubelet Service */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 10257 /* Kube-controller-manager Service */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 10256 /* Kube-proxy Service */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 10259 /* Kube-scheduler Service */
2 120 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 2379,2380 /* etcd Service */
0 0 KUBE-CUSTOM-TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 6443 /* Kubernetes API Service */
0 0 KUBE-CUSTOM-UDP udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 111 /* NFS Service */
0 0 KUBE-CUSTOM-UDP udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 53 /* DNS Node Cache */
0 0 KUBE-CUSTOM-UDP udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport ports 323 /* Chronyd NTP Service */
0 0 ACCEPT all -- * * 10.233.0.0/16 0.0.0.0/0 /* 100 kubernetes pod network */
0 0 ACCEPT udp -- * * 0.0.0.0/0 169.254.25.10 udp dpt:53 /* NodeLocal DNS Cache: allow DNS traffic */
0 0 ACCEPT tcp -- * * 0.0.0.0/0 169.254.25.10 tcp dpt:53 /* NodeLocal DNS Cache: allow DNS traffic */
0 0 cali-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0 /* cali: */
0 0 KUBE-IPVS-FILTER all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes ipvs access filter */
0 0 KUBE-PROXY-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0 /* kube-proxy firewall rules */
0 0 KUBE-NODE-PORT all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes health check rules */
0 0 KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 /* 999 drop all other requests */
6. 自动化脚本
文章中所有操作步骤、配置文件,已全部编排为自动化脚本,包含以下内容:
- 防火墙规则列表 iplist
- 防火墙配置脚本 k8s-fw.sh
运维有术星球会员请到专属代码仓库下载(价值内容,仅星球会员专享)。
以上,就是我今天分享的全部内容。下一期分享的内容还没想好,敬请期待开盲盒。
如果你喜欢本文,请分享、收藏、点赞、评论! 请持续关注 @运维有术,及时收看更多好文!
欢迎加入 「知识星球|运维有术」 ,获取更多的 KubeSphere、Kubernetes、云原生运维、自动化运维、AI 大模型等实战技能。未来运维生涯始终有我坐在你的副驾。
免责声明:
- 笔者水平有限,尽管经过多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
- 本文所述内容仅通过实战环境验证测试,读者可学习、借鉴,但严禁直接用于生产环境。由此引发的任何问题,作者概不负责!
Get 本文实战视频(请注意,文档视频异步发行,请先关注)
版权声明
- 所有内容均属于原创,感谢阅读、收藏,转载请联系授权,未经授权不得转载。