Docker的NAT表输出链式规则

标签 docker iptables nat

我正在尝试理解 iptables 中的规则之一:

$ sudo iptables -t nat  --list -v
...

Chain OUTPUT (policy ACCEPT 618 packets, 31267 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  any    any     anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

...

所以这条规则试图匹配目标地址类型“LOCAL”而不是在 127.0.0.0/8 的范围内?

那么它会匹配什么地址? 这条规则的目的是什么?

谢谢!

最佳答案

此规则将匹配源自本地计算机的所有数据包(因为它在 OUTPUT 链中),目的地为本地托管的 IP 地址,该地址不以 127.X.X.X。此类数据包将移交给 DOCKER 链进行进一步处理。

不以 127.X.X.X 开头的本地托管 IP 地址与为机器接口(interface)定义的每个 IP 地址匹配。这也包括动态定义的 IP 地址,例如通过 DHCP 分配的 IP 地址。

可以通过执行命令ip route show table local type local提取机器本地托管的IP地址。


为了检查该规则实际匹配了哪些 IP 地址,可以在 DOCKER 链的开头添加一条日志记录规则,如下所示:

sudo iptables -t nat -I DOCKER -m limit --limit 2/min -j LOG --log-level 4 --log-prefix 'DOCKER CHAIN '

匹配的数据包将记录在文件/var/log/syslog中。

关于Docker的NAT表输出链式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963362/

相关文章:

mysql - 我应该如何从主机访问命名卷?

java - 如何使用谷歌云数据存储模拟器和java实现docker镜像

iptables - libvirt iptables 规则中断到我的 KVM 虚拟机的端口转发

node.js - Vagrant、nodejs 和 iptable 端口转发

windows - 删除-netnatstaticmapping : The requested operation is not supported. 尝试删除 Windows docker 容器端口映射时

shell - 当 splunk 第一次在 docker 容器中启动时,是否可以跳过许可协议(protocol)页面?

windows - Windows Redis客户端连接到Docker服务器失败

linux - 强制原始数据包通过 iptables

azure - 应用服务上的内部负载均衡器在配置了 NAT 网关后是否仍执行 SNAT?

azure - 如何创建允许连接的客户端在 Internet 上显示为静态 IP 地址的 Azure 点到站点 VPN