在 Kubernetes 节点上重启后删除 iptables 规则

iptables rules deleted after reboot on Kubernetes nodes

手动添加一些 iptables 规则并重启机器后,所有规则都消失了(无论规则类型如何)。

例如

$ iptables -A FUGA-INPUT -p tcp --dport 23 -j DROP
$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */
KUBE-FIREWALL  all  --  anywhere             anywhere
DROP       tcp  --  anywhere             anywhere             tcp dpt:telnet

重启后:

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */
KUBE-FIREWALL  all  --  anywhere             anywhere

如果我没记错的话,每个节点上的kube-proxy 运行都在动态修改iptables。如果这是正确的,我如何添加永久性规则但仍然启用 kubernetes/kube-proxy 来实现它的魔力,而不是删除所有 Kubernetes 都支持的 INPUTFORWARDOUTPUT 规则和 Weave 插件网络动态生成?

运行 iptables on any 系统不是持久性操作,重启时会被遗忘,k8s 节点也不例外。我怀疑 k8s 在启动时会清除 IPTABLES 规则,所以你可以试试这个:

  • 创建您的规则(从空的 iptables 开始,根据需要使用 iptables -A 命令)
  • 运行 iptables-save >/etc/my-iptables-rules(注意您也可以手动创建规则文件)。
  • 创建一个 运行 启动时的系统服务脚本(或使用 /etc/rc.local)并向其中添加 iptables-restore -n </etc/my-iptables-rules。这将在重新启动时加载您的规则。请注意,如果您使用 rc.local,您的 'iptables-restore' 命令可能会在 k8s 启动后 运行,请检查您的 iptables -A 命令是否对在 k8s 之后加载不敏感;如果需要,请将文件中的 -A 命令替换为 -I(将您的命令放在表中的第一位)。

(请注意,某些 OS 安装可能包括加载 iptables 的启动时服务;有一些安装此类服务的防火墙包 - 如果您的服务器上有一个,最好方法是将您的规则添加到该防火墙的配置中,而不是编写和加载您自己的自定义配置。