- 论坛徽章:
- 0
|
之所以ICMP报文没有发送出去应该是跟ARP有关系的。
ip neigh ls 看看结果。
基本流程是这样子的:
ping报文到了网关,MAC地址是网关自己,因此br0收到这个报文,从而交给上层也就是IP层处理,IP层处理之后,找路由找到eth0,创建路由缓存,但是此时并没有对应WAN侧设备的ARP信息,因此创建一个邻居节点,将这个邻居节点和这条路由缓存关联起来,但是没有获取到ARP,所以,发送ARP请求出去,也就是通过eth0发送ARP请求出去,这个请求的响应被网关eth0收到,本来这个请求的skb->dev指向的是eth0的,结果因为eth0又被加到桥里面去了,因此,使得这个请求被桥处理之后skb->dev变成了br0了,然后送给上层处理,此时,因为ARP请求是从eth0发出去的,但是结果回应却在ARP层看来是从br0收到的,而实际上内核创建一个邻居节点的时候需要两个条件: dev 以及 MAC地址,因此这样skb->dev变成了br0,从而导致匹配不上,从而导致ARP从eth0发送出去之后没有dev匹配不上,而导致没有响应,认为目的不可达,也就是eth0并没有学到WAN侧设备的MAC地址,而是认为可以通过br0到达,所以,你最终看到结果是学习到了ARP,但是是br0学习到的,而不是eth0学习到的,使用 ip neigh ls 就可以很清楚的知道, arp -a 显示出来内容不够细致。
说了这么多,自己都觉得有点罗嗦了,不知道解决了你的疑问么。
[ 本帖最后由 kevert 于 2009-3-23 22:17 编辑 ] |
|