nat源码
‘壹’ NAT C#,要用C#写的、UDP穿越NAT的源码、源码
UDP穿越NAT的话,需要对端配合的,否则没办法穿越,只能对方先在子网后面对公网地址发起UDP呼叫,公网计算机才能在一定时间里回应,回应的UDP包可以穿越nat到达源机器。
如果两边都在子网后面,那就需要作一个状态服务器,维护两方的NAT映射信息。
很简单。我从前做过实验。
你要是已经懂了原理,怎么会做不出程序?
‘贰’ 奔腾NAT的性价比如何值得入手吗
房子里有一个旧的奔腾。到目前为止,除了肉和油,没有什么大问题。2.0吨汽车重量,5AT,1.88,但是TM太贵了,每公里70美分!一汽,最好的基础,最坏的现状,半死不活,东北公司的缩影。我们有几个合资企业,市场改变了技术。
‘叁’ C#UDP穿越NAT,UDP打洞,UDP Hole Punching源代码,该怎么处理
首先要有一个没有nat的公网服务器,
每个用户使用一个端口与服务器通讯 ,服务器在收到用户连入请求后把用户的标识符跟用户的端口号匹配保存起来
当另一个用户请求该用户时把该用户对应的端口号返回 然后用户之间互相用指定端口号联系 就是打洞了
服务器要维系连接要定时发心跳包
‘肆’ TCP穿透NAT
谈谈我的理解:
首先,tcp不同于udp,tcp天生就是不对等的连接,因此穿透nat就显得很困难。
最为简单的一种方式:
客户端:a,b
服务器端(公网)c
a发送消息给c,同时c拿到a的ip端口等信息,将a提出的请求转发给已与c连接的b,b表示同意后发送消息给c,c将消息反馈给a,同时为a和b的通信做准备(分配端口等等),整个过程是客户端到服务器再到客户端,c起中转作用,a与b建立连接实际是a与c,b与c建立的连接。
一般对于可靠性要求较低的应用会使用udp实现。
优点:适用于所有类型网络,简单;
缺点:占用带宽,速度慢。
早期的msn就是这种方式。
第二种方式:TCP的p2p技术。
这种方式是目前最热门的,我也正在看。
转一下来自cmu(卡耐基梅隆)牛人们的研究:
××××××××××××××××
原文:http://www.andrew.cmu.e/user/ggw/WBFD.pdf
由于工作需要,在网上找了很长时间P2P的资料,好像只有《P2P 之 UDP穿透NAT的原理与实现(附源代码)》比较有实际意义,可惜又是用UDP实现的,无奈只好找了份英文资料啃,发现很有参考价值,就根据理解翻译了一部分,分享给大家,由于水平有限,有错望多多包涵。如果有人能够继续翻译下去别忘了通知我哦呵呵,[email protected],感谢。
摘要
防火墙和网络地址转换(NAT)设备对于传统的P2P协议存在一定的问题。一些中间设备抑制了来自外部网络到内部网络的TCP请求,这篇文章的目的就是寻找一个能够在两个NAT设备内部的主机间建立TCP连接的方法。我们已经在两个普通的硬件条件下实现了这个功能。
1.入门
由于32位IP地址的减少,现在出现了很多通过一个internet地址代理内部网络上网的设备,这就是NAT技术。这些设备对于INTERNET已经越来越重要了,但是它们的独立发展因为缺乏标准而对现在的internet协议造成危害。
2.技术
典型的NAT和防火墙设备都是不允许外部地址主动请求而进入内部网络的,如果用户的程序需要在两个内部网络间建立直接性的连接,那么两个内部设备之间必须是相互信任的。如果A和B两个部分都初始化了TCP连接,NAT设备就会认为它们之间是相互信任的,也就允许它们之间的连接了。
图1是一个例子,目标是能够让A和B(分别在NATA和NATB后)建立TCP连接。
我们讨论了多种在特定的NAT设备环境下的TCP连接方案。
如果我们的情况如下:
1、可预测NA的端口,可预测NB的端口,可指定源IP的特定路由
2、可预测NA的端口,可预测NB的端口,不可指定源IP的特定路由
3、随机的NA端口,可预测NB的端口,可指定源IP的特定路由
4、随机的NA端口,可预测NB的端口,不可指定源IP的特定路由
5、随机的NA端口,随机的NB端口,可指定源IP的特定路由
6、随机的NA端口,随机的NB端口,不可指定源IP的特定路由
我们必须作出这4种假设:
1、 两个主机都不受NAT设备所限制;
2、 我们可以配置网络设备使得主机看不到来自外部网络的ICMP包(TTL超过限制),因为这些ICMP数据包无论被任何一方接收到都是中断TCP连接。我们讨论的一些解决方案就依赖通过发送一个初始TTL很小的SYN包来建立TCP连接。一旦SYN包被路由器丢弃,ICMP TTL 超时包就会被传送到NAT设备,我们不允许NAT设备将这个超时TTL的返回包传送到内部网络,即使NAT会将这个包传送到内部,也需要通过配置防火墙来限制这个包到达主机;
3、 即使NAT设备看到ICMP超时的数据包,设备本身的映射表将不会作任何改动;
4、 内部网络的其它主机不会占用抢占这个端口,因为如果网络特别繁忙,这个端口可能会无效。
3.1第一种情况
我们可以通过图2表示的顺序解决问题:
1)A和B可以设定LSR(IP报头中的一个选项)通过X路由发送SYN数据包.
2)X可以缓存它们的数据包并且发送欺骗的SYN+ACKS给NA和NB.
3)A和B可以通过由X发送来的数据进行应答.
4)X丢弃这两个ACK包,因为它已经可以确定A和B相互应答成功.
图2是假设A和B都事先彼此的NAT的通信端口,A知道B的通信端口是NB:5000,B知道A的是NA:4000,并且要求X不在任何NAT设备的后面.实际中这两个端口是预测得到的,预测过程如图3:
3.2第二种情况
第一种情况依赖与自由设定路由,但是现在很多路由器大多都限制这样做,并且会丢弃这样的服务请求包。因此在实际应用中,这种方案失败的可能性很大。如果自由设定路由不可行,我们可以通过out-of-band通道(他们预先与X连接好的TCP连接)来传送原本必须将数据包路由到X才能看到的包。注意在图二的第二步X已经知道了TCP的序号Q和P,因为X已经收到了这两个SYN包,但是如果数据包没有路由经过X就不可能收到它们。为了初始化这个连接,两个主机发送初始SYN包,并且他们都知道是不可能到达目标的,但是它们都可以记住自己的SYN号(个人看法,通过钩子获得发送的数据SYN包)并且可以发送给X,X得到了它们的SYN包,就可以欺骗它们发送ACK包了。有两种方法可以发送无法到达目标的数据包。简单的方法就是每个主机发送一个SYN给对方,要求应答包不会到达内部网络.如果NAT(防火墙)会将应答包传回给内部网络,通常是发送TCP的reset包(RST),如果NAT生成RST包,A和B就不能简单地发送一个向图2中SYN给彼此,因为如果这样NA和NB就无法打洞了呵呵,如果NAT不发送RST包,那么这个TCP连接就不会被中断。另外一个发送无法到达目标网络的SYN包的方法是减小TTL值,使它们无法彼此到达。如果用户无法配置防火墙丢弃这个ICMP应答包,或者NAT不继续传送这个ICMP,这个TCP就不会立即关闭。这个解决方案不能使用一种简单的欺骗,因为我们必须保证源地址的SYN包发送者不会没有收到ICMP的RST包,否则会导致中间设备建立错误路由.仅仅依靠SYN包,NAT就可以建立从internet IP和端口到外部IP和端口的路由.由于欺骗的SYN包是错误的源IP(并非发出者X),这个路由将不会发送到X而是发送到NA或者NB。另外,这种方案都需要设置TTL到足够小,以便于对方的NAT不会收到到各自发出的初始SYN包,否则就无法完成打洞。(图4)
3.3第三种情况
比前两种简单,但是X将无法预见NA或者NB的端口。B将先给X发送一个SYN包告诉以便于X知道它所选用的端口号,然后X将这个信息发送到A,A就可以向这个确定的地址和端口发送SYN,图5是第一种情况的变形::
1)X向图3一样预测端口,但是它不能预测到NA的下一个端口号,但是可以预测NB的下一个端口号是5000,并且可以通知A和B这个节点已经建立了连接;
2)A和B同步节点X;
3)X可以欺骗A和B;
4)A和B相互发送ACK;
5)X丢弃发给它的ACK,因为它已经可以确认它们已经建立连接。
××××××××××××××××
第三种:实现vpn,通过安全的虚拟连接实现,而这样的话就不存在穿透问题,因为vpn是个虚拟网络,tcp在其中是被信任的。
‘伍’ nat1会降低延迟吗
设置好了可以降低的。
-网络环境:
我这边的网络环境,电信189套餐一共送了20条宽带。其中1条300M下30M上,1条100M下20M上,还有18条是50M下10M上,一条100M对等的联通,在加上后期拉的2条500M电信对等,所以家里一共是23条宽带,都为公网IP。3个电信光猫,1个联通光猫,若干路由器,交换机。
-CDN节点共享(闲置流量换钱):
早期,我网络环境没这么多,就玩迅雷的红水晶,再到迅雷路由,再到赚钱宝再到玩客云,可以说是一路走来。其中一代赚钱宝和赚钱宝pro挂的最久,后来不赚钱,就卖掉了大部分,玩客云因为网络的限制,留了几台,大部分抢到就是当倒爷。既然宽带这么多条,涉及到多线多拨,铁定上软路由,选爱快,操作简便,分流效果都挺好。既然有这么多闲置的带宽,刚好玩客云出现了现金,买几台试下,加上宽带提速加成,效果不错,于是就买了20几台,赚点小钱,毕竟穷。
-开始出现问题:
没想这玩意是真的能跑,20多台设备上传流量量速率达到了千兆,我用了几年的3215U 4口的软路由,开始不堪重负,100%的干活,也不知道是不是开繁星导致,反正感觉吃不消,但是上网啥的没问题,但是过了一阵子,发现当ap的ac88u,wifi开始不稳,会掉线,然后比较难连上。这让喜欢吃鸡的女王大人无法忍受,显然,挨骂是一定的。一开始以为是86u断流,用排除法,加上acrh17当ap,问题依旧,看来是就是软路由的锅。刚好电信有个500M对等的优惠套餐,果断办理,为了不受千兆端口限制,让电信小哥,再拉一条光纤,此时家里已经有了4个光猫了,电信3个,联通1。4口的软路由端口开始不够用了。宽带太多,很容易达到千兆瓶颈,一个光猫1G的带宽。
-性能不够硬件来凑
刚好同事需要软路由,把3215u出了。手头上还有dq77kb+e3 1265l v2,买个4口网卡当软路由,年少不懂事,上了淘宝买了i350-t4(寨卡)。不过还好用着没问题。这下性能应该不会瓶颈了,然而,wifi有时会连不上的问提依旧,看来是爱快的bug了,但是爱快用了好多年了,好多配置都在里面,如果换固件,调配置,比如ddns,端口转发,分流啥的,就要弄好久。但是wifi的问题不能不解决,刚好在群里看到有人说爱快,当设备跑多了,就会出现这个情况,上个三层交换机就会解决问题。那就上某鱼淘个二手的三层交换机来试试吧。后来看到群里有有人提到nat类型,对提高收益有帮助。于是大致了解了下,给大伙贴下。
-Nat类型
1. Full Cone NAT(简称NAT1):
所有来自同一 个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当X-Y的转换关系建立之后,任意外部主机均可随时将Y中的地址和端口作为目标地址 和目标端口,向内部主机发送UDP报文,由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不那么安全。
2. Restricted Cone NAT(简称NAT2):
它是Full Cone的受限版本:所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,这与Full Cone相同,但不同的是,只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z)后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部主机发送UDP请求报文,这意味着,NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部主机的UDP报文,从而保障了外部请求来源的安全性。
3. Port Restricted Cone NAT(简称NAT3):
它是Restricted ConeNAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z且端口为P)之后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部主机发送UDP报文,同时,其请求报文的源端口必须为P,这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性。
4. Symmetric NAT(简称NAT4):
这是一种比所有Cone NAT都要更为灵活的转换方式:在Cone NAT中,内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的UDP报文中的目标地址及端口的,即与目标Tuple无关。
上面是我网络出来,反正只要认为nat1是最好的就行,根据我的经验来说,像爱快,高恪之类的软路由都是nat4,。Lede可以nat1,而平常普通路由拨号的nat类型为3,刷高恪和openwrt就可以做到nat1。当然只要你路由器做了dmz也是可以变成nat1,但是这个只能指定内网的一个主机,你多台的就不行。那nat1对提高收益有帮助吗?对此,我还专门做了测试,拿出矿渣newifi3,编译了对应的openwrt固件,感谢lean大雕的源码,开始挂上,做为期几天的测试,结论是确实可以提高收益,而且对p2p游戏下载啥的也有帮助。
-目前支持nat1固件:
openwrt系列,理论能刷的openwrt都可以
k2p高恪固件,
acrh17也可以刷改版梅林实现full cone(感谢大雕的固件,该有的功能都有。)
梅林固件,目前只有新内核才支持,例如ac86u,ax88u。
‘陆’ java tcp nat 打洞
既然知道原理了就按照原理写呗,tcp打洞关键要能地址复用
‘柒’ 广域网实现p2p文件传输 如何实现nat穿透 求java或C++源代码
假设有两台分别处于各自的私有网络中的主机:A和B;N1和N2是两个NAT设备;S是一个使用了一个众所周知的、从全球任何地方都能访问得到的IP地址的公共服务器
步骤一:A和B分别和S建立UDP连接;NAT设备N1和N2创建UDP转换状态并分配临时的外部端口号
步骤二:S将这些端口号传回A和B
步骤三:A和B通过转换好的端口直接联系到对方的NAT设备;NAT设备则利用先前创建的转换状态将分组发往A和B
源码已发送请查收