在同一主机上有多个GRE隧道,只有一个路由传入的数据包

我在CentOS 6.2(内核2.6.32-220)上遇到路由问题

这是设置:一台主机在我的本地networking上。 它正在和两个几乎相同的远程主机通话。 两台远程主机位于同一networking上,充当彼此的冗余备份。

我从本地主机设置了两个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',但它们没有正确路由到本地networking。 他们只是掉线。 我可以切换这两个指标,然后tunnel1将丢弃所有传入的数据包。 具有较低路由度量的隧道将正确地路由数据包,包括传入和传出。

这是“按devise工作吗?” 当然,我想要发生的情况是两个隧道上的所有数据包都能正确转发。 这可能吗?


快速更新:一个人build议(我不知道为什么)添加'关键'参数到'IP隧道'命令。 我试了这个,每个隧道都有不同的钥匙,两个隧道的钥匙都一样,但是两个都没有效果。

感谢netdev邮件列表,我有一个答案。 有一个我从来没有听说过的function,称为“反向path过滤”。 打开时,如果内核路由function到达接口以外的其他接口,则该内核路由function将静默地丢弃传入的数据包,而传出数据包使用的接口将不会被传输到源地址。 它的目的是作为一个安全function,在大多数情况下是一个很好的默认设置,特别是当你没有仔细设置iptables的时候。

CentOS(大概是RHEL)默认在/etc/sysctl.conf(net.ipv4.conf.default.rp_filter = 1)中打开反向path过滤。 我将下列命令添加到我的设置脚本中:

 echo 0 > /proc/sys/net/ipv4/conf/tunnel1/rp_filter echo 0 > /proc/sys/net/ipv4/conf/tunnel2/rp_filter 

这将closures两个伪接口的反向path过滤,现在一切正常。

请注意,为我的特定接口添加到sysctl.conf对我来说不会有效,因为这些接口是“即时”创build的,并且sysctl.conf仅在引导时读取。 当然,我可以更改sysctl.conf中的默认值,但是我不想为其他接口禁用该function。