我有两个名称空间srv1和srv2,它们通过带有veth对的软交换机(p4 bmv2)互连。软交换仅执行简单的转发。命名空间中的第ve个接口分配有IP地址(分别为192.168.1.1和192.168.1.2)。我可以使用这些IP地址在两个名称空间之间ping:
sudo ip netns exec srv1 ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=1.03 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=1.04 ms
但是当我尝试使用netcat时,我不会在服务器端收到消息:
客户端:
sudo ip netns exec srv1 netcat 192.168.1.2 80 -u
hello!
服务器:
sudo ip netns exec srv2 netcat -l 80 -u
接口以正确的格式接收数据包。我在两个名称空间上都使用tcpdump进行了验证,我看到了正确发送和接收的数据包:
客户端:
sudo ip netns exec srv1 tcpdump -XXvv -i srv1p
[sudo] password for simo:
tcpdump: listening on srv1p,link-type EN10MB (Ethernet),capture size 262144 bytes
^C06:09:41.088601 IP (tos 0x0,ttl 64,id 14169,offset 0,flags [DF],proto UDP (17),length 35)
192.168.1.1.55080 > 192.168.1.2.http: [bad udp cksum 0x8374 -> 0x5710!] UDP,length 7
0x0000: 00aa bbcc dd02 00aa bbcc dd01 0800 4500 ..............E.
0x0010: 0023 3759 4000 4011 801d c0a8 0101 c0a8 .#7Y@.@.........
0x0020: 0102 d728 0050 000f 8374 6865 6c6c 6f21 ...(.P...thello!
0x0030: 0a .
1 packet captured
1 packet received by filter
0 packets dropped by kernel
服务器:
sudo ip netns exec srv2 tcpdump -XXvv -i srv2p
tcpdump: listening on srv2p,capture size 262144 bytes
^C06:09:41.089232 IP (tos 0x0,length 7
0x0000: 00aa bbcc dd02 00aa bbcc dd01 0800 4500 ..............E.
0x0010: 0023 3759 4000 4011 801d c0a8 0101 c0a8 .#7Y@.@.........
0x0020: 0102 d728 0050 000f 8374 6865 6c6c 6f21 ...(.P...thello!
0x0030: 0a .
1 packet captured
1 packet received by filter
0 packets dropped by kernel
我在srv2 iptable规则上添加了端口80上的accEPT udp数据包和LOG:
sudo ip netns exec srv2 iptables -t filter -A INPUT -p udp --dport 80 -j accEPT
sudo ip netns exec srv2 iptables -I INPUT -p udp --dport 80 -j LOG --log-prefix " IPTABLES " --log-level=debug
我可以看到条目上的统计信息正在增加,并且正在/var/log/kern.log上记录的数据包增加了,但该消息从未触及到netcats侦听器。
sudo ip netns exec srv2 iptables -L -n -v
Chain INPUT (policy accEPT 0 packets,0 bytes)
pkts bytes target prot opt in out source destination
1 33 LOG udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:80 LOG flags 0 level 7 prefix " IPTABLES "
4 133 accEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:80
Chain FORWARD (policy accEPT 0 packets,0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy accEPT 0 packets,0 bytes)
pkts bytes target prot opt in out source destination
内核日志:
kernel: [581970.306032] IPTABLES IN=srv2p OUT= MAC=00:aa:bb:cc:dd:02:00:aa:bb:cc:dd:01:08:00 SRC=192.168.1.1 DST=192.168.1.2 LEN=33 TOS=0x00 PREC=0x00 TTL=64 ID=51034 DF PROTO=UDP SPT=48784 DPT=80 LEN=13
当我用网桥替换软交换机时,netcat可以工作。我认为软交换可能会正确处理数据包,但tcpdump显示正确的格式。 UDP校验和不正确,但是它是从源服务器生成的,并且无论如何使用linux网桥都是一样的,但是在这种情况下它可以工作。是否有办法知道这些数据包未到达netcat服务器的原因?