禁用从docker容器访问LAN

禁用从docker容器访问LAN,docker,iptables,Docker,Iptables,我用Docker中的Ubuntu容器运行Gentoo主机。它们通过Docker自动创建的桥接器进行通信。我想放弃192.168.0.0/16可能来自容器的所有流量 $sudo iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A FORWARD -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 443 -j ACCEPT -A FORWARD

我用Docker中的Ubuntu容器运行Gentoo主机。它们通过Docker自动创建的桥接器进行通信。我想放弃192.168.0.0/16可能来自容器的所有流量

$sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 443 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
$sudo iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.17.0.2:443

请让我知道如果我需要提供额外的信息

一个选项是使用
--icc=false
运行docker,防止任何容器与其他容器通信,然后您可以通过链接
--link=container\u name:alias
让容器彼此通信

您还可以使用以下规则操作iptables:

iptables -A INPUT -i docker0 -d 192.168.0.0/16 -j DROP
请记住,主机不会看到icmp错误返回丢弃的数据包,所以在大多数情况下,拒绝可能更合适

编辑:更正规则以阻止转发到其他主机:

iptables -I FORWARD -i docker0 -d 192.168.0.0/16 -j DROP
正如@DRC所说,使用

iptables -I FORWARD -i docker0 -d 192.168.0.0/16 -j DROP
但是,此规则将阻止从本地网络到容器的通信(将建立连接,但容器将无法响应)

要允许从本地网络连接到容器,还必须添加

iptables -I FORWARD -i docker0 -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables没有效果(假设-o docker0)--icc=据我所知,错误会阻止航班之间的通信,但不会阻止与主机的通信。无论如何,我继续从docker exec-t-I cont1/bin/bashThank内部获得成功的ping,非常好的效果。我不能ping主机,但我可以ping网络中的其他物理机器。我认为转发工作很酷,一切似乎都在工作。我应该多读一些手册。我尝试了sudo iptables-A FORWARD-d192.168.0.0/16-I docker0-j DROP,但没有效果,这是不一样的。这是因为其他规则允许首先进行转发匹配,-A appends,-I。。。我让您在手册页中发现:)输入错误:
-I
是插入的