【科普】NAT类型详细科普及提升NAT类型的方法
NAT可以说是被各路大佬科普过了,今天我从一名程序员的角度来讲解一下什么是NAT,为什么NAT会有各种类型,又如何改变我的NAT类型。而关于大家最感兴趣的提升NAT类型的部分我可以保证,只要操作没有问题,最后的效果和你的网络没有任何关联,就算你是城中村亦或者是辣鸡校园网,都是完全可以通过软件层面上改写数据包来实现full cone(nat中最高级别,对应ns的natA,ps4的nat2中最好的),甚至可以享受公网ip的待遇(nat中最高级别,对应ns的natA,ps4的nat1)
同时本帖也用于记录我终于成功完成了路由器稳定的full cone nat以及不稳定到ping命令跑不过但是就是能上网而我也懒得知道为什么的公网ip映射
同时本帖也用于记录我终于成功完成了路由器稳定的full cone nat以及不稳定到ping命令跑不过但是就是能上网而我也懒得知道为什么的公网ip映射
首先在看本篇文章之前你需要明白,现在的加速器在很多时候已经能满足大多数的玩家的需求,不管是nat类型改变还是说网络线路的选择,网络加速器可以说是比自己搭建的灵活性和效果好得多,而且面向主机的加速器也逐渐增加,支持多种路由器的加速器插件也逐渐出现,本文中的方法比较复杂并且需要一定的计算机知识,相比之下网游加速器可以说是更好的选择,如果你只是轻度游戏玩家,那么我推荐了解完NAT以及NAT类型相关的知识,就可以看兴趣品读一下我的解决思路而不要去实际操作(会自闭的)
NAT简介
首先现在的大多数设备的网络采用的ipv4网络,ipv4中ip的定义为x.x.x.x,其中每一位为0-255,所以全球的ip总数256^4,这个数量是不足够全球使用的,为了保证每个人都能有ip使用,NAT技术诞生了。
NAT的思路很简单,将一个公网ip下的子网ip发送的数据包转换成自身的数据包进行发送,然后再把收到的数据包还给子网ip。
打个比方就像是大学宿舍4个人,选出来一个人去上课,不管是签到还是通知都由这个人来负责,这样一来,可能教室中只有一小半人,但是签到一个不少,这个被选出来的人就是那个公网ip,其余的3人就是下面的子网ip,这样就解决了ip不够的情况。
由此可见产生nat的直接原因就是你的电脑并没有真正的公网ip,你的电脑只是运营商手中的那个公网ip下面的众多电脑中的一台,所以如果能向运营商获得公网ip就可以实现ps4的nat1(无nat),但是这并不容易,因为有可能你的运营商甚至都没有公网ip而是从别的运营商手里拿到的一堆子网ip再分给你的,或者说你不可能找校长给你分配个公网ip
首先现在的大多数设备的网络采用的ipv4网络,ipv4中ip的定义为x.x.x.x,其中每一位为0-255,所以全球的ip总数256^4,这个数量是不足够全球使用的,为了保证每个人都能有ip使用,NAT技术诞生了。
NAT的思路很简单,将一个公网ip下的子网ip发送的数据包转换成自身的数据包进行发送,然后再把收到的数据包还给子网ip。
打个比方就像是大学宿舍4个人,选出来一个人去上课,不管是签到还是通知都由这个人来负责,这样一来,可能教室中只有一小半人,但是签到一个不少,这个被选出来的人就是那个公网ip,其余的3人就是下面的子网ip,这样就解决了ip不够的情况。
由此可见产生nat的直接原因就是你的电脑并没有真正的公网ip,你的电脑只是运营商手中的那个公网ip下面的众多电脑中的一台,所以如果能向运营商获得公网ip就可以实现ps4的nat1(无nat),但是这并不容易,因为有可能你的运营商甚至都没有公网ip而是从别的运营商手里拿到的一堆子网ip再分给你的,或者说你不可能找校长给你分配个公网ip
NAT类型简介
那么知道了什么是NAT那么为什么NAT还分成好几种类型呢?这是因为出于安全考虑,NAT类型越封闭你的计算机越安全,甚至在windows上,就算你外面是公网ip,出于安全考虑防火墙都能把你的NAT类型降低不少
NAT一共分为2大类
第一类是克隆(cone)类型,而克隆又分成
全克隆(Full Cone)
ip地址限制型(AddressRestricted Cone)
端口限制型(Port Restricted Cone)
第二类是对称(Symmetric)类型
在ps4上这4中都是nat2,而对称性如果端口无法转发则是nat3(可以理解成纯正的对称,尝试拯救失败的那种),而ps4上的nat1则是无nat(ps4上的ip就是公网ip)
对于ns则能确定的是全克隆是a,中间两种应该是b,对称型是c,至于那些f都出来的我实在不知道是咋分出来的
那么知道了什么是NAT那么为什么NAT还分成好几种类型呢?这是因为出于安全考虑,NAT类型越封闭你的计算机越安全,甚至在windows上,就算你外面是公网ip,出于安全考虑防火墙都能把你的NAT类型降低不少
NAT一共分为2大类
第一类是克隆(cone)类型,而克隆又分成
全克隆(Full Cone)
ip地址限制型(AddressRestricted Cone)
端口限制型(Port Restricted Cone)
第二类是对称(Symmetric)类型
在ps4上这4中都是nat2,而对称性如果端口无法转发则是nat3(可以理解成纯正的对称,尝试拯救失败的那种),而ps4上的nat1则是无nat(ps4上的ip就是公网ip)
对于ns则能确定的是全克隆是a,中间两种应该是b,对称型是c,至于那些f都出来的我实在不知道是咋分出来的
在讲这几种NAT分类之间的区别之前我首先先科普一下ip和端口之间的关系,对于每个ip它都有0~65535共65536个端口,端口的作用是用来区分数据包,同一台电脑上有很多应用在上网,为了区分数据包是给哪个应用的我需要给每个应用分配一个端口,每个端口就像是银行的服务台,不同的窗口不同的业务,只有去对应的窗口才能办对应的业务,如果我想让别人能在我这里办理业务,我也需要打开我这个窗口,这样别人看到窗口打开了才能把单子递进来。
对于NAT则是同时还要用于区分不同的电脑,老师发文件,如果不说明是发给谁的,那么这个代表也不知道是给自己的还是给寝室里面别人的,所以寝室里面的人在不同作业上写上编号然后给代表,和代表说老师发回来的评语上也写相同的编号这样我就知道这个评语是我哪份作业的了,代表就在跟老师这么说,但是同时如果3个人的语文都用的1编号,那么代表可能会把这3份作业分到123这3个编号上,这样一来给回来1就知道是第一个人的语文作业的评语了,然后再把评语写上1给第一个人,而如果老师给了一个4过来,代表就知道了,这个文件是给我的不是给那三个人的,不过在实际中端口是双方的,老师发送评语过来也是有一个端口的,代表会把作业给老师的3号窗口,然后3号窗口再返回给代表,也就是 甲:1发送给 代表 ,代表:1 发送给 老师:3 , 老师:3 发送给 代表:1 ,代表 发送给 甲:1 这样的一个通信过程,其中两个没有冒号的代表是因为在这个过程中我只是转发了数据包并不是要交给代表的某个应用处理,我只是给你让你帮我交作业而已
对于NAT则是同时还要用于区分不同的电脑,老师发文件,如果不说明是发给谁的,那么这个代表也不知道是给自己的还是给寝室里面别人的,所以寝室里面的人在不同作业上写上编号然后给代表,和代表说老师发回来的评语上也写相同的编号这样我就知道这个评语是我哪份作业的了,代表就在跟老师这么说,但是同时如果3个人的语文都用的1编号,那么代表可能会把这3份作业分到123这3个编号上,这样一来给回来1就知道是第一个人的语文作业的评语了,然后再把评语写上1给第一个人,而如果老师给了一个4过来,代表就知道了,这个文件是给我的不是给那三个人的,不过在实际中端口是双方的,老师发送评语过来也是有一个端口的,代表会把作业给老师的3号窗口,然后3号窗口再返回给代表,也就是 甲:1发送给 代表 ,代表:1 发送给 老师:3 , 老师:3 发送给 代表:1 ,代表 发送给 甲:1 这样的一个通信过程,其中两个没有冒号的代表是因为在这个过程中我只是转发了数据包并不是要交给代表的某个应用处理,我只是给你让你帮我交作业而已
通过这个过程就可以发现NAT最大的问题就是NAT这边的电脑如果想让外面的人访问进来就必须我访问过外面的人,这样,才会有给代表1的文件都给我的1这样的一个映射,否则所有的文件都会变成给代表的而不是给我的了,所以在p2p联机中,能够通过一定的手段让外界的人访问到我就很关键了,而在不同的NAT类型中则还会有一定的不同
在明白NAT是在干什么的时候我们换一个例子,我们假设主机上有个MHW要和外界建立连接,我们假设我们的ip是A,MHW的临时建立的窗口号是a,我们的最外面的公网ip是B,而a映射出去的端口是b,那么就是A:a-->B:b这样的一个结构
NAT的分类首先是根据发送的行为方式来区分,如果我现在想和一个主机C的c端口建立连接,在这个过程中我的A:a会在B上映射出来b端口用来通信,从而形成A:a-->B:b-->C:c,此时如果我想和主机D的d端口建立连接,如果产生的线路是A:a-->B:b-->D:d则称为克隆型,如果产生的是A:a-->B:e-->D:d则成为对称型,在克隆型中如果第二次向外发送数据时会重复利用之前建立的A:a和B:b的对应关系,在对称型中则是创造一个新的A:a和B:e的对应关系
接下来就是NAT对于接收的行为方式进行区分,对于对称型因为只要C:c中的任意一个改变就会创造新的对应关系,所以只有C:c-->B:b-->A:a才能成功访问,不论更改C还是c都会被拒绝,而对于克隆型则分为全克隆,不管是C还是c都可以变更,即在没有和D通信过的情况下可以D:d-->B:b-->A:a,而ip地址限制型,则要求我这个B:b访问过D的ip之后D才能访问我,但是你是什么端口我不关心,而端口限制型则是我访问过你的D:d之后你才能通过D:d访问我的B:b,而不能用D:e
NAT的分类首先是根据发送的行为方式来区分,如果我现在想和一个主机C的c端口建立连接,在这个过程中我的A:a会在B上映射出来b端口用来通信,从而形成A:a-->B:b-->C:c,此时如果我想和主机D的d端口建立连接,如果产生的线路是A:a-->B:b-->D:d则称为克隆型,如果产生的是A:a-->B:e-->D:d则成为对称型,在克隆型中如果第二次向外发送数据时会重复利用之前建立的A:a和B:b的对应关系,在对称型中则是创造一个新的A:a和B:e的对应关系
接下来就是NAT对于接收的行为方式进行区分,对于对称型因为只要C:c中的任意一个改变就会创造新的对应关系,所以只有C:c-->B:b-->A:a才能成功访问,不论更改C还是c都会被拒绝,而对于克隆型则分为全克隆,不管是C还是c都可以变更,即在没有和D通信过的情况下可以D:d-->B:b-->A:a,而ip地址限制型,则要求我这个B:b访问过D的ip之后D才能访问我,但是你是什么端口我不关心,而端口限制型则是我访问过你的D:d之后你才能通过D:d访问我的B:b,而不能用D:e
总结下来,在B:b和A:a在与C:c通信的过程中建立过关系后对于接收的时候D:d向B:b发送数据包,如果无条件把文件给A:a就是全克隆,如果B:b(注意要求端口)之前给D发送过数据包的情况下才转发给A:a否则阻止那么就是ip地址限制型,如果如果B:b(注意要求端口)之前给D:d发送过数据包的情况下才转发给A:a否则阻止那么就是端口限制型,如果直接丢弃则是对称型
在MHW联机的过程中,因为是p2p用户之间需要建立连接,那么就需要能让我的MHW对应的端口有办法和你的MHW对应的端口建立连接,对于公网ip来说,直接访问对应的端口就行了,对于全克隆来说我只要用我的MHW访问一下服务器,那么服务器看到B:b和我通信了我告诉所有人和B:b连接就可以了,对于ip限制型克隆,我需要让房主先访问一下我的ip(不管是否是访问到代理了还是说那个就是我),然后我就可以通过公网或者通过代理去访问房主了,而对于端口限制型,则必须保证房主访问我的时候用的ip是我的端口也要是我的MHW对应端口映射出去的端口,这样我访问过去的时候才会使D:d而不会是我用D:d访问B:b,但是房主只允许我的D:e访问B:b,在这种情况下只要我和房主都去访问一下服务器,服务器看到一个人用的B:b,一个是D:d,再让B:b访问D:d(会失败),然后再让我通过D:d去访问B:b即可,而如果在这个过程中有任何一方是对称型,那么就会因为访问服务器和访问房主是两次访问不会共用D:d而无法预测我的MHW在访问B:b时用的是什么端口,此时p2p就失败了,这也就是为什么说nat3只能和nat1连,而nat2和nat12,nat1可以和所有的连接的原因了
那么我们该如何改变NAT类型呢?在这里我首先提供一些思路,首先我们要找到NAT发生的地方,NAT主要发生于公网ip与局域网ip之间的交汇点以及局域网内两个网段(比如192.168.1.x和192.168.2.x,可以认为第3个点前面的就是网段了)之间,但是往往我们的局域网ip会经过大量的局域网网段,而公网ip与局域网的交汇处的设备又不在我们的手里,此时就要用到xxx了,众所周知xxx可以翻x,但是同时也可以用于在两个通过互联网连接的设备之间建立一条虚拟的网线来连接,如此一来我们就可以直接跨过中间复杂的结构把网络结构变成电脑---公网服务器这样简单的结构,这里的服务器就需要去租,最便宜能上网的就行,如此一来我只要在两个设备之间通过openxxx建立连接之后我就可以控制我的服务器上的NAT过程中的NAT类型来改变我的电脑的NAT类型了,此处需要自行百度搭建openxxx服务器
我们可以通过无条件将所有的数据包转发给电脑从而实现公网ip映射,不过要注意的是通过这个方法会直接废除你的服务器,你的服务器所有的向外通信的返回都无法接收到而会发送给你的电脑,但是相应的你可以近似获得公网ip的一切,这种方法非常不稳定,我不保证会不会发生什么奇怪的东西,这个方法可以通过iptables的nat表中的SNAT和DNAT来改写数据包的发送地址(source)和目标地址(destination),需要注意的是永远不要更改位于公网ip的那一端,发送时应当更改发送ip为公网ip,接收时应当更改目标ip,将其从公网ip改成电脑的ip(openxxx分配的那个ip,或者在服务器上写静态路由也可)
顺带一提,因为ps4和ns没有那么灵活的网络设置,所以在实际情况中我还采用了一个树莓派用作网关,这样所有的数据包发给树莓派,然后树莓派再发给服务器,需要注意的是,如果不写陆游的话,在主机与树莓派间和树莓派与服务器间是两个局域网网段,需要做和服务器相同的设置,不过所有的出入网卡都要改成xxx的tun0网卡,在硬件上和在操作上都有一定的门槛,所以并不是非常推荐,但是如果有同样喜欢折腾的人,不妨可以理解一下nat和路由然后在树莓派上配置相似的内容,同时这句话适用于上面所有的教程,我只是提供思路,在操作前请一定要理解透彻,不然盲目操作会出现各种各样没见过的网络问题
顺便发现以前写过一点东西,还是有点详细的http://tieba.baidu.com/p/5538730520?share=9105&fr=share&see_lz=0,这个教程大概可以一直管到nat3转nat2,全克隆部分不包括,不过编译的一些难点我前面都说了,挑战一下还是有点希望,主要还是有一个挂xxx并且可以灵活配置的最好是linux系统的设备比较难受
我的服务器系统使用的Ubuntu 16.04 TLS,内核版本是4.13.0-45-generic,使用apt installlinux-image-4.13.0-45-generic linux-headers-4.13.0-45-generic就可以安装,内核模组部分依赖就这么多,iptables的编译的话我采用的是1.6.0版本的源代码,官网上能下到压缩包,我的环境下依赖包有apt install libmnl-dev libnftnl-dev flex libbison-dev,安装之后就可以直接编译了,两个都编译好之后因为互相依赖所以先需要用iptables跑一下FULLCONENAT,然后才能加载内核,这里用iptables –t nat –A POSTROUTING –o eth0 –j FULLCONENAT跑一下就行,肯定会报错,然后用insmod加载编译出来的ko模组后FULLCONENAT就可以正常使用了,使用方法可以看github上面的文档,也可以无脑
iptables –t nat –A POSTROUTING –o eth0 –j FULLCONENAT
iptables –t nat –A PREROUTING –i eth0 –j FULLCONENAT
iptables –t nat –A POSTROUTING –o eth0 –j FULLCONENAT
iptables –t nat –A PREROUTING –i eth0 –j FULLCONENAT
然后是全端口转发,这个可以理解成是dmz主机,但是和路由器不一样这里使用的是服务器,因而可能会有些许不稳定,这里我们只要利用iptables的SNAT(源地址NAT)和DNAT(目标地址NAT)就可以在网卡上改写我们的数据包了,注意的是我们改写的一定是NAT这端的ip,而不是公网一端的ip,在数据包发向服务器时,我们将所有的数据包的目标地址改写成我们的电脑ip,然后再数据包从服务器发出去时,将我们电脑的源ip改成服务器ip,如此一来就可以无条件转发端口了,这里提供一些我设置时的命令,照抄肯定是用不了的,但是稍微改一改就能用
iptables -t nat -A POSTROUTING -o eth0 -ptcp --dport 23: -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -ptcp --sport 23: -j DNAT --to-destination 10.8.0.6
iptables -t nat -A POSTROUTING -o eth0 -pudp --dport 23: -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -pudp --sport 23: -j DNAT --to-destination 10.8.0.6
iptables -t nat -A POSTROUTING -o eth0 -ptcp --dport :21 -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -ptcp --sport :21 -j DNAT --to-destination 10.8.0.6
iptables -t nat -A POSTROUTING -o eth0 -pudp --dport :21 -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -pudp --sport :21 -j DNAT --to-destination 10.8.0.6
其中172是公网ip,10是我的电脑上tun0网卡的ip
iptables -t nat -A POSTROUTING -o eth0 -ptcp --dport 23: -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -ptcp --sport 23: -j DNAT --to-destination 10.8.0.6
iptables -t nat -A POSTROUTING -o eth0 -pudp --dport 23: -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -pudp --sport 23: -j DNAT --to-destination 10.8.0.6
iptables -t nat -A POSTROUTING -o eth0 -ptcp --dport :21 -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -ptcp --sport :21 -j DNAT --to-destination 10.8.0.6
iptables -t nat -A POSTROUTING -o eth0 -pudp --dport :21 -j SNAT --to-source 172.104.74.195
iptables -t nat -A PREROUTING -i eth0 -pudp --sport :21 -j DNAT --to-destination 10.8.0.6
其中172是公网ip,10是我的电脑上tun0网卡的ip