在veth上收到的UDP数据包,被tcpdump捕获,被iptables接受,但未转发到netcat

我有两个名称空间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服务器的原因?

iCMS 回答:在veth上收到的UDP数据包,被tcpdump捕获,被iptables接受,但未转发到netcat

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2055351.html

大家都在问