禁用从 docker 容器访问 LAN



我在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_name:alias 链接来让容器相互通信。不过,这不会阻止容器此时与主机通信。

您还可以使用如下规则对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

正如@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

fwiw,https://docs.docker.com/network/iptables/说为DOCKER-USER插入的规则先于任何其他规则应用,所以我发现以下内容就像一个魅力,用于防止容器访问我家庭网络上的其他机器:

iptables -I DOCKER-USER -d <net>/16 -j DROP

哪里

<net>是指您的本地网络(例如 10.1.10.0192.168.0.0)。

我不需要重新启动任何服务即可生效; curlping立即停止从包含内工作。

最新更新