我们在kubernetes精心安排的dockerized环境中的生产环境中使用python-iptables v0.12.0。 使用python-iptables库的容器应用程序由以下网络组成:
存在两个内部接口eth0和eth1(用于容器内的通信),分别具有一个ipv4和一个ipv6地址。 一个外部接口ext0,其中两个ipv6地址仅用于外部通信。
在启动时,我们的应用程序具有以下ip6tables配置,这些配置完全由python-iptables库创建。请注意,LOGGING目标仅用于记录和丢弃数据包:
所有来自ext0接口的来自外部世界的ipv6流量都应该被丢弃**。
但是,不仅实际上没有数据包被丢弃,而且所有数据包都与对应于我们内部接口之一的第二个规则匹配!
然后,我们接受ext0接口的所有流量:
仍然所有流量都通过eth0接口而不是ext0!
如果我们删除第二条规则,希望流量能够匹配我们的外部接口,
仍然存在相同的问题,但是现在所有流量都与eth1接口匹配!
现在,我们添加了完全相同的规则,以便使用eth1接口接受流量,但是现在,我们使用Linux iptables软件包代替了python-iptables:
您可以看到Linux iptables软件包可以按预期工作(不匹配发往ext0 iface的数据包),而python-iptables生成的规则错误地接受了所有流量!
似乎python-iptables和Linux iptables软件包之间的ipv6规则生成方式可能存在一些差异。
如何解决/解决此问题?
我们的配置设置:
- cat /etc/os-release
NAME="Red Hat Enterprise Linux Server"
VERSION="7.5 (Maipo)"
- uname -r
4.4.134-1.el7.elrepo.x86_64
[root@testEnv tmp]# python
Python 2.7.5 (default, Feb 20 2018, 09:19:12)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import iptc
chain = iptc.Chain(iptc.Table6(iptc.Table6.FILTER), "INPUT")
rule = iptc.Rule6()
rule.in_interface = "eth0"
target = iptc.Target(rule, "ACCEPT")
rule.target=target
chain.insert_rule(rule)