昨天在模拟器复习NAT实验,对NAT时候要设置默认路由的关系去搜了一下,结果搜到一篇讲NAT和路由先后顺序的实验:http://raulkang.blog.51cto.com/210239/106508 ,看了之后更糊涂了。而且觉得没有必要搞那么复杂的实验,自己用两个路由器实验看看。一开始,在后端的路由器上debug ip pack发现开了nat,收到的包源IP就是nat转换后的IP;关掉NAT,收到的包源IP是未转换的IP。这样看起来,感觉应该是NAT优先级更高。但是,很多帖子(https://learningnetwork.cisco.com/message/55778)讲思科官方文档是先路由后NAT,很不明白。
直到找到这篇:http://hi.baidu.com/gotoccie/blog/item/2064600634fa8d7b020881b8.html,看完就很明白了。
在自己的拓扑中,从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的话,是不可能在路由表中查到对应转发规则的。