城市里的游牧民族

Menu

NAT分析

本文是转载自H3C论坛一版主的,分享给大家。希望对大家有用。

----------------------------------------------------------------------

经常在论坛上碰到有人问在内网通过公网地址或者域名访问内网服务器不成功的问题,当然,我们可以通过DNS-MAP解决,但并不是所有设备都支持DNS-MAP的,而且有些环境你无法使用该技术。我们可以用其它的解决。

1.拓朴图:

2.环境假设:

   内网服务器的私网地址为192.168.2.251,将服务器的80端口映射至202.101.1.1的80端口上,并申请域名www.sina.com,内网PC机的IP地址为192.168.2.2,现在我们在路由器的外网口配置如下命令:

  sys

  acl number 2000

  rule permit source 192.168.2.00.0.0.255

  quit

  int g0/0    //外网口

  ip address 202.101.1.1 255.255.255.0

  nat server protocol tcp global 202.101.1.1 www indise 192.168.2.251 www

  nat outbound 2000

  quit

  经过以上配置后:

 一、外网用户通过域名或者公网IP地址应该是可以访问服务器,数据流程如下:

  1.外网用户发起到202.101.1.1的TCP 80端口的连接,IP报头结构如下:源IP:外网用户的公网IP,目的IP:202.101.1.1

  2.数据经过路由,到企业边源路由器,由于外网口上有端口映射,则数据会匹配映射,将IP报头结构改变成:源IP:外网用户的公网IP,目的IP:192.168.2.251

  3.数据经过内网路由,交到服务器,服务器回应用户数据,IP报头结构如下:源IP:192.168.2.251,目的IP:外网用户的IP

  4.数据经过边界路由器出公司,由于NAT Server的优先级高于NAT Outbound,所以,数据到达路由器后会先匹配NAT Server记录的会话表项,将IP报头转换成:源IP:202.101.1.1,目的IP:外网用户的公网IP

  5.数据最终通过公网路由到达访问用户,数据访问成功。

二、内网用户通过域名是不能访问服务器的,数据流程如下:

  1.内网用户发起DNS请求,域名解地址为202.101.1.1,客户机发出请求,IP报头结构如下:源IP:192.168.2.2,目的IP:202.101.1.1

  2.数据到达路由器后,由于路由器上有202.101.1.1的直连路由,数据直接交到外网口,由于外网口配置有NAT Server,目的IP被转换后发到服务器,IP报头结构如下:源IP:192.168.2.2,目的IP:192.168.2.251

  3.服务器收到数据后,发现源IP就是一个本地IP地址,此时服务器就不会以202.101.1.1为ip回复,而是以192.168.2.251为源地址回复。此时的IP数据包结构为:源IP:192.168.2.251,目的IP:192.168.2.2,数据将到客户机后,客户机认为,自己请求的是202.101.1.1的数据,但是收到的是192.168.2.2发送的,则认为这个数据不是自己要的,此时会丢弃掉该数据,从而引起TCP等待超时,导致无法访问。

为了解决该问题,我们在内网口做如下设置:

   acl number 3000

   rule permit ip source 192.168.2.00.0.0.255 destination 192.168.2.251 0.0.0.0

   quit

   int g0/1    //内网口

   nat outbound 3000

   nat server protocol tcp global 202.101.1.1 www inside 192.168.2.251 www

   quit

经过以上配置后,我们再在内网使用域名访问该服务器,看看数据流程:

   1.内网用户发起DNS请求,域名解析为202.101.1.1地址,客户机发出请求,IP报头结构如下:源IP:192.168.2.2,目的IP:202.101.1.1

   2.数据交到路由器的内网口,首先匹配端口映射,将目的IP更换掉,此时IP报头结构如下:源IP:192.168.2.2,目的IP:192.168.2.251

   3.路由器发现该数据为内网数据,会再从内网口发出去,此时再匹配nat outbound,将源IP换掉,此时IP报头结构为:源IP:192.168.2.1,目的IP:192.168.2.251

   4.服务器收到数据后响应请求,回复数据包IP报头结构为:源IP:192.168.2.251,目的IP:192.168.2.1

   5.数据到达路由器后,根据NAT Outbound和NAT Server的记录表项,将源IP和目的IP替换掉,此时IP报头结构为:源IP:202.101.1.1,目的IP为192.168.2.2

   6.数据到达客户,目的IP和源IP正确,访问成功。

现在我们假设没有nat server protocol tcp global 202.101.1.1 www inside 192.168.2.251 www,来看一下数据报文是否能完整地走完:(目前MSR路由器上的端口映射配置全局有效,不需要再在内网口配置该命令了。)

   1.内网用户发起DNS请求,域名解析为202.101.1.1地址,客户机发出请求,IP报头结构如下:源IP:192.168.2.2,目的IP:202.101.1.1

   2.数据将到路由器,由于外网口上有端口映射,则数据会匹配映射,将IP报文结构改变成: 源IP:192.168.2.2,目的IP:192.168.2.251

   3.数据将到路由器内网口,匹配nat outbound,将源IP地址变掉,IP报文结构改变成:源IP:192.168.2.1,目的IP:192.168.2.251

   4.数据交至服务器,服务器回复报文,IP报头为:源IP:192.168.2.251,目的IP:192.168.2.1

   5.路由器收到后,匹配内网口NAT Outbound的记录表项,将其IP报头改为:源IP:192.168.2.251,目的IP:192.168.2.2

   6.数据直接交给客户机,客户机依然认为不是自己请求的数据,丢弃,继续等待,超时,失败。

本文转自H3C论坛:http://forum.h3c.com/thread-78789-1-1.html

— 于 共写了2692个字
— 文内使用到的标签:
本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可。

评论已关闭。