我有一台服务器,并且正在运行一些 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 参数不起作用。
关于iptables 中的 Docker 链覆盖 INPUT 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541274/