您的位置:首页 > 其它

浅谈内网web服务器发布到公网后路由器回流问题--NAT--PAT---技术研究

2013-12-31 00:00 387 查看
浅谈路由器回流问题:

回流问题是指,当用路由器防火墙等设备将内网服务器发布到公网上,供internet用户访问的过程中出现的一种现象,就是你发现web服务器已经成功发布了,internet用户也已经可以通过你路由器公网接口地址成功访问了,而你却发现自己在内网中与web服务器同网段的主机上直接访问那个路由器公网地址是无法访问到web服务器的页面内容的。这就是回流问题。

下面具体分析一下产生这个现象的原因:

假设内网web服务器地址192.168.0.1 ,路由器公网地址200.200.200.1

来自internet用户的地址是200.200.200.100 ,来自内网与web服务器同网段用户的地址是192.168.0.100

首先看一下外网用户发出对web服务器页面访问的过程,

第一步,外网用户在浏览器输入http://200.200.200.1 之后发生了什么?http协议是利用tcp协议的80端口工作的,而tcp是面向连接的协议,也就是说,使用该协议传输数据是需要事先跟目标服务器协商的,协商好了才能发数据,tcp协议需要三次对话协商,首先客户端发了一个源地址200.200.200.100的目标地址200.200.200.1目标端口80的请求包告知目标主机“我打开了80端口我想与你连接”这个数据包按照目标地址通过网络传输到了路由器的公网接口,由于路由器对公网接口以及它的内网接口之间做了NAT技术,所以该数据包在路由器公网接口被加工改造,将目标地址改成了192.168.0.1源地址不变放到了路由器的缓存队列中,路由器转发程序发现该数据包是发往192.168.0.1的,根据自身路由表中的直连路由直接找到内网接口,这样数据包就到了内网接口,然后就开始在内网接口发送该数据包的脉冲信号,与内网接口相连的交换机,收到该数据包会查找自己的MAC地址表,看192.168.0.1的主机与自己哪个接口相连,于是该数据包就被发到了与web主机相连的交换机端口打上自己端口的MAC地址后发往web主机,这样服务器就接收到了这个请求包。因为交换机对此问题不产生影响所以之后的内容就不谈交换机转发的过程了。

第二部,根据TCP协议,服务器接收到这目标地址为192.168.0.1源地址为200.200.200.100的数据包后需要发回确认包告诉访问者自己同意连接,并打开自己的80端口。于是发送一个源地址192.168.0.1目标地址200.200.200.100的确认回应包到路由器的内网接口,在内网接口通过NAT端口映射技术将此包的源地址改写为外网口地址200.200.200.1目标地址不变放入缓存队列,转发程序发现该包是去往200.200.200.100的,根据路由表中的直连路由直接送到外网接口,于是外网接口把包发给了外网用户的主机。

第三部,根据tcp协议,外网主机收到了源地址200.200.200.1目标地址200.200.200.100的回应包后还需再次发送一个确认包,告诉目标主机,“我要发送数据了,你做好准备“

通过前面三步就完成了tcp的连接,开始传输数据的过程,此后的数据包都是,你请求什么页面什么内容,服务器就给传什么内容,请求包目标地址都是200.200.200.1。

/////整个tcp连接过程中,访问者客户端主机是不知道真正给他提供回应和服务的真正主机在哪的

=====================

下面看从内网与web服务器同网段的主机访问web服务器的过程,

第一步,与前面类似,浏览器输入:http://200.200.200.1, 然后根据ctp协议发送目标200.200.200.1源192.168.0.100目标端口80的请求包,这个请求包正常到了路由器内网接口,之后可能有几种情况,都可能引起回流问题。

第一种情况:

下面注意该过程与上面的区别,该包是发往路由器外接口的,而不是发往外网的,所以路由器不会启用pat地址转换,直接把包根据路由表投递给外网接口,外网接口发现这个包是发送给自己的并且目标端口是80,于是自动应用NAT端口映射技术,修改包的目标地址为192.160.0.1源地址不变放入缓存队列,转发程序正常根据目标地址把包送到了web服务器。

