与 veth 交谈

与 veth 交谈

我用利廷斯(它使用 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。我不想冒犯您,我只是陈述显而易见的事实,以防万一。

相关内容