我在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
如果我需要提供额外信息,请告诉我
答案 0 :(得分:8)
一种选择是使用--icc=false
运行docker,防止任何容器与其他容器通信,然后您可以通过将容器与--link=container_name:alias
链接来让容器相互通信。 This will not block the container from communicating with the host at this time though.
你也可以使用iptables来操作,例如:
iptables -A INPUT -i docker0 -d 192.168.0.0/16 -j DROP
请记住,主机看不到因icmp错误而丢失的数据包,所以在大多数情况下REJECT可能更合适。
编辑:更正规则以阻止转发到其他主机:
iptables -I FORWARD -i docker0 -d 192.168.0.0/16 -j DROP
答案 1 :(得分:0)
正如@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