当前位置: 首页 > 代码生活 > 正文

遇到一个在linux下无法跨网段发送接收广播包的问题

正在进行的项目中有个网络广播包搜索设备的模块,需要在上位机发送搜索设备的XML命令,然后设备端再发真正的搜索广播包到交换机上所有的连接设备。测试部反馈了一个bug:无法跨网段搜索到设备,同一个网段内,搜索是正常的。对照代码,设备端的发广播包的代码和上位机直接发广播包的代码是一样的。感觉没什么问题,但就是不成功,肯定有问题。因为广播包收、发模块在其它项目一直使用,一直OK,现在出问题了,很郁闷,加上项目deadline快到了,项目经理直接说不能因为这个问题影响了发布。于是只能自己独立广播包模块出来单独测试,专门找此bug。终于一天多的时间,终于解决了问题。

我们的设备有2个网卡,eth0接外网,IP是192段的,eth1是内网,IP是100段的。外网的那个网口连接到上位机,内网的那个网口连接其它的设备。我们测试时却没有见异常,即100段的是可以搜索到192段的设备,原来我们接了一个三层交换机,估计很贵很牛,没啥问题,测试部那边用了普通的交换机,就有问题了,刚碰到这个,直接说是交换机有问题,换一个再试。

但问题还是要解决的。

一开始还以为是双网卡的原因导致广播包不正常,于是上网找,找到的网页没有什么帮助。再查Linux发送广播包,都说不能向255.255.255.255发广播包,要先设置一个网关,才能发。有个论坛上讲了这个问题,我试了,结果没效,再细看,人家是说发不出去,而我是接收不了(后面我才知道的),情况不同。

由于设备用的内核、系统都是我自己(真的是我自己)移植的,可能是哪里配置没搞对,于是拿以前移植根文件系统时使用到的原装正版的ubuntu来启动,结果不行;怀疑网卡问题,分别对2个网口测试,也不行;把代码放到PC的虚拟机ubuntu测试,结果还是不行。

实在没招了,只能抓包分析了,幸好之前已经在设备的系统上安装了tcpdump工具(当初把能想到的工具都安装了,像iperf、hexdump、dos2unix等等),结果发现,eth1能正常发送广播包到255.255.255.255,而连接着交换机的设备也返回的信息到255.255.255.255,能看到设备返回的信息,即是说,在底层来看,广播是可以发送、接收的,一切正常。问题在于应用层的程序接收不了!这样,有理由怀疑是linux系统哪里设置了什么东西,导致广播包传不到应用层。之前搞端口转发时有配置过/etc/sysctl.conf 文件,于是去看看,搜索搜索关键字,结果还真在网上找到资料。这时,已经开始准备解决问题了(其实,当时发现还有个目录/etc/sysctl.d也存放配置。无意间发现有个像是和网络安全有关的文件10-network-security.conf,于是就用里面关键字搜索,说来简单,google都不知道试了多少次)。

原来有个东西叫rp_filter,全称为reverse-path filtering,中文叫“反向路径过滤技术”。它会拒绝和某个网卡上的地址不符合的IP的包,以防止IP欺骗(The rp_filter can reject incoming packets if their source address doesn’t match the network interface that they’re arriving on, which helps to prevent IP spoofing)。从出发点来看是好的,但恰恰它把我想要的广播包给过滤了,比如我本机是100段的IP,连接交换机的设备是192段的,2个地址是不匹配的,于是被过滤了。将这个配置禁止即可。

修改方法有2个,临时生效直接用echo将rp_filter置为0,方法如下:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

如果要永久生效,编辑/etc/sysctl.d/10-network-security.conf文件,将rp_filter赋为0,如下:

# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks.
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

由于项目用的根文件系统已经发布了,不想再搞了,于是就直接用临时生效的方式,反正我用网线直连的方式测试,用测试部当时反馈bug时所用的交换机也测试过,都正常,对其它的网络模块也没什么影响,于是认为,这个问题解决了。

说起来,小弟也没多少斤两,遇到自己不懂的问题,第一反应是问人(不过公司这种气氛,遇到别人也碰到并解决的问题的机会,很少很少),第二反应是上网。真要好好研究研究,好好学习学习,掌握属于自己的技术了。

参考:
技术分析部分文字来自:http://www.cnblogs.com/aHuner/archive/2013/03/11/2954639.html
讲rp_filter的英文帖子:http://www.linuxsecurity.com/content/view/111337/169/

李迟 2015年1月22日 中午

本文固定链接: http://www.latelee.org/code-life/linux-broadcast-cross-netwok.html

遇到一个在linux下无法跨网段发送接收广播包的问题:目前有2 条留言

  1. 1楼
    kx2008:

    我也遇到了类似的问题,但是按照您帖子的方案,还是没成功,是不是方便留个联系方式,请教下,我的QQ号码是7474539,请您不吝指教

    2015-10-20 下午8:06 [回复]
    • 你的具体问题是怎样的?我遇到的是接收不到广播数据,按文中的方法是可以解决的。

      2015-10-21 下午4:13 [回复]

发表评论

*

快捷键:Ctrl+Enter