首页 > Operation System > ip_forward的诡异问题

ip_forward的诡异问题

2013年4月25日 发表评论 阅读评论

今天碰到一个奇怪问题:
办公网一个私网段不能访问idc的私网
我们的办公网和idc私网之间是打的lan2lan的gre的tunnel
具体情况是:
办公网一台机器A,ip是10.0.0.2,不能访问idc私网的一台机器B,ip是10.0.1.2
我在办公网打隧道的那台机器C(ip是10.0.2.2)的私网网卡上听包,有从10.0.0.2到10.0.1.2的icmp的包,但没有回来的。
同样在C上的gretun(gre tunnel的设备)上听包听不到(正常是应该有的)。

ip ro sh

在C上看了下路由表,有到10.0.1.2段的路由,而且正确。但是没有到10.0.0.2所在段的路由。于是我死马当活马医,

ip ro ad 10.0.0.0/24 via 10.0.2.1

,然后再在C上的gretun听包,发现这回有从10.0.0.2到10.0.1.2的icmp包了。
这里我不是要解决这个问题,解决问题简单,我想要知道的是为什么,为什么包转发的那台机器C上,一定要有icmp包的源地址路由之后,才能被正确转发呢?我理解应该是某个kernel参数限定了,只有源地址可达的包,才会被正确处理,否则就丢弃。
搞明白了,应该是rp_filter这个kernel参数的问题,当rp_filter为1的时候(C机器恰好如此),

sysctl -a | grep rp_filter

会做严格的源地址校验,发现icmp包的源地址10.0.0.2不可路由,所以被认为是ip地址欺骗,故而直接被丢弃。

分类: Operation System 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.