如何使用 iptables 阻止默认网关以外的容器通信(172.17.0.0/16)

如何使用 iptables 阻止默认网关以外的容器通信(172.17.0.0/16)

我正在使用 docker 运行容器。
我不希望容器能够访问其他容器,但我希望它们仍能使用 等方式进行外部通信apt update

172.17.0.0/16如果我只是像这样阻止,则容器网络是:

iptables -I FORWARD -i docker0 -d 172.17.0.0/16 -j DROP

它可以工作,但是他们无法使用apt update,它找不到从哪里下载,因为它可能从网关出去了。
因此我想允许连接到网关(172.17.0.1),所以我尝试像这样允许它:

iptables -A INPUT -i docker0 -d 172.17.0.1/32 -j ACCEPT
iptables -A OUTPUT -o docker0 -d 172.17.0.1/32 -j ACCEPT

但问题仍然存在,无法使用apt update

Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
  Temporary failure resolving 'archive.ubuntu.com'

仅当我删除阻止规则时它才会再次起作用:

iptables -I FORWARD -i docker0 -d 172.17.0.0/16 -j DROP

答案1

这将允许您停止容器之间的通信:

创建一个禁用 ICC 的网络:

docker network create -o com.docker.network.bridge.enable_icc=false my_secure_bridge

通过创建两个容器进行测试:

docker run --name cnt1 --network=my_secure_bridge -it --rm -d alpine
docker run --name cnt2 --network=my_secure_bridge -it --rm -d alpine
docker inspect cnt1 | grep -i 172
    "Gateway":   "172.19.0.1",
    "IPAddress": "172.19.0.2",
docker inspect cnt2 | grep -i 172
    "Gateway":   "172.19.0.1",
    "IPAddress": "172.19.0.3",

exec 并检查:

docker exec -it cnt1 sh

检查与外界的连通性:

/ # ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=114 time=0.852 ms
64 bytes from 8.8.8.8: seq=1 ttl=114 time=0.990 ms
64 bytes from 8.8.8.8: seq=2 ttl=114 time=0.808 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.808/0.883/0.990 ms

检查与另一个容器的连接:

/ # ping -w 5 172.19.0.3
PING 172.19.0.3 (172.19.0.3): 56 data bytes
--- 172.19.0.3 ping statistics ---
5 packets transmitted, 0 packets received, 100% packet loss

相关内容