局域网如何模拟nat的穿越
发布网友
发布时间:2022-04-30 17:28
我来回答
共2个回答
热心网友
时间:2022-04-12 21:21
其实我所遇到的问题称为NAT Traveral,即NAT穿越问题,目前已经有很多关于这方面的讨论。相信大家也有所zhanwo,从内部网络中的各主机分配的都是虚拟IP地址,一个内部网络通过一个真实的IP地址与外界通讯,从而隐藏了内部主机地址,起到保护作用,同时也节省了真实IP地址的使用.当一个内部主机与外界某主机通讯时,内部主机将数据包发送到NAT设备,此时数据包中包含源地址\端口,目的地址\端口和其它一些信息。当数据包到达NAT设备时,NAT设备生成一个MAP映射表,并将包中的源地址换成自己的合法IP地址,并为此次通讯分配一个端口号,用来替换源端口号。MAP映射表中记录所有这些改变。以后当NAT接到外界传来的数据包时,NAT察看映射表,再重新将目的地址和端口作替换,从而将数据包发送到内部某主机。
现在我们看到,通过NAT,子网内的计算机向外连结是很容易的(NAT相当于透明的,子网内的和*的计算机不用知道NAT的情况)。但是如果外部的计算机想访问子网内的计算机就比较困难了,这时就涉及到了NAT打洞技术(Hole Punching)。打洞思想基本是:一台*IP地址的计算机想和NAT后面的内网计算机通讯的条件就是要求NAT后面的内网计算机主动向*IP地址的计算机发起一个UDP数据包。*IP地址的计算机利用收到的UDP数据包获取到NAT的*IP地址和映射的端口,以后就可以和内网IP的计算机透明的进行通讯了。
但这里还存在一个问题:内网主机怎么知道何时外部有人想与他通信,外部节点又是谁呢?查阅的资料中关于这点提到的较少。只是有一份资料中提到了”心跳包”,即内部主机按一定频率向外部server或外部主机发送心跳包,从而维持通道畅通,否则过一段时间若无数据传输,通道将自动关闭,外部将无法与内部通讯。这方面的内容我还得在研究一下。
目前,我们已经解决了内 ->外,外 ->内两种情况。现在来讨论一下内 ->内的情况,即若两个主机都位于两个不同的NAT后面,此时双方都无法获得对方的地址,这时就需要一个中间人来联系两个主机。如下图:
Server S (219.237.60.1)
|
|
+----------------------+----------------------+
| |
NAT A (*IP:202.187.45.3) NAT B (*IP:187.34.1.56)
(内网IP:172.168.0.1) (内网IP:192.168.0.1)
| |
Client A (172.168.0.20:4000) Client B (192.168.0.10:5000)
首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的*地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是70000,那么Server S收到的B的地址是187.34.1.56:70000。
此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:70000,但此时Client A向这个地址发送信息Client B是收不到的。因为NAT B中没有关于NAT A的信息,所以将会把来自NAT A的数据包丢弃。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的*地址)的洞,那么Client A发送到187.34.1.56:70000的信息,Client B就能收到了。这个打洞命令就由Server S来完成,即如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞。
热心网友
时间:2022-04-12 22:39
参*我家住在黄土高坡,大风从坡上刮过,不管是李宇春,还是曾轶可,都是我滴哥,我滴哥