我创建了一个网络命名空间,其中一半是 veth 对,另一半位于连接到网桥的根命名空间中。我创建了一条 iptables 伪装规则,如下所示:

sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -o my-br -j MASQUERADE

其中 10.0.0.0/24 是我的网桥的子网。ip route根命名空间中的输出为:

default via 192.168.88.1 dev wlo1 proto dhcp metric 600 
10.0.0.0/24 dev my-br proto kernel scope link src 10.0.0.1 

在网络命名空间内,我可以成功 ping 10.0.0.1 处的网桥以及 192.168.88.198 处的主机。但是,如果我尝试 ping 公共互联网上的某个主机,则我的 ping 不会收到任何回复:

$ sudo ip netns exec my-ns ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
(hangs)

我已启用 IP 转发。

看来我的伪装规则不起作用。我可以通过 tcpdump 看到传出的 icmp 数据包,而没有看到反向的返回数据包:

$ sudo tcpdump -i my-br icmp                            
listening on my-br, link-type EN10MB (Ethernet), snapshot length 262144 bytes
17:43:14.288051 IP 10.0.0.50 > dns.google: ICMP echo request, id 2477, seq 4, length 64
17:43:15.311982 IP 10.0.0.50 > dns.google: ICMP echo request, id 2477, seq 5, length 64
17:43:16.336076 IP 10.0.0.50 > dns.google: ICMP echo request, id 2477, seq 6, length 64

如果我在主机的主网络接口上执行相同操作,则什么也看不到。如果伪装有效,我期望在这里看到一些东西吗?我当时想,如果它有效,我会在这里看到传出的 ICMP 数据包。

$ sudo tcpdump -i wlo1 icmp
listening on wlo1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
(nothing here)

我已经安装了 docker。也许它的 NAT 规则以某种方式干扰了我的设置?我使用的子网 10.0.0.x 似乎与 docker 使用的子网不冲突。我的完整 iptables nat 表是:

$ sudo iptables -t nat --list-rules
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/24 ! -o my-br -j MASQUERADE
-A DOCKER -i docker0 -j RETURN

我真的不知道如何理解上面的内容。这-N DOCKER行代码是否意味着所有内容都已传递到 docker 链?

2

  • 伪装规则是否匹配(计数器是否以iptables -vL ...增量形式显示传出连接)?如果您在规则-J LOG之前添加一条规则MASQUERADE,日志消息会是什么样子?


    – 

  • -N DOCKER行仅创建一个名为 的新链DOCKER。该-J DOCKER行将匹配的流量定向到该链(但如果链中没有任何规则DOCKER匹配,则将继续在父链中执行)。


    – 

0