Linux多网卡收不到组播流,Linux下多网卡组播接收不到数据的问题

一、现象:tcpdump有包,协议栈收不到。即select超时返回0。

系统:

[root@ahuner /]# cat /etc/issue

CentOS release 6.3 (Final)

Kernel \r on an \m

[root@ahuner /]# cat /proc/version

Linux version 2.6.32-279.el6.x86_64

二、原因:reverse-path filtering,反向路径过滤技术,系统在接收到一个IP包后,检查该IP是不是合乎要求,不合要求的IP包会被系统丢弃。该技术就称为rp filter.

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. Turning this on, however, has its consequences: If your host has several IP addresses on different interfaces, or if your single interface has multiple IP addresses on it, you’ll find that your kernel may end up rejecting valid traffic. It’s also important to note that even if you do not enable the rp_filter, protection against broadcast spoofing is always on. Also, the protection it provides is only against spoofed internal addresses; external addresses can still be spoofed.. By default, it is disabled.

其内核参数:

rp_filter - INTEGER

0 - No source validation.

1 - Strict mode as defined in RFC3704 Strict Reverse Path

Each incoming packet is tested against the FIB and if the interface

is not the best reverse path the packet check will fail.

By default failed packets are discarded.

2 - Loose mode as defined in RFC3704 Loose Reverse Path

Each incoming packet's source address is also tested against the FIB

and if the source address is not reachable via any interface

the packet check will fail.

Current recommended practice in RFC3704 is to enable strict mode

to prevent IP spoofing from DDos attacks. If using asymmetric routing

or other complicated routing, then loose mode is recommended.

The max value from conf/{all,interface}/rp_filter is used

when doing source validation on the {interface}.

Default value is 0. Note that some distributions enable it

in startup scripts.

三、方案:

系统配置文件

1. /etc/sysctl.conf

把 net.ipv4.conf.all.rp_filter和 net.ipv4.conf.default.rp_filter设为0即可

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

设置完后,会更新内核(实时的内存)中的变量的值,但不会修改sysctl.conf的值

3. 使用/proc文件系统

查看 cat /proc/sys/net/ipv4/conf/all/rp_filter

设置 echo "0" >/proc/sys/net/ipv4/conf/all/rp_filter

使配置立即生效:

/sbin/sysctl -p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值