P2P 之 TCP穿透NAT的原理

P2P 之 TCP穿透NAT的原理

P2P 之 TCP穿透NAT的原理
翻译:navy
原文:http://www.andrew.cmu.edu/user/ggw/WBFD.pdf

由于工作需要,在网上找了很长时间P2P的资料,好像只有《P2P 之 UDP穿透NAT的原理与实现(附源代码)》比较有实际意义,可惜又是用UDP实现的,无奈只好找了份英文资料啃,发现很有参考价值,就根据理解翻译了一部分,分享给大家,由于水平有限,有错望多多包涵。如果有人能够继续翻译下去别忘了通知我哦呵呵,wanfeng_001@126.com,感谢。

摘要
防火墙和网络地址转换(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,因为它已经可以确认它们已经建立连接。

posted @ 2005-01-27 18:14 epan 阅读(8031) 评论(30)  编辑 收藏 网摘 所属分类: 转载文章

  回复  引用  查看    
#1楼 2005-06-24 11:33 | liangbowen      
那个PDF下载不了,你有一个copy吗?有的话可以发给我一份吗? palax@163.com

谢谢。

  回复  引用    
#2楼 2005-07-07 17:15 | yinlg [未注册用户]
pdf能给我一份吗? yinlg@21cn.com
  回复  引用    
#3楼 2005-07-07 20:46 | tangmd [未注册用户]
翻译的还可以,能将原文发给我一份吗?tangmingdong@sina.com
谢谢。

  回复  引用    
#5楼 2005-09-01 08:49 | hoogun [未注册用户]
yes, i am look for it too.sent me a copy of the pdf file please! kenny_0_1980@163.com

  回复  引用    
#6楼 2005-09-02 13:37 | PT [未注册用户]
please sent me a copy of the pdf file too

CuteBonze@163.com

  回复  引用  查看    
#7楼 2005-09-17 20:02 | 红日      
能也给我一份Copy吗~3Q

aaron.zcl@gmail.com

  回复  引用    
#8楼 2005-09-21 09:58 | chinajoan [未注册用户]
给我一份好吗 chinachenjoan@hotmail.com
  回复  引用    
#9楼 2005-11-01 11:11 | wk6abc [未注册用户]
顺带给我一份:wk6abc@126.com
谢谢!

  回复  引用    
#10楼 2006-01-12 13:55 | aquila [未注册用户]
jianghy_bj@hotmail.com
  回复  引用    
#11楼 2006-01-19 13:45 | DHaiPing [未注册用户]
给我发一份!
dhp811@yahoo.com.cn

  回复  引用    
#12楼 2006-02-21 16:09 | luomh [未注册用户]
方便时给我一份,先谢了!lshml@yeah.net
  回复  引用    
#13楼 2006-02-26 21:30 | tangyuzhe [未注册用户]
也发我一份吧~~~~
tangyuzhe@126.com
谢谢了

  回复  引用    
#15楼 2006-04-16 12:47 | 牟浩城 [未注册用户]
好,顶:
可以给我一份吗? ruiyusoft@163.com
先谢过

  回复  引用    
#16楼 2006-04-20 11:08 | Lovetv [未注册用户]
  回复  引用    
#17楼 2006-07-25 11:16 | karon [未注册用户]
很好,顶。
只是pdf下载不了,能否发一份,谢谢了
james_shu2004@yahoo.com.cn

  回复  引用    
#18楼 2006-12-26 10:52 | henley [未注册用户]
很好
发给我一份吧?下载不了PDF。谢谢了
fly.call@yahoo.com.cn

  回复  引用    
#19楼 2007-04-28 15:19 | fang [未注册用户]
给我发一份,谢了
stevenfang1216@gmail.com

  回复  引用    
#20楼 2007-06-17 09:41 | newgo [未注册用户]
看文章又长见识了。。。。
谢谢,也发我一份。。。。

  回复  引用    
#21楼 2007-06-17 09:42 | newgo [未注册用户]
呵呵,忘了留EMail : new.ux@126.com
  回复  引用    
#22楼 2008-01-22 17:35 | lantian [未注册用户]
也发给我一份吧,谢谢拉
yingheyin@gmail.com

  回复  引用    
#23楼 2008-02-04 16:18 | lwd [未注册用户]
算我一个
hhmfc@sina.com

  回复  引用    
#24楼 2008-03-16 08:37 | yl [未注册用户]
还我吗?传一份
  回复  引用    
#25楼 2008-03-21 20:05 | lotusleon [未注册用户]
先谢谢了,也给我一份,呵呵!
  回复  引用    
#26楼 2008-05-14 09:58 | zxy123 [未注册用户]
文档里图片没有,能也给我一份Copy吗~3Q
zxy5241@hotmail.com

  回复  引用    
#27楼 2008-06-10 17:33 | hkr [未注册用户]
博主,谢谢你的文章了啊~~好东东
可是...看不见图啊!
能否把pdf文档发给我?(我的邮箱:hungryhuang@126.com)
万分感谢~~

  回复  引用    
#28楼 2008-06-26 21:00 | 邵巍 [未注册用户]
新人报道。不知道还有备份吗!
忘博主能给一份。alleniverson_sw@sina.com
谢谢。

  回复  引用  查看    
#29楼 2008-07-26 15:59 | FEIM Studios      
太好了,居然下载不了。
  回复  引用    
#30楼 2008-09-25 16:16 | chocker [未注册用户]
search "natblaster.pdf" in google, you can find that pdf

发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: