NAT

NAT(Network Address Translation,網絡地址轉換)是將IP 數據包頭中的IP 地址轉換爲另一個IP 地址的過程


NAT有三種類型:靜態NAT(Static NAT),動態地址NAT(Pooled NAT),網絡地址端口轉換NAPT.


NAT可以分爲Basic NAT和PAT:

Basic NAT只轉化IP,不映射端口

- PAT除了轉化IP,還做端口映射,可以用於多個內部地址映射到少量(甚至一個)外部地址。


目前常用的針對UDP的NAT 穿透(NAT Traversal)方法主要有:STUN、TURN、ICE、uPnP等



Full cone NAT
即著名的一對一(one-to-one)NAT
一旦一個內部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外發送。任意外部主機都能通過給eAddr:port2發包到達iAddr:port1
Address-Restricted cone NAT
限制地址,即只接收曾經發送到對端的IP地址來的數據包。
一旦一個內部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外發送。任意外部主機(hostAddr:any)都能通過給eAddr:port2發包到達iAddr:port1的前提是:iAddr:port1之前發送過包到hostAddr:any. "any"也就是說端口不受限制

Port-Restricted cone NAT
類似受限制錐形NAT(Restricted cone NAT),但是還有端口限制。
一旦一個內部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發自iAddr:port1的包都經由eAddr:port2向外發送。一個外部主機(hostAddr:port3)能夠發包到達iAddr:port1的前提是:iAddr:port1之前發送過包到hostAddr:port3.


Symmetric NAT(對稱NAT)
每一個來自相同內部IP與port的請求到一個特定目的地的IP地址和端口,映射到一個獨特的外部來源的IP地址和端口。
同一個內部主機發出一個信息包到不同的目的端,不同的映射使用
外部主機收到了一封包從一個內部主機可以送一封包回來


類型檢測:

第一步:檢測客戶端是否有能力進行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會話打開了,洞打好了!

雙方此時都可以把對方介紹給其他主機,充當媒介


發佈了42 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章