无公网ip家宽进行中转
最近nat小鸡可以说是相当的火,买nat的人大多有两种用途——需要公网ip来进行frp等端口转发等服务,或者是需要“借道”诸如联通网络/电信CN2网络来进行上网代理的中转加速。但是市面上的nat太多了,其间鱼龙混杂,有的价格惊人,有的流量很少,有的超售得离谱…总之想要找到靠谱的商家很难。就像下面这张图一样。
不过其实也不是完全没办法,只要你有一个使用联通家宽/电信CN2宽带的朋友,再发挥一点想象力……一台无限流量,带宽基本有保障(比如很多地方联通上传速度大概30mbps)的机器就出现了。以下方法请自己用就好了,不要用于盈利之类的活动
你可能有疑问,比如不是家家都有公网ip,而缺少公网ip是一个严重的问题,没有公网ip该如何连接呢?
自然,如果你的朋友的家宽能申请到公网ip的话,只要他家有个树莓派/废弃电脑/常开机的电脑之类的设备,就可以当作是一个ddns的联通服务器来玩了,直接使用iptables/socat来进行流量中转即可,不过看了标题就知道,我这篇文章并不讨论有公网ip的机器中转问题。
原理
要想实现无公网ip的机器的中转,我们需要建立p2p连接,涉及到下面这些知识
udp打洞
通过UDP路由验证实现NAT穿越是一种在处于使用了NAT的私有网络中的Internet主机之间建立双向UDP连接的方法。由于NAT的行为是非标准化的,因此它并不能应用于所有类型的NAT。
其基本思想是这样的:让位于NAT后的两台主机都与处于公共地址空间的、众所周知的第三台服务器相连,然后,一旦NAT设备建立好UDP状态信息就转为直接通信,并寄希望于NAT设备会在分组其实是从另外一个主机传送过来的情况下仍然保持当前状态。
步骤一:A和B分别和S建立UDP连接;NAT设备N1和N2创建UDP转换状态并分配临时的外部端口号
步骤二:S检查UDP包,看A和B的端口是否是正在被使用的(否则的话N1和N2应该是应用了端口随机分配,这会让路由验证变得更麻烦)
步骤三:如果端口不是随机化的,那么A和B各自选择端口X和Y,并告知S。S会让A发送UDP包到P2:Y,让B发送UDP包到P1:X
步骤四:A和B通过转换好的IP地址和端口直接联系到对方的NAT设备;
上面的选择维基百科,翻译的不咋地,掘金^1 有一篇文章比较简易的介绍了udp打洞。注意不是所有的nat网络类型都适用与udp打洞,实际可行性还是需要自己测试的,不过我的几次测试都成功了。