阻止从Docker容器到私有IP的传出连接

Joh*_*nis 6 firewall iptables docker

我们在使用Docker的服务器上运行的一些服务尝试连接到私有IP地址(10.0.0.0/8,192.0.0.0/16,172.16.0.0/12,100.64.0.0/10).

此行为是正常的,但我们的服务器提供商检测到此流量并向我们发送警报

我们想只停止传出流量,而不是使用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
Run Code Online (Sandbox Code Playgroud)

但是这似乎不起作用,因为Docker创建了以下规则:

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
Run Code Online (Sandbox Code Playgroud)

对于服务:

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
Run Code Online (Sandbox Code Playgroud)

最后:

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
Run Code Online (Sandbox Code Playgroud)

任何反馈都表示赞赏.

Tan*_*may 8

您正在错误的链中添加规则。即源自搬运工容器中的流量通过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
Run Code Online (Sandbox Code Playgroud)

替换docker0为 docker 创建的虚拟接口的名称。

(注意:如果链DOCKER-ISOLATION不存在,直接附加到FORWARD链)。

还要查看输出iptables -vLiptables -t nat -vL更好地了解地址是如何转换的。