[原]有关NAT和路由之间的先后顺序

    在自己的拓扑中,从inside的pc上ping单个包测试, 前端配置了NAT的路由器上,debug ip pack, debug ip nat 输出:

 

*Mar  1 01:28:32.728: IP: tableid=0, s=172.16.8.5 (Ethernet0/0), d=63.19.6.1 (Ethernet1/0), routed via FIB

   先查FIB确定出口

*Mar  1 01:28:32.728: NAT: s=172.16.8.5->200.1.8.7, d=63.19.6.1 [37411]

   可以理解为在去出口的路上,发现配置了NAT,把源IP替换掉

*Mar  1 01:28:32.728: IP: s=200.1.8.7 (Ethernet0/0), d=63.19.6.1 (Ethernet1/0), g=200.1.8.8, len 48, forward

   替换源IP后,继续转发包

*Mar  1 01:28:32.732: NAT*: s=63.19.6.1, d=200.1.8.7->172.16.8.5 [37411]

   返回的应答包,目的IP替换回当初发送时对应的源IP

   然后再查路由表转发,因为这里ping的机器是直连,所以没有这步

 

   在后端路由器上 debug ip pack的输出:

 

*Mar  1 01:28:32.928: IP: tableid=0, s=200.1.8.7 (Ethernet1/0), d=63.19.6.1 (Ethernet0/0), routed via RIB

*Mar  1 01:28:32.933: IP: s=200.1.8.7 (Ethernet1/0), d=63.19.6.1, len 48, rcvd 4

   收到ping包

*Mar  1 01:28:32.933: IP: tableid=0, s=63.19.6.1 (local), d=200.1.8.7 (Ethernet1/0), routed via FIB

*Mar  1 01:28:32.937: IP: s=63.19.6.1 (local), d=200.1.8.7 (Ethernet1/0), len 48, sending

   应答ping包

 

先查路由表确定出口,因为目的地址是确定的并且直接决定出口。找到出口后,如果有NAT就替换源IP,如果没有NAT就不替换。所以,之前看到的开NAT就替换不开NAT就不替换,并不是NAT优先级更高,而是NAT处于路由转发之后,更接近出口的缘故。

 

这是NAT从内向外,先查路由再NAT的顺序。从外向内的方向,顺序相反。因为从外向内的包,如果不先NAT把目的IP替换为内部IP的话,是不可能在路由表中查到对应转发规则的。