web服务器收到目标地址为192.168.0.1源端口是192.168.0.100的数据包后根据TCP协议作出回应,需要发送目标地址192.168.0.100 源地址192.168.0.1的回应包,这个包这回没到达路由器内网接口,而是直接通过交换机就跑回来了,因为在ip网络中,相同网段有直接通信的特性,而你的内网客户端这回就萌了,“我什么时候给你发过请求啊?你算干嘛的你给我一个回应确认包啊!”于是你的客户端继续等待200.200.200.1给他回应!

可以看出,tcp的回应包是不能正常发回的,你的主机在苦苦等待而没有结果后,宣告TCP第二次握手等待超时,连接失败。

还可能有一种情况,也就是说,你内网客户机采用与web服务器不同网段来访问200.200.200.1,发送完请求包后,服务器会将回应包仍然发到路由器内网端口,由于是发往内部主机的,路由器还是不会启用pat转换,而是通过直连路由直接转发给你的客户机,这样你的客户机仍然收不到源地址为200.200.200.1的回应包,还是不能成功建立连接。

另外一种情况,如果路由器将你发往200.200.200.1的数据包算做是发往外网,对其做了pat转换,或路由器是强制地址转换的,那么该数据包的源地址将变为200.200.200.1到达路由器外部接口,而路由器如果有相关防错功能,也许该数据包就直接被干掉了,如果可以继续转发那么该数据包将以源地址为200.200.200.1目标地址192.168.0.1到达web服务器。而服务器回应的数据包就会以目标地址200.200.200.1 源地址200.200.200.1到达路由器外部接口。而路由器外部接口此时就盟了。

前两种情况的关键之处就是外网接口应用了NAT端口映射技术,导致你的主机总是在等待路由器的外部端口回复确认信息。而后一种情况关键之处就在于当你从内网其他主机访问路由外部端口地址时,被应用了PAT技术,将包的源地址进行了修改,导致web服务器回应包不知道真实的访问者地址。

也就是说NAT端口映射技术没有很好的与PAT端口复用技术协同工作,导致回流问题产生,如果不应用PAT做端口地址转换复用,或nat端口映射,就不会有回流问题,那么同时也没法访问外网。外部主机也访问不了内部服务器。

在此过程中如果想判断你内网客户端发往web服务器的数据包究竟有没有被路由器进行pat转换,可以在web服务器上使用抓包软件,看一下收到的tcp请求包的源地址是192.168.0.100还是200.200.200.1就知道了。

下面简要介绍一下NAT技术

NAT分为:分为静态NAT,动态NAT,NAT端口映射

NAT就是在路由器上将出去的数据包源地址转换为其他接口地址使之与其他网络段匹配,回来的数据包将目标地址再转换回原来发包的主机地址。方便公网的访问,并且屏蔽数据包来源,还起到节省公网地址的作用。设是路由除了转发以外的看家本领,我们从局域网访问internet就是靠它实现的。

运营商不可能把每个要上网的用户都分配一个公网IP,公网IP是不许重复的,因为它用来唯一标定网络上每个路由器或主机的位置,重复就会出问题。且公网的网络设备数量庞大,公网上的所有路由器和主机配置的都是公网IP地址,所以公网IP地址是有限的可以说是稀缺的,而局域网中主机和网络设备数量少,一般都使用私有地址配置,不同局域网中的不同主机IP重复是没什么问题的,只要在一个局域网中保证没有重复,每台设备都能唯一标定就行了,

那么如何让内网用户能够访问公网服务器的内容又与公网在逻辑上是分开的呢?那就得依靠NAT技术了

静态NAT就是指静态一对一转换,一般将要上网主机发到外网接口的数据包源地址转换为外网为接口地址,最初的NAT有个缺陷,就是当某一个主机正在访问网络时,那么他占用了路由器外网接口地址,那么其他主机就没法访问,最初是这样解决的,只要要求运营商多分配些合法IP地址就行了,在路由器上设置一个可用于地址转换的合法ip地址列表,也叫可用转换地址池。这样内网不同主机同时访问时可以让路由器自动使用地址池中的不同地址做转换。同时路由器会将对应关系记录到映射表中。以便服务器回应数据包时查找对应主机。

