![与 veth 交谈](https://linux22.com/image/754844/%E4%B8%8E%20veth%20%E4%BA%A4%E8%B0%88.png)
我用利廷斯(它使用 Pcap)捕获链路层数据包并转发到实际应用程序运行的网络命名空间。
Client(Browser) -> Server -> Pcap -> Pcap Send -> br0 (Bridge) -> Namespace -> Application
现在,我看到数据包已被转发并在 Tcpdump 快照上可见,但我没有看到它们被应用程序本身接收,也没有传出数据包的迹象。
看起来命名空间中的环回接口也没有收到数据包,因此看起来内核由于某种原因没有将数据包路由到环回。
我相信应用程序默认监听环回接口,并且根据我的假设,它是本地主机运行的地方。
我尝试将应用程序绑定到命名空间中的 veth0 网络接口的 IP,但是也不起作用。
我可以 ping 网络命名空间内的任何网站。
关于校验和,TCP Dump 显示数据包具有正确的校验和
以下是我设置网络命名空间的方法,
sysctl -w net.ipv4.ip_forward=1 &&
sysctl -w net.ipv6.conf.all.forwarding=1 &&
ip netns add namespace1 &&
ip link add veth0 type veth peer name veth1 &&
ip link set veth0 netns namespace1 &&
ip netns exec namespace1 ip addr add 192.168.1.11/24 dev veth0 &&
ip link add name br0 type bridge &&
ip link set br0 up &&
ip link set veth1 up &&
ip netns exec namespace1 ip link set veth0 up &&
ip netns exec namespace1 ip link set lo up &&
ip link set veth1 master br0 &&
ip addr add 192.168.1.10/24 brd + dev br0 &&
ip -all netns exec ip route add default via 192.168.1.10 &&
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
下面是 TCP Dump 在网络命名空间捕获的数据包示例,
16:50:11.742116 IP (tos 0x2a,ECT(0), ttl 115, id 8487, offset 0, flags [DF], proto TCP (6), length 52)
MYHOMEIP.51202 > SERVERIP.https: Flags [SEW], cksum 0x59a4 (correct), seq 332112346, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
以下是ss -lntp
命名空间的输出,
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 *:443 *:* users:(("node",pid=30798,fd=20))
LISTEN 0 511 *:7000 *:* users:(("node",pid=30798,fd=19))
查看输出,我看到 Send Q 填充了 511,但我不确定这意味着什么。
下面的答案没有添加任何新内容并且没有解决我的问题。
我很想颁发赏金但找不到按钮。
显然,A类似问题几年前就已经在这个网站上提出过这个问题,但没有人成功提供可行的解决方案。
答案1
与 veth 交谈
您的确切命令在我的系统上运行良好。
以下是我检查过的内容:
man nc
ip netns exec namespace1 nc -l 192.168.1.11 8123
现在在远程客户端上:
ip ro add 192.168.1.11/32 via SERVERIP
echo MyTestData | nc -v 192.168.1.11 8123
与环回对话
不过,您说的是环回。显然不适用于 127/8,因此我准备了路由:
ip netns exec namespace1 ip a add 192.168.2.2 dev lo
ip ro add 192.168.2.2/32 via 192.168.1.11
现在在远程客户端上:
ip ro add 192.168.2.2/32 via SERVERIP
echo MyTestData | nc -v 192.168.2.2 8123
话虽如此,还有一个警告。你似乎来自网络管理员背景。服务器不是路由器,因此在应用服务器上,除了 127/8“流量到自身”之外,使用环回是一种非常不常见的做法。客户端应该与 eth/veth 对话。
但我不能告诉所有客户端添加路线
看看您之前的问题(现已删除),关于在客户端与“公共”IP 对话时内核应该如何处理路由,我想提醒大家注意 DNAT。(这是 MASQUERADE 的另一个功能。您经常将 DNAT 与 MASQUERADE 一起使用。)
因此,ip ro add
您无需接触客户端,即可执行 DNAT。我不想冒犯您,我只是陈述显而易见的事实,以防万一。