我在CentOS 6.2上遇到路由问题(内核2.6.32-220)
这是设置:一台主机在我的本地网络上.它在说话
到远程位置的两个几乎相同的主机.两个遥控器
主机位于所有相同的网络上,充当冗余备份
对于彼此.
我从本地主机设置了两个GRE隧道,每个隧道一个
远程主机:
ip tunnel add name tunnel1 mode gre local 10.2.1.2 remote 10.2.1.1 ip link set dev tunnel1 up ip route add 172.16.1.0/24 dev tunnel1 metric 101 ip tunnel add name tunnel2 mode gre local 10.2.1.4 remote 10.2.1.3 ip link set dev tunnel2 up ip route add 172.16.1.0/24 dev tunnel2 metric 102
传出的数据包路由正常,没问题.传入的数据包
很奇怪.似乎无论哪条隧道都有这条路线
具有更高的度量(上例中的tunnel2)将
忽略传入的数据包他们没事,也可以
用’tcpdump -i tunnel2’在本地机器上看到,但是他们
没有正确路由到本地网络.他们很简单
下降.我可以切换两个指标,然后是tunnel1
丢弃所有传入的数据包隧道路线较低
metric将正确地路由数据包,包括传入和传出.
这是“按设计工作吗?”我想发生什么,
当然,两个隧道上的所有数据包都是正确的
转发.这可能吗?
快速更新:一个人建议(我不知道为什么)在’ip tunnel’命令中添加’key’参数.我试过这个,每个隧道都有不同的密钥,两个隧道都有相同的密钥,但两个试验都没有效果.
解决方法
感谢netdev邮件列表,我有一个答案.有一个我从未听说过的功能,称为“反向路径过滤”.打开时,如果传入的数据包到达除了将由传出数据包用于源地址的接口以外的接口,则此内核路由功能将静默地丢弃传入的数据包.它旨在作为安全功能,在大多数情况下是一个很好的默认设置,特别是当您没有仔细设置iptables时.
CentOS(可能是RHEL)默认在/etc/sysctl.conf(net.ipv4.conf.default.rp_filter = 1)中打开反向路径过滤.我在设置脚本中添加了以下命令:
echo 0 > /proc/sys/net/ipv4/conf/tunnel1/rp_filter echo 0 > /proc/sys/net/ipv4/conf/tunnel2/rp_filter
这将关闭两个伪接口的反向路径过滤,现在一切正常.
请注意,为我的特定接口添加到sysctl.conf对我来说不起作用,因为这些接口是“动态”创建的,并且sysctl.conf仅在引导时读取.当然,我可以更改sysctl.conf中的默认值,但我不想为其他接口禁用该功能.