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

摘自:http://www.cnblogs.com/aHuner/archive/2013/03/11/2954639.html

一、现象: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

参考:
http://hi.baidu.com/hexie007/item/bf7d19fabcae221ba62988f0
http://www.cnblogs.com/huazi/archive/2013/02/25/2932021.html
http://latteye.com/2009/04/linux-sysctl-rp_filter-%E8%A7%A3%E9%87%8A.html

 

你可能感兴趣的:(version,NetWork,interface,Address,release)