现象:
centos 6或7上配置两块(或者多块)网卡,如果默认网关配置在eth1(ip1)上,则通过另外一块网卡(如eth2(ip2))访问该主机就是访问不了的;但是,如果在eth2上做一个桥br2(ip2),该主机上面的虚拟机桥接该网卡,并且虚拟机的ip地址为ip3,则从其它主机上虽然访问不了ip2,但是可以访问ip3,就是说,访问虚拟机是正常的
调试:
- ping ip2 的时候,在eth2上是可以用tcpdump抓到数据包的,显示,服务器收到了数据包,但是出于某种原因,服务器没有回包
- 在服务器上使用ping -I eth2 ipx(这里假定其它主机的ip地址为ipx),eth2上没有数据包出现,显然,出于某种原因,服务器根本没有发包出去
- 两块网卡配置没有太多差异,唯一的差异就是默认网关在谁身上,默认网关很大程度上(不完全)表现在默认路由上,好吧,把默认路由删掉,给ipx单独添加一条路由,结果对上述测试没有任何影响
分析:
- 应该和服务器本身有关系,和其他外部的设备都没有关系
- 应该和内核有关系吧(晕,不好猜吧)
查资料:
- 发现和一个叫做 rp_filter的内核参数似乎有关系,修改如下:
12sysctl -w net.ipv4.conf.all.rp_filter=0sysctl -w net.ipv4.conf.eth2.rp_filter=0
结果: 好了
参考资料: http://blog.csdn.net/cybertan/article/details/9087829说明:
- 两个配置都需要,如果其中一个为1,则内核就参考谁
- 如果是br2桥接到eth2上的情况,访问br2是否正常则和eth2的该配置没关系,需要设置br2的该参数
关于rp_filter:
rp_filter : BOOLEAN
默认值为False
- 1 – 通过反向路径回溯进行源地址验证(在RFC1812中定义)。对于单网卡主机和stub网络路由器推荐使用该选项。
- 0 – 不通过反向路径回溯进行源地址验证。
- 默认值为0,但某些发布在启动时自动将其打开。 (router默认会路由所有东西﹐就算该封包’显然’不属於我们的网路的。常见的例子﹐莫过於将私有 IP 泄漏到 internet 上去。假如某个网卡﹐其上设定的网络地址段為
195.96.96.0/24﹐那么理论上不会有212.64.94.1 这样的地址段封包会到达这个网卡上。许多人都不想转发非本网段的数据包﹐因此核心设计者也打开了方便之门。在 /proc 裡面有些档案﹐透过它们您可以让核心為您做到这点。此方法被称為 “逆向路径过滤(Reverse Path Filtering)”。基本上﹐假如对此封包作出的回应﹐不是循其进入的网卡送出去﹐那它就被置之不理。)