所谓打洞,实际就是绕过防火墙或路由器的拦截,实现用户终端的直接连接。这里就需要先介绍一下NAT(Network Address Translation)了。它的核心是在IP封包通过防火墙或路由器时,重写源IP地址或目的IP地址的技术;
下图展示了一个带NAT的网络,路由器后的网络地址和路由器的网络地址是变化的。
NAT设备有四种模式,还可以简化为两种类型,即对称模式和非对称模式。非对称模式还分为1. 自由模式 2. 受限IP模式 3. 受限IP和端口模式;
1. 自由模式:凡是内网的一个IP+PORT发起的UDP广播,在经过路由器之后都会映射到一个固定的端口,并且外部所有的IP和端口都可以通过路由器映射的IP+Port回访数据;
2. 受限IP模式:凡是内网的一个IP+PORT发起的UDP广播,在经过路由器之后都会映射到一个固定的端口,只有接收方的IP可以发送回访数据,端口不限;
3. 受限IP+port模式:凡是内网的一个IP+PORT发起的UDP广播,在经过路由器之后都会映射到一个固定的端口,只有接收方的IP和指定的PORT发起的回访数据,会被接受;
4. 对称模式:凡是内网的一个IP+PORT发起到指定IP+port的UDP广播,在经过路由器之后都会映射到一个固定的端口,只有接收方的IP和指定的PORT发起的回访数据,会被接受;
换句话说,只有非对称模式的NAT设备才可以进行UDP打洞;
UDP打洞原理:
1. 有一个协调方,我们称之为server;
2. A,B分别和S相连;S即得到了A,B在最外层路由的ip地址和端口号;
3. A要向B发起连接,先向S请求连接,S将B的ip+端口发送给A;
4. A向B的IP+端口发送UDP数据包,被B的防火墙或路由抛弃;
5. A向S通知,已经向B发送过数据;
6. S通知B,向B发送A的ip+port,并通知B向A发送数据;
7. B向A发送数据,由于A向B发送过数据,因此A的NAT设备的session里已经记录了B的ip+port,B的数据过来后,会被A的设备放行,数据将被直接传递到A的终端;
8. A收到B的数据后,回数据给B,此时B的设备也记录了A的ip+port,因此通信建立成功;
测试了一下,发现公司的环境和家里的环境,全部是对称模式,抓包时发现端口号已变,无法打洞:(
没有评论:
发表评论