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

9
如果我输入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?).

正如错误提示所示,它找不到匹配规则。我应该如何输入以删除这行?
3个回答

11

通常情况下,按编号删除会更容易,除非在您列出规则的时间和删除规则的时间之间存在编号可能会更改的情况。

以下是按行号删除规则的步骤:

# 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容器,那就是完全不同的话题,这不是你情况下的合适答案。(也许从不暴露/发布端口开始?)


4
不仅解决了我的问题,还向我提供了一些关于iptables的好技巧。为了更美好的世界而分享,谢谢! - vdegenne
如何移除-N标志 - Khaled AbuShqear
@Shqear 嗯?什么是-N标志? - sneep
这里开始。如果您运行 sudo iptables -S | grep -i docker,您会得到四个(新的/ -N)docker链。在删除规则之后,我们应该-N-F吗? - Pablo Bianchi
啊,现在我明白了。是的,如果没有其他规则跳转到该链,则-F会起作用。 - sneep

1
这是一篇有点旧的文章,但如果有人想知道如何完全从iptables规则中删除docker,以下是我的做法,也请注意这是在debian上进行的,您的文件/路径可能不同。
  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. 验证/检查您的规则:iptables -L -n (不应再有任何docker链或规则)

-1
如果您已删除了Docker软件包,则只需重新启动iptables服务,它将删除默认的Docker iptables-

systemctl restart iptables.service


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接