无法删除 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 可能不同。
- 编辑您的
/etc/iptables.up.rules
文件,备份文件,然后删除其中包含 docker 的所有内容 - 本地 docker 子网可能还有一些额外的行(我的是 172 .17.x 和 172.19.x) - 全部删除
- 刷新 iptables:
iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT && iptables -P FORWARD ACCEPT && iptables -F
- 重新加载 iptables 规则:
iptables-restore < /etc/iptables.up.rules
- verify/check 您的规则:
iptables -L -n
(不应再有任何 docker 链或规则)
如果你已经删除了 docker 包而不只是重新启动 iptables 服务,它将删除默认的 docker iptables-
systemctl 重启iptables.service
如果我输入 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 可能不同。
- 编辑您的
/etc/iptables.up.rules
文件,备份文件,然后删除其中包含 docker 的所有内容 - 本地 docker 子网可能还有一些额外的行(我的是 172 .17.x 和 172.19.x) - 全部删除 - 刷新 iptables:
iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT && iptables -P FORWARD ACCEPT && iptables -F
- 重新加载 iptables 规则:
iptables-restore < /etc/iptables.up.rules
- verify/check 您的规则:
iptables -L -n
(不应再有任何 docker 链或规则)
如果你已经删除了 docker 包而不只是重新启动 iptables 服务,它将删除默认的 docker iptables-
systemctl 重启iptables.service