阻止从Docker容器到私有IP的传出连接
我们使用Docker在服务器上运行的一些服务尝试连接到私有IP地址(10.0.0.0/8,192.0.0.0/16,172.16.0.0/12,100.64.0.0/10)。
这种行为是正常的,但我们的服务器提供商检测到这种stream量,并发送警报
我们只想停止传出stream量,而不是使用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创build了以下规则:
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
任何反馈意见。
您在错误的链中添加规则。 来自docker集装箱的stream量通过filter
表的FORWARD
链,而不是OUTPUT
链。 这是因为从主机的angular度来看,stream量来自docker0
接口,主机只是作为转发器。
为了区分入站和出站stream量,请使用-i
和-o
选项来指定接口。 您也不能使用uid来确定stream量是否来自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
replace为docker0
创build的虚拟接口的名称。
(注意:如果不存在链路DOCKER-ISOLATION
,则直接附加到FORWARD
链)。
还要看看iptables -vL
和iptables -t nat -vL
的输出,以更好地理解地址如何被翻译。