前言
1.在客戶端發送SYN包後,
客戶端的 seq#(序列號):P,ack#(應答號):N/A
服務端的 seq#(序列號):N/A,ack#(應答號):N/A
2.在服務端接收到SYN包和發送SYN+ACK後,
客戶端的 seq#(序列號):P,ack#(應答號):N/A
服務端的 seq#(序列號):Q,ack#(應答號):P+1
3.在客戶端接收到SYN+ACK和發送ACK後,
客戶端的 seq#(序列號):P,ack#(應答號):Q+1
服務端的 seq#(序列號):Q,ack#(應答號):P+1
4.在服務端接收到ACK後,
客戶端的 seq#(序列號):P,ack#(應答號):Q+1
服務端的 seq#(序列號):Q,ack#(應答號):P+1
在三次握手最後的狀態必須被我們的方案所複製到,即使兩個端點假定爲客戶的角色。在每個方案的最後,各個端點的應答號必須是大於他們的夥伴的序列號。我們的方案完成這個協調。
5.3 低的TTL值確保
我們的方案某些是依賴於設置一個TCP包的TTL值,因此包將離開端點的內部網絡,但沒到達夥伴的NAT。對不同的網絡這個值將不同,因此它必須能被動態確定。
爲了確定夥伴距離有多遠,一個端點可以使用典型的路由追蹤方法。就是,發送從1開始而不斷增加的TTL值的SYN包。當TTL失效時各個包將導致ICMP TTL過期包被髮回到端點。通過分析返回的ICMP TTL過期包可以爲連接中低的TTL值確定一個保險值。
許多NAT不將ICMP TTL過期包發回內部主機,所以一個端點可以議定當一個ICMP TTL過期包沒有被返回時,用一個TTL值來引發一個包離開內部網。
同樣地,在NAT返回ICMP TTL過期包,通過分析夥伴的NAT的消息,端點必須以發現的保險的TTL值爲基礎。如果夥伴的NAT產生一個RST包,則端點可以使用一個比所產生的RST包小1的TTL值。如果端點沒有得到RST包但開始停止接收ICMP TTL過期包,則可以確定夥伴的NAT用了拋棄不請自來的消息而沒有響應的保險行爲。事實上,這種情況和端點的NAT沒有返回ICMP TTL過期包是一樣的。
這個保險TTL值的確定不需要任何其它端點的參與。因此,它可以在保險低的TTL值被用於連接之前就被確定。
5.4 情況1:<可預測的,可預測的,LSR>
A X B
|-------1a----->|<------1b------|
|<------2a------|-------2b----->|
|-------2b------|-------------->|
|<--------------|-------3a------|
|-------4a----->|<------4b------|
圖2:情況1
我們使用符號“NA:4000→NB:5000,選項/負荷”來表示在英特網上從NA到NB所傳送的包內容。這符號意味着包有一個NA的IP源地址,源端口4000,目的地址NB的IP地址,和目的端口5000。此外,在目的端口後是其它的任何重要選項或負荷值。選項包含LSR:X、SYN:P、ACK:Q和SYN+ACK:R,S。LSR:X表明包將可鬆散源路由到X。SYN:P,ACK:Q表明跟隨的序列號或者應答號的TCP包的類型。SYN+ACK:P,Q+1表明包是一個序列號爲P和應答號爲Q+1的TCP SYN+ACK包。首先我們展示情況1<可預測的,可預測的,LSR>,其中所使用的事件序號在圖2中能找得到。
1.A和B個發送一個可鬆散源路由的SYN包穿過協助者X到對方
(a)NA:4000→NB:5000,LSR:X,SYN:P
(b)NB:5000→NA:4000,LSR:X,SYN:Q
這兩個SYN包由TCP的connect()函數調用產生。SYN在NAT NA和NB上都創建了預期的映射。在NA上的映射將允許後面被轉播向A而來自NB:5000的通信並籤準。
2.X緩存兩個包並向A和B各自發了對方所用的ISN
(a)X:1234→NA:3999,B剛用的ISN Q
(b)X:1235→NB:4999,A剛用的ISN P
各個端點都需要他們的夥伴的ISN,這樣他們才能構造出一個合法的SYN+ACK包。
3.A和B各向對方發送一個SYN+ACK包
(a)NB:5000→NA:4000,LSR:X,SYN+ACK:Q,P+1
(b)NA:4000→NB:5000,LSR:X,SYN+ACK:P,Q+1
這兩個SYN+ACK包是由運行於各個端點的獨立線程所產生的。A和B重新使用了原來的序列號P和Q作爲在SYN+ACK中的序列號,並保證了所複製的序列號和應答號的最後狀態和5.2節討論的真實的TCP連接一樣。
4.A和B各向對方發送一個ACK包
(a)NA:4000→NB:5000,LSR:X,ACK:Q+1
(b)NB:5000→NA:4000,LSR:X,ACK:P+1
一旦欺騙的SYN+ACK包被接收到,TCP堆棧將自動地爲我們做這一步。
5.X拋棄兩個到達的ACK包,因爲沒有任何一個端點期望接收到這個ACK。
圖2假定了A和B知道他們的夥伴將使用哪個端口來工作;由於各個端點和它的夥伴都必須提前知道對方的信息,所以這一假設是合理的。首先第一步,X必須完成對A和B的端口預測,因此X能預測到NAT設備選擇的端口。A必須知道NB工作於5000端口,同時B必須知道NA工作於4000端口。爲簡單化,可以假定X自己沒有在NAT後面,但唯一的假定前提是X必須預先直接連接到A和B。
情況1存在一種變種的方案。X可以發送在第2和第3步所需的SYN+ACK欺騙包,這似乎好於發送信息到A和B以使他們自己能夠僞造SYN+ACK包。我們選擇目前的方法是因爲如果X發送SYN+ACK欺騙包,他們將被路由器拋棄的總比通過的多。此外,發送從X到A和B的SYN+ACK僞造包需要超級用戶權限。而A和B爲了其它的目的必須且已經運行於超級用戶權限。
在我們的技術中,從步驟2到5是這樣考慮的,我們將申明函數Case1(integer extPortA, integer extPortB)作爲執行步驟2到5,把參數extPortA和extPortB各自取代外部端口4000和5000。
A X B
|-------2a----->|<------2b------|
|-------3a----->|<------3b------|
|<------4a------|-------4b----->|
|-------5b------|-------------->|
|<--------------|-------5a------|
|-------6a----->|<------6b------|
圖3:情況2
情況1依靠於可用的鬆散源路由。許多路由器目前設置了預防鬆散源路由,同時將具有代表性地拋棄請求服務的包。同樣地,依靠於鬆散源路由的技術在實際中將有很高的概率會失敗。如果松散源路由不可利用,SYN序列號可以利用一個外出通道(他們預先連接到X的連接)和X通信,而不是物理性地讓X看到包。注意圖2的步驟2,X知道TCP序列號P和Q,因爲X正確地接收到兩個SYN包。沒了LSR就不是這種情況了。
爲了初始連接,每端主機發送一個初始的SYN包到他們的夥伴,雖然他們知道將不能到達目的地。他們這時嗅探包離開網絡,記錄序列號,並報告這個信息給X。X需要這些包的TCP序列號,如此它將能夠轉播這些信息回到A和B,那樣他們就能夠產生SYN+ACK包。兩條路線所發的包都不會到達他們所標明地址的目的地。
更簡單的方案是每個端點各發送一個不被考慮的SYN到他們夥伴。在接收端適當的設置NAT和防火牆,他們將由於沒有映射存在而不會向前發送這些包到內部網絡主機。一些NAT和一些防火牆將發送TCP重置包(RST)到這個不請自來的包的源地址。如果NAT產生RST包,A和B不能簡單的像圖2裏步驟1的建議一樣發送一個SYN包到對方,因爲在接受到RST,NA和NB將終止所建立的洞。如果NAT沒有產生RST包,打開的TCP連接將不會突然終止。
另一種確保SYN包將不會到達它的目的網絡的方法是發送帶有低於夥伴的NAT路徑長度的TTL值的SYN包。這包將會在去目的地的路上被明確地拋棄,並且TCP RST包將不會被任何發送者看到。更確切地說,一個ICMP過期包將被看到,並且產生一個問題,因爲ICMP過期包突然地終止一個TCP連接。然而,如果使用者能夠設置他們本地的防火牆拋棄ICMP包或者如果NAT不會發送ICMP消息包到它的內部網絡,TCP連接的嘗試將不會突然終止。
一個方案不能包括簡單的欺騙源地址的SYN包,使發送者不會接收到ICMP包或者RST包。這樣做會在中間件創建一個殘廢的映射。中間件在看到一個SYN包時,將創建一個從內部IP地址和端口到外部IP和端口的映射。然而,由於一個欺騙的SYN包有一個錯誤的源IP地址,映射將不會對應到內部網絡的主機。此外,一個方案不能包括把TTL設置低到連中間件都看不到SYN包,因爲這樣做不會創建我們需要的允許外部後面發到內網的通信的映射。
假定一個<可預測的,可預測的,no LSR>環境,這種連接就像我們現在在圖3所描述的。
1.X做了關於5.1節描述的端口預測。X預測到NA的下一端口是4000並預測到NB的下一端口是5000,並經由已經存在的連接告知A和B。
2.A和B各自發送一個SYN包到對方,他們知道這個包將會被對方的NAT拋棄或者由於TTL過期而被拋棄。
(a)NA:4000→NB:5000,SYN:P
(b)NB:5000→NA:4000,SYN:Q
這一點是在各個端點的真實TCP的connect()函數調用所產生的。SYN包由TCP堆棧產生。這在NAT上創建了允許後面的來自夥伴IP地址和端口的通信通過併到達端點的映射。
3.A和B各自發送他們自己所留意的ISN(P和Q)到X。
(a)NA:3999→X:1234,剛使用的ISN號P
(b)NB:4999→X:1235,剛使用的ISN號Q
各個端點都需要它的夥伴的ISN,如此他們才能夠構造合法的SYN+ACK包從而發到他們的夥伴。
4.X發送A和B的對方各自所留意的ISN到A和B
(a)X:1234→NA:3999,B剛使用的ISN號Q
(b)X:1235→NB:4999,A剛使用的ISN號P
5.A和B各自發送一個SYN+ACK包到對方
(a)NB:5000→NA:4000,SYN+ACK:Q,P+1
(b)NA:4000→NB:5000,SYN+ACK:P,Q+1
這是三次握手的第二部分。此外,A和B重用了他們原來的序列號P和Q作爲在SYN+ACK中的序列號,並保證了所複製的序列號和應答號的最後狀態和5.2節討論的真實的TCP連接一樣。
6.A和B各自發送一個ACK包到對方,他們知道這包將會被對方的NAT拋棄或者由於TTL過期而被拋棄。
(a)NA:4000→NB:5000,ACK:Q+1
(b)NB:5000→NA:4000,ACK:P+1
TCP堆棧將自動地爲我們發送這些ACK包來完成三次握手。我們不想ACK包到達他們的目的地,由於沒有任何一方在等待ACK包。
作爲步驟4到5而和情況1很相似的另一種方法,是X可以欺騙A和B所需的SYN+ACK包。然而,我們爲了某些類似在情況1中的原因選擇了目前的方法。
由於步驟2到6在我們的技術中是可重複利用的,所以我們做了函數Case2(integer extPortA, integer extPortB)作爲執行步驟2到6,用參數extPortA和extPortB分別替代了外部端口4000和5000。
5.6 情況3:<隨機的,可預測的,LSR>
A X B
|-------2a----->| |
| |-------2b----->|
| |<------2c------|
| Case1|(m,5000) |
圖4:情況3
情況3<隨機的,可預測的,LSR>類似於圖2所描述的情況1。然而,X不能夠預測到兩個NAT中的一個的端口,比方說NA。A首先不得不發送它的SYN包來允許X查看NA所選的端口。X將報告這一信息給B,因此B能夠發送它的SYN包到正確的目標IP地址和端口。這個情況1的修改版在圖4中描述並解釋如下。
1.X做了關於5.1節描述的端口預測。X不能預測到NA的下一端口,但能夠預測到NB的下一端口是5000,並經由已經存在的連接告知A和B。
2.A和B同步經由X
(a)NA:m→NB:5000,LSR:X,SYN:P
(b)X讓B知道NA工作於端口m
(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上創建映射的數量。
┌─────┐ ┌─────┐
│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-------|-------------->|
|<--------------|-------3-------|
|---------------|-------------->|
|<--------------|---------------|
|---------------|-------------->|
|<--------------|---------------|
|┆ |┆ |
|---------------|-------------->|
|<--------------|---------------|
|-------4------>|<------4-------|
|<------5-------|-------5------>|
| Case2|(m,n) |
圖8:情況6
情況6的環境是<隨機的,隨機的,no LSR>。回顧圖6的資源圖表死鎖,A和B從包不可鬆散源路由保存端口的資源信息。這情況的方案被畫成圖8並解釋如下。
1.X做了關於5.1節述的端口預測。X不能預測到NA或者NB的下一端口並經由已經存在的連接告知A和B。
2.A發送T個SYN包到B同時B發送T個SYN包到A,這些包將被在另一端的NAT拋棄或者由於TTL到期而被拋棄。
i=0
While i<T
NA:rand→NB:rand,SYN:anything
NB:rand→NA:rand,SYN:anything
i=i+1
End While
這些SYN包在兩邊的NAT上各創建了T個映射。
3.B和A發送許多SYN+ACK包到他們的夥伴的NAT直到有一個到達他們的夥伴那裏。
i=1024
While A 還沒報告成功
NB:rand→NA:i
SYN+ACK:,anything,anything,Payload:i
NA:rand→NB:i
SYN+ACK:,anything,anything,Payload:i
i=i+1
End While
4.A和B報告通過NAT的包負荷。
NA:3999→X:1234,工作於端口m
NB:4999→X:1235,工作於端口n
5.X告訴B連接到A的端口m並告訴A連接到B的端口n。
A和B現在知道他們的夥伴的外部端口號。
6.調用Case2(m,n)
情況6遠比情況4困難,因爲各個端點必須在對方的NAT上正確地猜到一個完整的映射〈源端口,目的端口〉。在情況4中,在非隨機的NAT後的端點能夠正確地猜到目的端口。當其中一個NAT是可預測時,源端口就被固定了。情況6的搜索空間是情況4的平方,替代64511種可能的是4161669121種結合需要猜測。
我們已經在LINUX工作站,通過調用libnet和libpcap使用C實現了第2種和第4種情況。第1、3、5、6種情況沒有實現。
協助者和端點都連接到由單獨功能組成的庫。協助者程序natblaster_server()只需提供其協助者所要監聽的端口號。端點連接程序需要提供7個參數:(1)協助者的IP地址和(2)端口號,(3)本地端點外部IP地址,(4)內部IP地址,和(5)端口號,(6)夥伴外部IP地址,和(7)端口號。本地端點和夥伴的端口號必須由協助者幫助爲試圖的連接建立一個唯一標誌符。三元組<本地外部IP,夥伴內部IP,夥伴內部端口>被用於在協助者上的唯一標誌。庫試圖提供一個指定端口的套接字,然而,所返回的套接字不被保證是所指定的端口號。假設natblaster_connect()工作,庫返回一個有效的套接字句柄。
爲了測試我們的實現,我們在分離的網絡上運行兩個端點,每個都位於不同的且有效的NAT後面。第三部分的程序被運行於不在NAT之後的第三部計算機上。我們在英特網上做了比本地網絡更多的測試,來確保測試更真實。
爲了創建不會到達夥伴那裏並不返回錯誤消息的包,我們設置了TTL值使其低到不會到達夥伴那裏。設置低的TTL值由調用IP_TTL選項的setsockopt()系統調用完成。這選項也需要一個TTL值。這個值必須低於到夥伴的跳躍數,但必須要大於到外部最遠的NAT的跳躍數。這套接字選項對於套接字的整個生存期來說必須不是持久不變的。例如,在三次握手成功之後,setsockopt()應該被再一次調用來提高 TTL值,這樣後面的數據才確保能到達端點。依靠的是一個低的TTL只工作於是否一個ICMP TTL過期包不被端點的TCP堆棧看到,因爲這過期包會導致在端點的套接字失敗。我們所測試的NAT都不向前發送ICMP TTL過期包到內部網絡。另一種方法是將發送普通包並希望夥伴的NAT默默地丟棄它們,然而,一些NAT可能發送RST包來響應那些未請自來的數據。這行爲是詳細的執行過程。我們沒使用5.3節所描述的TTL決定技術;而是我們選擇了我們知道是合適的並且低而普通的TTL值。
我們爲連接前診斷實現了連續的端口分配方法,但沒有實現一致轉換。我們的實現沒有使用一致轉換。
我們的情況2和情況4的實現都非常成功並且能打開直接的TCP連接。情況2真實的打開了連接,而情況4有很高的機率是成功的(就是上面所討論的,成功率取決於在預測相位的端口發送SYN和SYNACK的數量)。
由於5.9節最後所給的原因,我們沒有實現情況6。我們沒實現情況1,3和5是因爲LSR在英特網上不是典型地可用的並且我們相信這在實踐中會有較低的成功率。
如前面所論述的,我們使用了增加系統調用所需的標準的Berkelet網絡實現。例如,當我們發送一個SYN包但需要知道序列號時,這個SYN包由使用標準的connect()調用所發送的,之後首先開始一個線程來爲所發的SYN包觀測數據報。這線程能報告所使用的序列號。
情況2和情況4必須有root的執行權,因爲這是libnet和libpcap所要求的。由於無需欺騙或者探嗅,第三方可以以一般用戶的權限運行。
7. 總結
我們已經證明了如何在兩個不同的典型的NAT後面的主機之間建立直接的TCP連接,這些解決方案都沒有以任何方式改變TCP/IP棧,而是爲這些主機建立連接起到了槓槓作用。我們的方案可以爲很多的程序所應用,從點對點的通信到即時消息通信。對於這個問題已經存在解決方法包括代理都沒有有效地利用網絡資源並且伸縮性不好。
隨着IPv6的到來,NAT也許就不再是個網站的組成了,但是,這些情況包括可預測NAT也可以被應用到使用狀態的防火牆後面的主機。跟NAT相似,“狀態防火牆”有能力只允許從他們所包含的內部網絡發起的連接。我們的解決方案雙方都可以初始話一個這些防火牆都允許的TCP連接。我們的幾種方案在配置有IDSes的場合是不可取的,因爲在第四和第六種情況下,都使用了類似於端口掃描的技術。這種情況下最後關閉這樣的網絡監視設備。儘管如此,我們地解決方案對於大部分的網絡來說一般是足夠的,甚至對於那些可能都不存在的使用隨機分配地址的NAT來說也是適用的。
8. 參考文獻
[1] Bryan Ford. NatCheck: Hosted by the MIDCOM-P2P
project on SourceForge.
http://midcom-p2p.sourceforge.net.
[2] Bryan Ford, Pyda Srisuresh, and Dan Kegel. Peer-to-Peer
Communication Across Network Address Translators. In
USENIX Annual Technical Conference, Anaheim, CA, April
2005.
[3] Groove Networks. http://groove.net.
[4] Saikat Guha, Yutaka Takeday, and Paul Francis. NUTSS: A
SIP-based approach to UDP and TCP Network Connectivity.
In SIGCOMM 2004 Workshops, Aug 2004.
[5] M. Holdrege and P. Srisuresh. Protocol Complications with
the IP Network Address Translator. RFC 3027, Internet
Engineering Task Force, January 2001.
[6] Hopster: Bypass Firewall Bypass Proxy Software.
http://www.hopster.com.
[7] Information Sciences Institute. Transmission Control
Protocol (TCP). RFC 793, Internet Engineering Task Force,
September 1981.
[8] Brad Karp, Sylvia Ratnasamy, Sean Rhea, and Scott
Shenker. Spurring Adoption of DHTs with OpenHash, a
Public DHT Service. In Proceedings of the 3rd International
Workshop on Peer-to-Peer Systems, Feb 2004.
[9] Y. Rekhter, B. Moskowitz, D. Karrenberg, G. J. de Groot,
and E. Lear. Address Allocation for Private Internets. RFC
1918, Internet Engineering Task Force, February 1996.
[10] J. Rosenberg, J. Weinberger, C. Huitema, and R. Mahy.
STUN - Simple Traversal of User Datagram Protocol (UDP).
RFC 3489, Internet Engineering Task Force, September
2003.
[11] P. Srisuresh and K. Egevang. Traditional IP Network
Address Translator (Traditional NAT). RFC 3022, Internet
Engineering Task Force, January 2001.
[12] P. Srisuresh and M. Holdrege. IP Network Address
Translator (NAT) Terminology and Considerations. RFC
2663, Internet Engineering Task Force, August 1999.
[13] P. Srisuresh, J. Kuthan, J. Rosenberg, A. Molitor, and
A. Rayhan. Middlebox communication architecture and
framework. RFC 3303, Internet Engineering Task Force,
August 2002.
[14] Jason Thomas, Andrew Mickish, and Susheel Daswani. Push
Proxy: Protocol Document 0.6, June 2003.
[15] Michael Walfish, Jeremy Stribling, Maxwell Krohn, Hari
Balakrishnan, Robert Morris, and Scott Shenker.
Middleboxes No Longer Considered Harmful. In
Proceedings of USENIX Symposium on Operating Systems
Design and Implementation, December 2004.
http://sourceforge.net/projects/natblaster