docker - iptables 中的 DOCKER 链如何工作?
问题描述
我是码头工人的新手。
最近我经历了一些奇怪的情况。
我在 OCI(Oracle 云基础设施)中创建了 ubuntu 实例。
当我在这个 ubuntu 实例中启动 nginx 进程时,从外部网络访问失败。
当我使用 docker 容器启动 nginx 时,从外部网络访问成功。
经过一番搜索,我发现 iptables 中的 INPUT 链不允许 tcp 80。
此外,docker 将更新我的 iptables 以在 PREROUTING 链中添加规则。
这是命令的结果sudo iptables -nL -t nat
。
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
但是正如您在 DOCKER 链中看到的那样,我认为 RETURN 规则总是比 DNAT 规则更早应用。
这意味着,DOCKER 链不做任何事情!
任何人都可以对此作出任何解释吗?
一种可能的假设是,无论规则的顺序如何,最后都会应用 RETURN 规则。(但我不确定这是不是真的)。
谢谢!
解决方案
RETURN 规则实际上会首先应用,但并不意味着忽略其他规则。还有另外两个变量 IN 和 OUT 描述规则的输入和输出。
您可以添加-v
到命令中以显示它。
$ iptables -nL -v -t nat
......
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
12 720 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
1691 107K DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8601 to:172.17.0.2:8601
......
推荐阅读
- c++ - 带get函数的无限循环
- entity-framework - WebApi 支持 Range 请求,无需多次查询数据库
- firebase - Firebase 功能问题?
- javascript - 如何将脚本导入 .vue 文件?
- heroku - 如何在 Heroku 中使用 JavaSpark 部署 WebApplication,该 JavaSpark 具有用于 WebComponents 的 StaticFilesFolder
- c - extra spaces written in r+ mode
- corda - 如何获得两个参与者之间的数字签名,其余的只能看到账本更新而没有获得签名?
- dart - 使扩展的 FAB 居中
- vba - 单击带有复选框的命令按钮时清除文本框-VBA
- glusterfs - 更改卷类型后 Gluster 卷大小变得不同