Docker iptables 中的链覆盖 INPUT 规则

Docker chain in iptables overrides INPUT rules

我有一台服务器,我是运行几个docker容器。这些容器有几个未打开的端口。我添加了 INPUT 规则以仅允许从 1 个 ip 访问这些端口,然后我有一个 DROP 规则。

这应该会阻止除我的家庭 ip 以外的所有端口访问。现在事实证明 docker 只允许所有内容,并且 docker 以某种方式能够覆盖输入规则,因为输入规则不起作用。

我认为这与 FORWARDING 规则有关,如下所示:

Chain FORWARD (policy ACCEPT) target prot opt source destination DOCKER-USER all -- anywhere anywhere DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhereACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere

我已经刷新了所有规则,然后我从 docker 中得到了非常奇怪的错误,例如:

driver failed programming external connectivity on endpoint gogs (b62814647bf440e923c009da0ca76185fac2f89a9534eb11792dbcb07ef3ffbf): (iptables failed: iptables --wait -t filter -A DOCKER ! -i br-5dd41982af68 -o br-5dd41982af68 -p tcp -d 172.18.0.6 --dport 3000 -j ACCEPT: iptables: No chain/target/match by that name.

如何确保输入规则覆盖所有内容,以便 INPUT 链上的端口过滤停止除我以外的其他人的访问?

我找到了答案。事实证明,INPUT 链被跳过,FORWARDING 链被用于 docker。 FORWARDING 链的第一条规则是读取 DOCKER-USER 链。该链将包含 docker 未被 docker 覆盖的规则。

假设您想让您的家庭 ip 访问某些端口并为其他人阻止它们。使用这 2 条规则:

iptables -A DOCKER-USER -i eth0 -s YOURIP -p tcp -m conntrack --ctorigdstport 8000:10000 -j ACCEPT
iptables -A DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 5000:9999 -j DROP

您还需要使用 ctorigdstport 参数,因为正在进行一种形式的 nat 转换,而 dport 参数将不起作用。