iptables 中的 Docker 链覆盖 INPUT 规则

标签 docker iptables

我有一台服务器,并且正在运行一些 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/

相关文章:

docker - 这对 docker 来说正常吗?

docker - 在 Windows 10 Home 中的 WSL 上设置 docker 的问题

python - docker-py getarchive 目标文件夹

routing - Windows 上的数据包重定向

mysql - 无法从docker容器连接到数据库

docker - GCP 负载平衡器 : 502 Server Error, "failed_to_connect_to_backend"

linux - iptables中表的意义

postgresql - 为 Postgresql 打开端口

c - 标记数据包以通过原始套接字发送

linux - 使用 iptables 记录所有到关闭端口的连接