我们在使用Docker的服务器上运行的一些服务尝试连接到私有IP地址(10.0.0.0/8,192.0.0.0/16,172.16.0.0/12,100.64.0.0/10)。 / p>
此行为是正常的,但我们的服务器提供商检测到此流量并向我们发送警报。
我们只想停止传出流量,而不是使用iptables传入。
这是我们目前的设置:
-A OUTPUT -d 192.168.0.0/16 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -d 100.64.0.0/10 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -d 172.16.0.0/12 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -d 10.0.0.0/8 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable
但是这似乎不起作用,因为Docker创建了以下规则:
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-ISOLATION all -- anywhere anywhere
DOCKER all -- anywhere anywhere
对于服务:
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:1234
ACCEPT tcp -- anywhere 172.17.0.4 tcp dpt:1234
最后:
Chain DOCKER-ISOLATION (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
感谢任何反馈。
答案 0 :(得分:4)
您正在错误的链中添加规则。源自docker容器的流量通过FORWARD
表的filter
链,而不是OUTPUT
链。这是因为从主机的角度来看,流量来自docker0
接口,而主机仅仅充当转发器。
要区分入站和出站流量,请使用-i
和-o
选项指定接口。此外,您无法使用uid来确定流量是否来自docker容器(因为数据不是本地发起的)。检查传入接口就足够了。
因此,将以下规则添加到DOCKER-ISOLATION
链(从FORWARD
链中调用):
-A DOCKER-ISOLATION -d 192.168.0.0/16 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A DOCKER-ISOLATION -d 100.64.0.0/10 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A DOCKER-ISOLATION -d 172.16.0.0/12 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable
-A DOCKER-ISOLATION -d 10.0.0.0/8 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable
将docker0
替换为docker创建的虚拟接口的名称。
(注意:如果链DOCKER-ISOLATION
不存在,请直接附加到FORWARD
链。)
另请查看iptables -vL
和iptables -t nat -vL
的输出,以便更好地了解地址的翻译方式。