如何配置docker的iptables规则DOCKER-USER来限制输出?

How to configure docker's iptables rule DOCKER-USER to restrict output?

我是运行一个容器,我只想让它访问特定的ips。换句话说,我想拒绝大部分目标ips。

我试过以下方法:

iptables -I DOCKER-USER -o custom-interface ! -d xxx.xxx.xxx.xxx -j REJECT

但是它拒绝所有连接,我不能ping xxx.xxx.xxx.xxx

这真的很奇怪,我想我只是通过自定义接口阻止了无法到达 xxx.xxx.xxx.xxx 的输出数据包。所以所有到达 xxx.xxx.xxx.xxx 的传入数据包和输出数据包都被接受。

但我好像错了。为什么?任何帮助表示赞赏。

编辑

接受的答案显示了如何配置呼入限制,然后我学习了如何配置呼出限制。

创建 BEFORE_DOCKER table

iptables -N BEFORE_DOCKER

默认

iptables -I BEFORE_DOCKER -j DROP

Docker 容器 Public 管理员权限(在此处插入所有允许的 IP)

iptables -I BEFORE_DOCKER -o eth0 -d 172.114.1.23 -j ACCEPT
iptables -I BEFORE_DOCKER -o eth0 -d 10.129.172.12 -j ACCEPT

Docker 容器限制 LAN 访问(在此处插入您的 LAN IP 范围或多个 IP)

iptables -I BEFORE_DOCKER -o eth1 -d 192.168.10.1 -j ACCEPT
iptables -I BEFORE_DOCKER -o eth1 -d 192.168.10.2 -j ACCEPT

最后一步是将其作为第一个 table 插入 FORWARD 链。

iptables -I FORWARD -i docker0 -j BEFORE_DOCKER

使用默认规则 REJECT 创建一个 BEFORE_DOCKER table,下一步是将其作为第一个 table 插入 FORWARD 链。

创建 BEFORE_DOCKER table

iptables -N BEFORE_DOCKER

默认

iptables -I BEFORE_DOCKER -j DROP

Docker 容器 Public 管理员权限(在此处插入所有允许的 IP)

iptables -I BEFORE_DOCKER -i eth0 -s 172.114.1.23 -j ACCEPT
iptables -I BEFORE_DOCKER -i eth0 -s 10.129.172.12 -j ACCEPT

Docker 容器限制 LAN 访问(在此处插入您的 LAN IP 范围或多个 IP)

iptables -I BEFORE_DOCKER -i eth1 -s 192.168.10.1 -j ACCEPT
iptables -I BEFORE_DOCKER -i eth1 -s 192.168.10.2 -j ACCEPT

最后一步是将其作为第一个 table 插入 FORWARD 链。

iptables -I FORWARD -o docker0 -j BEFORE_DOCKER

希望对您有所帮助!!

根据 [1],您应该使用 DOCKER-USER 链:

All of Docker’s iptables rules are added to the DOCKER chain. Do not manipulate this chain manually. If you need to add rules which load before Docker’s rules, add them to the DOCKER-USER chain. These rules are applied before any rules Docker creates automatically.

例如,如果您想要阻止 docker0 接口中的所有容器访问 example.com - 您可以这样做:

iptables -I DOCKER-USER -d example.com -i docker0 -j REJECT

[1] https://docs.docker.com/network/iptables/#add-iptables-policies-before-dockers-rules