困扰已久的路由器映射的回流问题终于解决了。

回流,简单的说就是内网终端通过映射后的公网地址访问内网服务。
通常配置的inside-outside模式的nat是无法实现回流的,

Cisco的domainless NAT

Domainless就是说不再区分inside和outside,只是单纯地做NAT,用一个叫做NAT Virtual Interface的虚拟接口来实现,这样有什么好处呢?说实话,从界面上看不出来,但是从其实现角度,就可以通过路由的方式将带有ip nat enable配置的接口进来的包全部导入这个虚拟接口NVI0中。然后用数据包的源地址和目标地址分别查询SNAT表和DNAT表,根据结果进行NAT操作,随后进入真正的路由查询。

不管方向,不管路由,只要数据包进入了一块带有ip nat enable配置的物理网卡,就会进行NAT匹配以及匹配成功后的操作,不管是SNAT和DNAT都在这里进行。这个实现虽然很豪放,但是却解决了所有问题。

数据包在进入真正的路由查询前,NAT就已经完成了,在路由器看来,NAT操作被藏起来了,就好像数据包本来就是那个样子一样。当然Domainless的NAT也不再和任何其它操作关联,ACL,VPN感兴趣流匹配,policy routing等都和NAT无关。

如以上拓扑,
将R3的80端口映射到外网,那么R2将无法使用公网地址访问R3
该方式的传统的端口映射为:

1
2
3
4
5
6
7
ip nat inside source static tcp 10.1.12.2 80 61.128.1.1 8000
ip nat inside source static tcp 10.1.12.2 80 61.128.1.3 80
ip nat inside source list NAT interface e0/0 overload
interface e0/0
ip nat outside
interface e0/1
ip nat inside

更改为NVI NAT:

1
2
3
4
5
6
7
ip nat source static tcp 10.1.12.2 80 61.128.1.1 8000
ip nat source static tcp 10.1.12.2 80 61.128.1.3 80
ip nat source list NAT interface e0/0 overload
interface e0/0
ip nat enable
interface e0/1
ip nat enable

更改为NVI NAT可能内网还是无法通过公网地址访问内网服务器,此时有个重要的一点是要关闭端口的重定向功能:

1
2
3
4
interface e0/0
no ip redirects
interface e0/1
no ip redirects

这样配置即可完成,检查状态命令为:show ip nat nvi translations

1
2
3
4
sh ip nat nvi translations 
Pro Source global Source local Destin local Destin global
tcp 61.128.1.1:28909 10.1.11.2:28909 61.128.1.3:80 10.1.12.2:80
tcp 61.128.1.1:8000 10.1.12.2:80 --- ---

访问测试OK。同时也能看到,现在内部终端R2通过公网地址访问R3的时候,源地址也被nat为出口路由器的公网地址。