无法删除 docker 容器的默认 iptables 规则

Can't delete docker container's default iptables rule

如果我输入 iptables -L,输出中会有这一行:

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http-alt

我的容器是公开的,我可以从任何地方请求一个虚拟的 HTTP 服务器(已测试)。我尝试删除该规则,因此只有 80 只暴露在我的服务器内 (localhost:80)。我试过了:

root@ns25252:~# iptables -D DOCKER  --destination 172.17.0.2 -p tcp --dport 80 -j ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).

如错误提示,它找不到匹配的规则。我应该如何键入以删除该行?

通常按编号删除更容易,除非在您列出规则和删除规则之间编号有可能发生变化。

按行号删除的方法如下:

# iptables -L --line-numbers
(snip)
Chain DOCKER (2 references)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http
(snip)
# iptables -D DOCKER 1

或者,您可以通过 iptables -S 获得完整的规范。示例:

# iptables -S
(snip)
-A DOCKER -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j ACCEPT
(snip)

-A 变成 -D 并将其用作 iptables 的参数以删除规则:

# iptables -D DOCKER -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j ACCEPT

注意:令人费解的是,这个答案仍然时不时地得到赞成票。我不知道每个人都在尝试实际完成什么,我只是盲目地回答了一个与 iptables 相关的问题。如果您想启动一个外部世界无法访问的 Docker 容器,那是一个完全不同的话题,并且这不是您的情况的合适答案。 (也许不是 exposing/publishing 端口开始。)

这有点旧,但如果其他人正在寻找如何从你的 iptables 规则中完全删除 docker 我是这样做的,还要记住这是在 debian 上所以你的 files/paths 可能不同。

  1. 编辑您的 /etc/iptables.up.rules 文件,备份文件,然后删除其中包含 docker 的所有内容 - 本地 docker 子网可能还有一些额外的行(我的是 172 .17.x 和 172.19.x) - 全部删除
  2. 刷新 iptables:iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT && iptables -P FORWARD ACCEPT && iptables -F
  3. 重新加载 iptables 规则:iptables-restore < /etc/iptables.up.rules
  4. verify/check 您的规则:iptables -L -n(不应再有任何 docker 链或规则)

如果你已经删除了 docker 包而不只是重新启动 iptables 服务,它将删除默认的 docker iptables-

systemctl 重启iptables.service