⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nat爆破者:在不同nat后的主机间建立tcp连接.txt

📁 P2P穿透NAT的一次探讨和局部实现
💻 TXT
📖 第 1 页 / 共 4 页
字号:
      (c)NB:5000→NA:m,LSR:X,SYN:Q
      这两个SYN包是由TCP的connect()函数调用所产生。
      这两个SYN在NAT的NA和NB上各自创建了预期的映射。
    3.调用Case1(m,5000)

5.7 情况4:<随机的,可预测的,no LSR>
A               X               B
|-------2a----->|               |
|-------------->|               |
|-------------->|               |
|┆             |               |
|-------------->|-------3------>|
|<--------------|-------4-------|
|<--------------|---------------|
|<--------------|---------------|
|               |┆             |
|<--------------|---------------|
|-------5------>|               |
|               |-------6------>|
|          Case2|(m,5000)       |
	    图5:情况4
    情况4的环境是<随机的,可预测的,no LSR>。我们已经为这个依靠于随机的且不拒绝一个带了残废的且对应于在NAT后主机在前面的初始连接的ACK或者校验和域的TCP包的NAT环境开发了一个方案。这方案被呈现在图5中并解释如下。
    1.X做了关于5.1节描述的端口预测。X不能预测到NA的下一端口,但能预测到NB的下一端口是5000,并经由已经存在的连接告知A和B。
    2.A发送T个SYN包到B,这些包不是被对方的NAT所抛弃就是由于TTL过期而被抛弃。
      i = 0
      While i < T
          NA:rand →NB:5000, SYN:anything
          i = i+1
      End While
      这会在NAT NA上创建T个映射,B将最后用SYN+ACK猜到的就是其中一个。
    3.X通知B开始发送SYN+ACK包到NA
    4.B发送许多SYN+ACK包到NA直到有一个到达A
      i = 1024
      While A 还没报告成功
          NB:5000 →NA:i,
          SYN+ACK:,anything,anything, Payload:i
          i = i+1
      End While
    5.A报告穿过NAT的包负荷。
      NA:3999→X:1234,工作于端口m
      A通过监听来自NB的任何SYN+ACK包的数据报,将可看到这个残废的SYN+ACK包。
    6.X告诉B连接到A的端口m
      B现在知道SYN包可以发向哪里。
    7.调用Case2(m,5000)

    在步骤2中A所发送的T个SYN包是独立于任何TCP的connect()函数调用。他们仅仅是使用在NAT上创建了T个映射的libnet库所产生的包。另一方面,Case2调用的步骤2所产生的SYN包是由A和B的TCP的connect()函数调用所产生的。这情况4环境的方案依靠于随机生成端口的NAT的行为。这方案依靠于拒绝带有错误的如序列号或者校验和域的TCP包的中间件。
    T值能够被选择,像B在生成T个SYN+ACK到随机目的端口号后有95%的机会猜到一个正确的外部端口。其实,A的NAT随机地选择T的数目(它的外部端口数),这时B必须一直维持猜测直到在A的NAT可选集中B选择到了一个。我们能够使用一个概率分析来构造一个高效的且最小工作量被A和B所预算的设想。设PrG是B猜到在T个实验中最少一个是正确的概率。价设A的NAT已经在[1025,65535]的范围中选择了T个不同的端口号,如果B选择T个不同的端口号,在A的NAT可选集中B不能选择到一个号的可能性是
    Pr_G =n-T/n * n-1-T/n-1 * n-2-T/n-2 * . . . * n-(T -1)-T/n-(T -1)
其中n是可能选择的端口数(n=65535-1024=64511)。
         T-1
    Pr_G =∏n-i-T/n-i
         i=0
反之,在T个实验中猜到一个是正确的可能性是
    PrG = 1-Pr_G
像之前的规定,T可能被选择如
    PrG > 95%
      T-1
    1-∏n-i-T/n-i> 95%
      i=0
计算T的量为T=439的这个乘积。
      439-1
    1-∏64511-i-439/64511-i=0.9506> 95%
      i=0
这结果说明如果A发送439个使在A的NAT外部端口得到不同的随机的映射的SYN包,并且B发送许多不同的随机的到目的端口的SYN+ACK包,B在它发送第440个AYN+ACK包之前就有大于95%的机会正确地猜测到439个外部端口映射的其中一个。
    仅仅发送T个SYN包的原因是这至少要使用两个资源,第一个是网络带宽的使用量,第二是在NAT上创建映射的数量。

5.8 情况5:<随机的,随机的,LSR>
┌─────┐   ┌─────┐
│NA端口了解|    │NB端口了解|
└─────┘   └─────┘
    │      ↑  ↑     │
    │       \  /      │
    │        \/       │
    │        /\       │
    ↓       /  \      ↓
┌─────┐   ┌─────┐
│    A    │   │    B     │
└─────┘   └─────┘
	图6:资源图表死锁
A               X               B
|-------2a----->|<------2b------|
|<------2c------|-------2c----->|
|-------3a----->|<------3b------|
|          Case1|(m,n)          |
	    图7:情况5
    在情况5中的环境是<随机的,随机的,LSR>。为了允许X同步到A和B,B必须要知道NA预先发送它的SYN包时所选的端口号。为了确定NA选择的端口,X不得不看A的SYN包。A的SYN包不能被发送直到X确定NB所选的端口号为止。这个死锁被制成图6的插图。A控制NA端口资源以致不外发SYN包,有效的预防了X知道NA所选的端口号。同样的,B也控制NB端口资源。在他们能够释放所控制资源之前,每端都需要对方的端口。我们让A和B各发送两个SYN包可松散源路由穿过X且不连接到TCP connect()调用的方案来预防这个死锁。这两个SYN包在各自的NAT上创建了所需的映射并允许X获得两个资源,同时等同于情况1和2的类似方式连接。我们情况5的方案展示在图7中并解释如下。
    1.X做了关于5.1节述的端口预测。X不能预测到NA或者NB的下一端口并经由已经存在的连接告知A和B。
    2.A和B都发送一个SYN包松散源路由穿过X
     (a)NA:m→NB:anything SYN:anything,LSR:X
     (b)NB:n→NA:anything SYN:anything,LSR:X
     (c)X报告m给B并报告n给A。
      这两个SYN将在各自的NAT上创建所需的映射。
    3.A和B发送一个SYN到对方松散源路由穿过X
      (a)NA:m→NB:n,LSR:X,SYN:P
      (b)NB:n→NA:m,LSR:X,SYN:Q
      因为一致转换,即使目标端口和之前的步骤有所不同,NAT仍然为这个包利用所使用的相同映射(因此相同的外部端口号)。
    4.调用Case1(m,n)

    注意,SYN包发送步骤2不是关联到任何TCP的connect()函数调用,而更合适的,步骤3的SYN包发送应归于一个TCP的connect()函数调用。同理,Case1的调用中SYN+ACK包发送步骤3不绑定到TCP的accept()函数子程序。

5.9 情况6:<随机的,随机的,no LSR>
A               X               B
|-------2------>|<------2-------|
|-------------->|<--------------|
|-------------->|<--------------|
|┆             |┆             |
|-------------->|<--------------|
|-------3-------|-------------->|

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -