前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >KubeSphere 最佳实战:KubeSphere 和 Kubernetes 安全加固之 Iptables 防火墙配置

KubeSphere 最佳实战:KubeSphere 和 Kubernetes 安全加固之 Iptables 防火墙配置

原创
作者头像
运维有术
发布2024-11-20 17:45:23
发布2024-11-20 17:45:23
1761
举报
文章被收录于专栏:运维有术运维有术

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 规则
代码语言:bash
复制
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 规则
代码语言:bash
复制
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
  • 添加默认规则
代码语言:bash
复制
iptables -t filter -A INPUT -m comment --comment "999 drop all other requests" -j DROP

特别注意: 该规则会禁止所有进入主机的流量,请谨慎使用。

最终结果预览:

代码语言:bash
复制
$ 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 本文实战视频(请注意,文档视频异步发行,请先关注)

版权声明

  • 所有内容均属于原创,感谢阅读、收藏,转载请联系授权,未经授权不得转载

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • KubeSphere 最佳实战:KubeSphere 和 Kubernetes 安全加固之 Iptables 防火墙配置
    • 1. 前言
    • 2. Control plane 需开放端口
    • 3. Worker node(s) 需开放端口
    • 4. 其它端口
    • 5. Iptables 规则示例
    • 6. 自动化脚本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档