内网穿透的目
让外部网络可以能访问你本地的应用,例如在外网打开你本地http://127.0.0.1指向的Web站点。
内网穿透的工作方式
NAT(Network Address Translation)的问题在于非内网主机主动发起的连接。从外网发往内网的数据会被NAT丢弃掉。虽然保护内网主机免于外部的攻击,但是给端到端的通信带来了障碍。地址限制锥形和端口限制锥形的NAT要求外网与内网通信,必须有内网主动发起连接,让NAT产生映射表。
内网设备访问外部服务器主动连接:正常通信
内网设备主动发起连接,访问外部服务器。
内网设备主动发起连接外部设备,本地IP:192.168.100.111/24,本地端口号100;外部服务器端口号:1000,IP为公网:144.12.1.22
NAT设备做IP和端口的转换,端口号45025,IP:135.100.144.121,形成NAT转换表
外部设备回访,数据包到NAT查找转换的表项
连接正常建立,网络通信正常
外部服务器主动连接内网设备:无法建立网络连接
外部服务器想访问内网,由于内网设备的IP和端口没有暴露出来,导致外部网络不知道内网设备经过NAT转换后的公网IP和公网端口号,所以无法建立连接。即使知道内网设备在NAT后的公网IP和端口,但是在NAT设备上面没有NAT转换表,也无法得知具体的内网设备。
公有的服务器辅助进行内网穿透
当 外部设备想连接 内网设备时,首先向服务器提出请求,服务器在收到请求后向 内网设备发出打洞命令,并将 外部设备的IP 地址和端口发给内网设备,内网设备根据接收到的 IP地址和端口号向外部设备 发起 TCP 连接 或发送 UDP 数据包。然后 内网设备和外部设备之间便可以建立数据传输通道。
两台内网设备互访穿透过程
UDP内网打洞过程
两个需要通过内网穿透进行通讯的内网客户端,分别将自己的外网收发接口注册给一个具有公网ip的中转服务器
中转服务器将两个客户端注册的收发接口分别告知给对端;
一个内网客户端使自己的接收端口作为源地址,向对端的发送端口发送一个udp数据包,这个数据包称为打洞包。发送过这个打洞包后,可以在这个内网的出口 路由器上产生一条NAT记录,令后续从对端发送端口发来的数据包都不被丢弃, 而是转发给相应的内网客户端的指定端口
发送过打洞包后,对端发送至本端路由器指定接收端口的数据包,就会根据NAT记录转发至本端的内网服务器接收端口,从而实现了内网服务器接收外网数据包的功能
另一个内网服务器同样执行上述步骤3、4, 即可实现两端内网服务器相互收发音频数据包的功能。