动态NAT就是根据要访问网络的主机网卡MAC地址来让路由自动判断那个是需要转换的主机,不需要指定转换哪些iP地址。不过这个技术还是不常用的。

随着局域网要上网主机的增多,运营商能提供的合法公网地址又有限,这样就无法满足大量局域网主机同时上网的需求,于是又诞生了PAT技术

PAT技术又称基于端口的地址制转换技术,可以说是NAT技术的升级

它在NAT转换的基础之上,将内网不同主机发到外网接口的数据包源地址转换为同一外网地址,但端口使用不同端口转发,而且将数据包进入时的端口和转发出去时的端口以及源ip地址对应关系记录到一个映射表中,用于回应数据包返回时查找对应的主机。注意,在菜用PAT端口复用技术时,数据包包的源端口和目的端口是没有被改写的。只是路由器自身使用了不同端口进行转发。

如今使用的都是PAT转换技术,才使得这么多的局域网主机能够同时上网的,不过有时也习惯将PAT称为动态NAT转换。

=================

针对回流问题的解决方案分析,

如果回流问题是前两种情况产生的,那么可以考虑将内网访问主机改为其他网段,并强制其pat转换,然后还是考虑如何让那个目标地址和源地址都为外网口自身的数据包能继续转发下去。

有人提出可以在路由器上再做一个反向NAT端口映射,可实际上要做的事用反向端口映射来形容是不恰切的。

根据我的理解:

nat端口映射是改写包的目标地址

nat转换是改写数据包的源地址

两者配合使用才完成了内网与外网服务的互通

试想如何将源地址为外网口地址的数据包的目标地址转换为内网主机地址呢?因为一般都是将内网固定地址映射为指定外网端口,意义是将该外网端口的来源为任何地址的数据包的目标地址改为内网指定地址,而需要做的是将内网多个地址映射到外网口的指定地址,意义是将来源为固定地址的数据包的目标地址改为指定的一些地址。

但该方法可能有些路由器或防火墙不支持,

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

而反向NAT端口映射要做的事是什么呢?

是将外网某台服务器的的端口映射到路由器内网端口,让用户访问内网路由接口就可以直接访问到外面的服务器,而且要保证返回数据包能在外网接口正常将源地址修改为路由器内网口地址或可用的内网地址。

但要注意的是其他的可用内网地址必须是定义在内网口的地址池中的地址,

这些地址就相当于给该网口配置的附加地址。

以上所做的就是反向NAT端口映射,和反向nat转换。

所以实际解决回流问题的配置操作应该叫做:

正向的指定多个内网主机到外网固定地址的NAT端口映射。

也就是限定了数据包来源只能是外网端口地址,如果不限定来源,那么外网的所有访问数据包将直接到达内网,也就是说相当于把正个内网通过nat端口映射发布到了网上。

做该配置前,首先应当看内网发布的含有80端口的其他服务器能否通过路由器外网口地址正常访问该WEB服务器。如果不能实现的话,就是说明该配置是行不通的。

如果行的通可以发布另一个主机的所有端口到外网,以便将该主机作为测试机,从而省去了找运营商另外添接线路的麻烦。

//不过这台主机的所有端口都是暴露在网上的,有一定的安全隐患,发布的时候可以考虑只开放相关的端口

另外在端口映射的同时如果能够限定外网访问者地址来源那是最好,最好能直接指定为外网口地址。

总之能否实现回流还是得看路由器或防火墙是否支持相应配置了,根据以上解决思路来看还是有个疑点的,因为以上思路的配置不过是实现了路由器外端口源与目标端口都为外端口地址的数据包的继续转发给内网主机,而没做上述配置前路由器本身是已经做了一条该端口到内网web服务器的映射的,如果以上配置可行,那么原来的配置也该可行,那么该回应数据包是否会返回web服务器自身呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