NAT(Network Address Translation,網絡地址轉換)是將IP 數據包頭中的IP 地址轉換爲另一個IP 地址的過程
NAT可以分爲Basic NAT和PAT:
Basic NAT只轉化IP,不映射端口。
目前常用的針對UDP的NAT 穿透(NAT Traversal)方法主要有:STUN、TURN、ICE、uPnP等
一旦一個內部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外發送。任意外部主機都能通過給eAddr:port2發包到達iAddr:port1
一旦一個內部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外發送。任意外部主機(hostAddr:any)都能通過給eAddr:port2發包到達iAddr:port1的前提是:iAddr:port1之前發送過包到hostAddr:any. "any"也就是說端口不受限制
Port-Restricted cone NAT
Symmetric NAT(對稱NAT)
類型檢測:
第一步:檢測客戶端是否有能力進行UDP通信以及客戶端是否位於NAT後?
第二步:檢測客戶端NAT是否是Full Cone NAT?
第三步:檢測客戶端NAT是否是Symmetric NAT?
第四步:檢測客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?
NAT穿透:
一、轉發:
Server S
18.181.0.31:1234
|
|
+----------------------+----------------------+
| |
NAT A NAT B
A-S 155.99.25.11:62000 B-S 138.76.29.7:31000
A-B 155.99.25.11:62001 B-A 138.76.29.7:31001
| |
| |
Client A Client B
10.0.0.1:1234 10.1.1.3:1234
----------S轉發A和B之間的消息------------
二、反向連接
Server S
18.181.0.31:1235
|
|
+----------------------+----------------------+
| |
NAT A |
155.99.25.11:62000 |
| |
| |
Client A Client B
10.0.0.1:1234 138.76.29.7:1234
客戶端B就只能通過服務器S來請求A做一個"反向"連接到客戶端B,客戶端A將打開一個與客戶端B通訊的連接(在B的公網IP地址和端口號上).NAT A允許這個連接通過,因爲這個連接起源於NAT A的內部,並且同時客戶端B能夠受這個連接因爲B並不位於NAT之後.
三、 UDP打洞
1).
Server S
18.181.0.31:1234
|
|
+----------------------+----------------------+
| |
NAT A NAT B
155.99.25.11:62000 138.76.29.7:31000
| |
| |
Client A Client B
10.0.0.1:1234 10.1.1.3:1234
A -------------(udp-packet)-------------->> B A發送一個UDP包給B的公網IP
A -------------- S ------------------->> B A通過S邀請B給A發送UDP到公網IP
這樣,一對UDP會話打開了,洞打好了!
雙方此時都可以把對方介紹給其他主機,充當媒介