在Linux下接收广播UDP包

我有类似的问题Linux内核不通过多播UDP数据包只广播而不是多播,没有我已经尝试了帮助。

我在192.168.0.1上有一个设备,它将直接连接到eth1(192.168.0.2)的广播UDP数据包喷出。 eth0是我真正的networking。 ifconfig告诉我广播地址,正如所料,是192.168.255.255

$ sudo ifconfig eth0 Link encap:Ethernet HWaddr 54:04:a6:64:b5:a6 inet addr:172.16.128.1 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::5604:a6ff:fe64:b5a6/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1526809 errors:0 dropped:0 overruns:0 frame:0 TX packets:986480 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:807179430 (807.1 MB) TX bytes:747692150 (747.6 MB) eth1 Link encap:Ethernet HWaddr 00:50:b6:15:6e:9a inet addr:192.168.0.2 Bcast:192.168.255.255 Mask:255.255.0.0 inet6 addr: fe80::250:b6ff:fe15:6e9a/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:544315 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:572619380 (572.6 MB) TX bytes:77544 (77.5 KB) 

tcpdump证实我有数据击中端口。

 $ sudo tcpdump -c 4 -l -n -i eth1 'udp and port 61440' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 09:24:51.101619 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024 09:24:51.103980 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024 09:24:51.106205 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024 09:24:51.108584 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024 4 packets captured 114 packets received by filter 0 packets dropped by kernel 

但是,从我尝试实际挑选这些数据包的任何事情来看,无论我是以用户身份还是以root身份运行这些数据包,都有无线电沉默。

 $ nc -lu 192.168.255.255 61440 $ socat UDP4-RECV:61440,reuseaddr,bind=192.168.255.255 STDOUT,nonblock=1 

还尝试编写我自己的C和我自己的Python。 纳达。 所有这一切都是偷窃我的数据包。 任何想法是什么? Ubuntu 14.04。

编辑添加:没有运行防火墙。 ufw报告不活动,iptables将所有3个表格报告为纯粹的ACCEPT。

我也试着让netcat和socat绑定255.255.255.255的总体广播地址,或者eth1本地地址192.168.0.2。 没有收到任何数据包的尝试。

路由表没有显示出与众不同的地方:

 $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0 172.16.0.0 0.0.0.0 255.255.0.0 U 1 0 0 eth0 192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1 

我知道networking接口工作正常。 如果我断开这个设备,并连接一个不同的types(试图DHCP),它成功地连接到dnsmasq实例,并得到正确的分配。

有趣的是,要求socat给我原始的IP数据包就可以了:

 $ sudo socat IP4-RECVFROM:17 STDOUT | hexdump 0000000 0000 00f0 0804 4bb1 6463 6665 6867 6a69 0000010 6c6b 6e6d 606f 6261 6463 6665 6867 6a69 * 0000408 

最终编辑:

进入并更深入地观察数据包,看起来他们的校验和不好。 我认为他们没有通过UDP协议栈传递,因此。 我也没有时间来解决这个问题的优雅解决scheme,并决定通过打开一个原始IP数据包上的套接字并自行过滤来暴力破解。 谢谢大家的帮助

当我手动build立一个辅助networking接口,并且没有为该接口正确设置路由时,我遇到了类似的问题。

尝试运行: route -n并查看eth1的路由configuration是什么。

以下是用于testing我以前使用的UDP连接的Python脚本:

 import socket #---socket creation connexion = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #---Bind try: connexion.bind(('', 10015)) except socket.error: print "connexion failed" connexion.close() sys.exit() #---testing while 1: data, addr = connexion.recvfrom(1024) print "messages : ",addr , data 

可以在shell提示符下input以下内容来testing发送消息

 echo -n "TEST MESSAGE" >/dev/udp/127.0.0.1/10015 

从本地testing到本地主机将是第一个故障排除步骤,然后从另一台计算机到有问题的计算机。