NAT和路由,谁先谁后

版权声明:我已加入“维权骑士”(rightknights.com)的版权保护计划,所有知乎专栏“网路行者”下的文章均为我本人(知乎ID:弈心)原创,未经允许不得转载。

在我迄今10年的网络从业生涯中(新加坡7年,沙特3年),参与过不计其数的网络设计和运维项目,项目规模大大小小的都有,接触过无数和NAT相关的配置和排错,什么静态NAT、动态NAT、端口映射还有PAT在不同厂商的设备上都实操过(思科的居多)。 我发现一个问题:虽然作为每一位网工必修课的NAT技术很常用,大多数网工都会照着厂商给的配置手册或者设备上现成的running config改配置,但是真正钻研过这项技术,遇到问题时会排错的人真的不多。

我在现在工作的地方--沙特阿卜杜拉国王科技大学(KAUST)担任IT网络运维组二把手时面试过不少求职者,这些求职者当中不乏工作经验8年以上,手握3个,4个,5个甚至更多的CCIE“大牛"们。技术面试环节中有一道题我是必问的:一台配置了NAT的思科路由器是先执行路由选择(Routing),还是先执行NAT? 我听到过的答案五花八门,至今没有一个人能给我一个完全正确的回答。

在给出正确答案之前,我先出一道题:

问题背景:

某公司A和某公司B最近开始有业务往来,要求公司A的主机192.168.11.1和公司B的主机192.168.44.4能够通信。网络拓扑如下

由于公司A和公司B的内网都是用192.168.0.0 /16网络,这里必须用NAT来解决主机A到主机B的通信问题。因为公司B没有驻场网络工程师,所以负责这个项目的公司A的网工选择在自家公司的路由器R2上配置NAT(这里默认R1,R2,R3,R4都是跑IOS的思科路由器)。NAT配置的要求如下:

  • 公司A的192.168.11.1(主机A)在进入公司B的内网前,需要在R2上被转换成172.16.23.1
  • 公司B的192.168.44.4(主机B)在进入公司A的内网前,需要在R2上被转换成192.168.1.4

根据上述需求,公司A的网工在R2上完成了配置,现在R2的NAT配置以及R2的路由表如下:

配置完成后,经测试,在主机B上始终无法ping通主机A。在R2上开启debug ip nat detailed和sh ip nat translations后得到的结果如下:

问题:

R2上的NAT配置正确,但是为什么主机A、B通信失败?(看下面的答案前,希望你可以先自己尝试能否给出准确答案)


答案(含完整解答思路):

给出正确答案前,首先回到本文最开头提到的问题:一台配置了NAT的思科路由器是先执行路由选择(Routing),还是先执行NAT?

对思科的IOS设备来说(注意此处敲黑板,划重点):

  • 如果流量从Inside端口进来,那么先执行路由,后执行NAT(本地 到 全局)。
  • 如果流量从Outside端口进来,那么先执行NAT(全局 到 本地),后执行路由。

顺着这个思路,首先再回顾以下需求:

  • 公司A的192.168.11.1(主机A)在进入公司B的内网前,需要在R2上被转换成172.16.23.1
  • 公司B的192.168.44.4(主机B)在进入公司A的内网前,需要在R2上被转换成192.168.1.4

在主机B上ping主机A,当192.168.44.4到达R2时触发下面这条NAT配置:

很明显,这时192.168.44.4是从Outside端口(即R2的fa0/1)进来,R2先执行全局 到 本地的NAT,将192.168.44.4转换成192.168.1.4,NAT完成后,然后再执行路由,这里没有任何问题,R2顺利将源地址已经被转换为192.168.1.4的主机B的ping包传给了它的目的地IP 172.16.23.1, 即主机A(不要忘了对B来说,A的地址为172.16.23.1,不是192.168.11.1)。

当A收到B的ping包后,A自然会回传一个icmp echo reply包给B, 此时A回传给B的包源地址和目的地址如下:

Source: 192.168.11.1

Destination: 192.168.1.4

当A的流量通过R1到达R2的Inside端口(即R2的fa0/0)时,会先被R2执行路由,R2这时发现A想去的目的地址192.168.1.4正好匹配自己路由表里的下面这条直连路由:

看回上面的拓扑,192.168.1.0 /24正好是R2和R1的直连网段,正因如此,主机A回传给主机B的icmp echo reply包随即因为无人响应而被R2丢弃!!!

整个过程和思路可以用下图概括:

解决方案及思路:

这个问题的解决方案很简单,既然是因为R2上的192.168.1.0 /24这条直连路由在作怪,那我们就利用最长匹配原则,另外手动写一条到192.168.1.4的/32的静态路由来覆盖这条/24的路由就可以了。

此时R2在收到目的地址为192.168.1.4的包时,会将它传给172.16.23.3,也就是R3直连R2的端口,此时B可以ping通A了,问题完美解决。

问题解决后,整个过程和思路可以用下图概括:

版权声明:
作者:SE_Gao
链接:https://www.cnesa.cn/2285.html
来源:CNESA
文章版权归作者所有,未经允许请勿转载。

THE END
打赏
海报
NAT和路由,谁先谁后
版权声明:我已加入“维权骑士”(http://rightknights.com)的版权保护计划,所有知乎专栏“网路行者”下的文章均为我本人(知乎ID:弈心)原创,未经允许不得转载……
<<上一篇
下一篇>>