1. nat簡介
nat(network address translation,網路位址轉換)是一種廣泛應用的解決ip短缺的
有效方法,nat將內網位址轉和埠號換成合法的公網位址和埠號,建立乙個會話,與公網主機進行通訊。
1.1. nat分類
從實現的技術角度,又可以將nat分成如下幾類:全錐nat(full cone nat)、限制性錐nat(restricted cone nat)、埠限制性錐nat( port restricted cone nat)、對稱nat ( symmetric nat)。
(2)限制性錐nat:限制性錐nat把所有來自相同內部ip位址和埠的請求對映到相同的外部ip位址和埠。但是,和全錐nat不同的是:只有當內部主機先給外部主機傳送資料報,該外部主機才能向該內部主機傳送資料報。
(4)對稱nat:對稱nat與上述3種型別都不同,不管是全錐nat,限制性錐nat還是埠限制性錐nat,它們都屬於錐nat(cone nat)。當同一內部主機使用相同的埠與不同位址的外部主機進行通訊時, 對稱nat會重新建立乙個session,為這個session分配不同的埠號,或許還會改變ip位址。
1.2. nat的作用
nat不僅實現位址轉換,同時還起到防火牆的作用,隱藏內部網路的拓撲結構,保護內部主機。nat不僅完美地解決了lp位址不足的問題,而且還能夠有效地避免來自網路外部的攻擊,隱藏並保護網路內部的計算機。這樣對於外部主機來說,內部主機是不可見的。但是,對於p2p應用來說,卻要求能夠建立端到端的連線,所以如何穿透nat也是p2p技術中的乙個關鍵。
2.p2p穿透nat
要讓處於nat裝置之後的擁有私有ip位址的主機之間建立p2p連線,就必須想辦法穿
透nat,現在常用的傳輸層協議主要有tcp和udp,下面就是用這兩種協議來介紹穿透nat的策略。
2.1.網路拓撲結構
下面假設有如圖1所示網路拓撲結構圖。
圖1.網路拓撲結構圖
server(129.208.12.38)是公網上的伺服器,nat-a和nat-b是兩個nat裝置(可能是整合nat功能的路由器,防火牆等),它們具有若干個合法公網ip,在nat-a阻隔的私有網路中有若干臺主機【clienta-1,clienta-n】,在nat-b阻隔的私有網路中也有若干臺主機【clientb-1,clientb-n】。為了以後說明問題方便,只討論主機clienta-1和clientb-1。
假設主機clienta-1和主機clientb-1都和伺服器server建立了「連線」,如圖2所示。
圖2.clienta-1,clientb-1和server之間通訊
由於nat的透明性,所以clienta-1和clientb-1不用關心和server通訊的過程,它們只需要知道server開放服務的位址和埠號即可。根據圖1,假設在clienta-1中有程序使用socket(192.168.0.2:7000)和server通訊,在clientb-1中有程序使用socket(192.168.1.12:8000)和server通訊。它們通過各自的nat轉換後分別變成了socket(202.103.142.29:5000)和socket(221.10.145.84:6000)。
2.2.使用udp穿透nat
(1)全錐nat,穿透全錐型nat很容易,根本稱不上穿透,因為全錐型nat將內部主機的對映到確定的位址,不會阻止從外部傳送的連線請求,所以可以不用任何輔助手段就可以建立連線。
(2)限制性錐nat和埠限制性錐nat(簡稱限制性nat),穿透限制性錐nat會丟棄它未知的源位址發向內部主機的資料報。所以如果現在clienta-1直接傳送udp資料報到clientb-1,那麼資料報將會被nat-b無情的丟棄。所以採用下面的方法來建立clienta-1和clientb-1之間的通訊。
1.clienta-1(202.103.142.29:5000)傳送資料報給server,請求和clientb-1(221.10.145.84:6000)通訊。
2. server將clienta-1的位址和埠(202.103.142.29:5000)傳送給clientb-1,告訴clientb-1,clienta-1想和它通訊。
4. 為了讓clienta-1知道什麼時候才可以向clientb-1傳送資料,所以clientb-1在向clienta-1(202.103.142.29:5000)打孔之後還要向server傳送乙個訊息,告訴server它已經準備好了。
5. server傳送乙個訊息給clienta-1,內容為:clientb-1已經準備好了,你可以向clientb-1傳送訊息了。
6. clienta-1向clientb-1傳送udp資料報。這個資料報不會被nat-b丟棄,以後clientb-1向clienta-1傳送的資料報也不會被clienta-1丟棄,因為nat-a已經知道是clienta-1首先發起的通訊。至此,clienta-1和clientb-1就可以進行通訊了。
2.3.使用tcp穿透nat
使用tcp協議穿透nat的方式和使用udp協議穿透nat的方式幾乎一樣,沒有什麼本質上的區別,只是將無連線的udp變成了面向連線的tcp。值得注意是:
1. clientb-1在向clienta-1打孔時,傳送的syn資料報,而且同樣會被nat-a丟棄。同時,clientb-1需要在原來的socket上監聽,由於重用socket,所以需要將socket屬性設定為so_reuseaddr。
2. clienta-1向clientb-1傳送連線請求。同樣,由於clientb-1到clienta-1方向的孔已經打好,所以連線會成功,經過3次握手後,clienta-1到clientb-1之間的連線就建立起來了。
2.4.穿透對稱nat
上面討論的都是怎樣穿透錐(cone)nat,對稱nat和錐nat很不一樣。對於對稱nat,當乙個私網內主機和外部多個不同主機通訊時,對稱nat並不會像錐(cone,全錐,限制性錐,埠限制性錐)nat那樣分配同乙個埠。而是會新建立乙個session,重新分配乙個埠。參考上面穿透限制性錐nat的過程,在步驟3時:clientb-1(221.10.145.84:?)向clienta-1打孔的時候,對稱nat將給clientb-1重新分配乙個埠號,而這個埠號對於server、clientb-1、clienta-1來說都是未知的。同樣, clienta-1根本不會收到這個訊息,同時在步驟4,clientb-1傳送給server的通知訊息中,clientb-1的socket依舊是(221.10.145.84:6000)。而且,在步驟6時:clienta-1向它所知道但錯誤的clientb-1傳送資料報時,nat-1也會重新給clienta-1分配埠號。所以,穿透對稱nat的機會很小。下面是兩種有可能穿透對稱nat的策略。
2.4.1.同時開放tcp(simultaneous tcp open)策略
如果乙個對稱nat接收到乙個來自本地私有網路外面的tcp syn 包,這個包想發起乙個「引入」的 tcp 連線,一般來說,nat會拒絕這個連線請求並扔掉這個syn包,或者回送乙個tcp rst(connection reset,重建連線)包給請求方。但是,有一種情況卻會接受這個「引入」連線。
如果 client a-1和 client b-1能夠彼此正確的預知對方的nat將會給下乙個tcp連線分配的公網tcp埠,並且兩個客戶端能夠同時地發起乙個面向對方的「外出」的tcp連線請求,並在對方的 syn 包到達之前,自己剛傳送出去的syn包都能順利的穿過自己的nat的話,一條端對端的tcp連線就能成功地建立了。
2.4.2. udp埠猜測策略
同時開放tcp策略非常依賴於猜測對方的下乙個埠,而且強烈依賴於傳送連線請求的時機,而且還有網路的不確定性,所以能夠建立的機會很小,即使server充當同步時鐘的角色。下面是一種通過udp穿透的方法,由於udp不需要建立連線,所以也就不需要考慮「同時開放」的問題。
2.4.3.問題總結
從上面兩種穿透對稱nat的方法來看,都建立在了嚴格的假設條件下。但是現實中多數的nat都是錐nat,因為資源畢竟很重要,反觀對稱nat,由於太不節約埠號所以相對來說成本較高。所以,不管是穿透錐nat,還是對稱nat,現實中都是可以辦到的。除非對稱nat真的使用隨機演算法來分配可用的埠。
NAT穿越(一) NAT型別
nat分為四種型別 1 完全透明nat full cone nat 從內部主機 in ip ipa 埠 in port porta 傳送的資料對映為 ip out ip ipa 和埠 out port porta 傳送到外網 從伺服器直連到對映的 ip out ip ipa 和埠 out port ...
NAT 原理與NAT穿越
最近在看負載均衡方面的東西中很多都提到了nat穿越,特意在此總結一下 先做乙個約定 內網a中有 a1 192.168.30.112 a2 192.168.30.114 兩個使用者 閘道器x1 乙個nat裝置 有公網ip222.225.80.51 內網b中有 b1 192.168.40.112 b2 ...
NAT 原理與NAT穿越
最近在看負載均衡方面的東西中很多都提到了nat穿越,特意在此總結一下 先做乙個約定 內網a中有 a1 192.168.30.112 a2 192.168.30.114 兩個使用者 閘道器x1 乙個nat裝置 有公網ip222.225.80.51 內網b中有 b1 192.168.40.112 b2 ...