组播,广播,多网口问题
问题
机器有多个网口,其中有一网口用来接收组播的数据, 使用 tcpdump -i [网口] udp port 2000 -nn 抓包,显示该网口有过来的udp包,但是应用程序一直接受不到
分析
数据包从网络中过来的时候,网口是接收到了数据包,但是应用程序没有接收到,就是数据包在走协议栈的过程中因为一些设置别丢。查看UDP组播发来的数据包源IP地址为:组播的IP
比如组播服务器地址: 192.9.200.102
网口 ip为: 192.9.200.10
, 监听的组播ip为:224.9.200.5
接收到的数据包 地址为 192.9.200.102
->224.9.200.5
查看路由表:
当前路由显示:除了192.9.200.0
网段的包走网口 enp1s0f0,其余的都走网口 enp1s0f2
解决方法
1.配置路由
## 让网段 224.9.200.3的IP走enp1s0f0网口
route add -net 224.9.200.3 netmask 255.255.255.255 dev enp1s0f0
2.取消内核对原地址的校验
1) 修改配置文件 /etc/sysctl.conf
## 添加或修改
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
2) 命令行临时修改
## 显示一个内核变量
sysctl net.ipv4.conf.all.rp_filter
## 设置一个内核变量
sysctl -w net.ipv4.conf.all.rp_filter=0
3) 修改文件系统 /proc
## 查看
cat /proc/sys/net/ipv4/conf/all/rp_filter
## 设置
echo "0" >/proc/sys/net/ipv4/conf/all/rp_filter