没有到主机的路由_NAT和路由,谁先谁后,你真的搞懂了吗?

弈心:从事计算机网络工作十年(新加坡7年,沙特3年),2013年考取CCIE,在新加坡先后任职于AT&T,新加坡交通部,苹果,Equinix,苏格兰皇家银行等大型企业、银行和政府部门。 目前供职于“世界第一土豪大学“沙特阿卜杜拉国王科技大学(KAUST),担任Senior Network Engineer,为KAUST校史上第一位也是唯一一位华人IT部门高级职员。2019年6月在知乎发布了华语圈第一本专门为编程零基础的网络工程师量身打造的Python教程《网络工程师的Python之路》。

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

在技术面试环节中有一道题我是必问的:一台配置了NAT的思科路由器是先执行路由选择(Routing),还是先执行NAT? 我听到过的答案五花八门,至今没有一个人能给我一个完全正确的回答。

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

问题背景:

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

2940555375b169be80e87528e479ffe6.png

由于公司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的路由表如下:

37efec0ed25ceb6643481ffbab9e8cf0.png

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

b3def07116ae9807b1e3a682b9456b5b.png

问题:

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配置:

7f08ccc67024d53187e4d3473698cd7a.png

很明显,这时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正好匹配自己路由表里的下面这条直连路由:

fe8c47e71f1e8bf03eff19218e5b556d.png

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

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

2092cf807cc2965b81a64764fbab828e.png

解决方案及思路:

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

5a8bbd1b5e301fd309690644c06f0d69.png

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

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

2b6a90c25e3f39f7ccf997e7c59d9d20.png
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值