如何用公网访问内网的局域网中的资源
@无名啊,UDP是无连接的协议,网关采取以下放行规则:如果内网机器的端口A给服务器的端口B发送过数据,就允许服务器的端口B给内网机器的端口A发送数据。
所以,如果你给对方发送数据的时候对方也给你发送数据,并且端口互相匹配(你发送的目的端口是对方发送的源端口,反之亦然),就恰好可以穿越双方的网关,顺利到达接收者处。此时在你的网关看来,对方发来的数据包是服务器对你的响应。在对方的网关看来,你发去的数据包是服务器对他的响应。在首个数据包交换完成后,你和对方间的双向UDP通道就已经打开,你们就可以自由的发送更多数据了,而且这些数据完全不会经过第三方服务器。这就是UDP内网穿透的原理。
而UDP内网穿透之所以要一个协商服务器,就是为了让双方发现对方的IP和源端口。在得到对方的IP和源端口之后,只要双方同时开始发送,就可以顺利建立UDP隧道。
目前已经有规范的步骤来实现隧道建立,比如STUN协议:
@无名啊,UDP隧道建立最难的步骤是预测对方的源端口。为什么要“预测”,不是可以通过中间服务器直接观测吗,或者让对方机器通过中间服务器直接告诉你不行吗?不一定行,因为公网IP是由很多内网机器共享的,有时候它们会用相同的源端口发起通信,此时网关在把内网数据包转换为公网数据包的时候,就必须为每个机器选择不同的端口。如果网关在主机和不同的服务器通信时使用不同的端口,那源端口就不可观测了,必须“预测”。如果预测不准,对方网关转换后的端口和你猜的不同,对方网关就会拒收数据包。
现实中的应用程序会有一系列的解决方法,包括:
最后,互发数据包并且互能收到,还利用了网络延迟导致的“同时性的相对性”。
虽然你们可能同时发送数据,但是因为你的网关离你更近,离对方更远,所以在你的网关看来,你先发送数据,对方后发送数据。在对方网关看来,对方先发送数据,你后发送数据。
虽然双方同时发送,但是因为数据包到达各自网关的时间不同,在双方网关看来,都是内网先发送请求,服务器(对方)后发送响应。
于是双方都成了对方的服务器,顺利实现了点对点(P2P)连接。
UDP隧道是视频会议软件、远程控制软件、共斗游戏(有联机功能的单机游戏)等应用的网络基础。这些应用通常都不会建设数据中转服务器,只建设了UDP隧道协商服务器,帮助通信各方建立隧道。
当然了,某些应用确实会在隧道创建失败的时候使用服务器中转。有些网络确实无法顺利创建UDP隧道,比如经过了多次随机NAT,导致端口不可预测,或者是网络封锁UDP或者干脆不支持UDP(比如通过仅限TCP的代理服务器连接等)。
我用slake的nebula创建了p2p vpn。
https://github.com/slackhq/nebula
教程:
我的配置文件:
果然,Windows不能担此重任。但可以使用WSL2或者Linux虚拟机。在虚拟机内运行nebula应该不会影响UDP隧道创建。
额,好像不对,向其它服务发送数据包时端口要变,不然数据回来时网关不知道把目标端口设置成什么。。
红米K30 Pro(变焦版)
刚刚又去复习了一下NAT,发现老虎说的是Symmetrict NAT,我说的在Full Cone NAT,Restricted Cone NAT和Port Restricted Cone NAT的情况下可以建立起通信。我记对了,但是没有完全记对,记混了
红米K30 Pro(变焦版)
@嚻,哦对了,我的 svn 服务好像是 https 提供的,形如 https://10.2.15.3:4333/code ,是不是应该配置 http 或者是 tcp 相关的?
小米MIX2s(白)