UDP NAT 穿透

UDP NAT穿透俗稱p2p打洞。
講到NAT, 追溯一下NAT產生緣由:使用ipv4的時候,地址數量有限,NAT設備可讓接上它的其餘設備在其上共享ip,緩解地址不夠用。固然ipv6的概念早就來臨了,國內推廣的程度和推廣慢緣由這裏就先忽略,下面介紹一下NAT穿透以及實現。服務器

NAT的類型(NAPT)架構

  • 徹底錐型(Full Cone)tcp

    內部地址[internal_ip:internal_port]經過NAT映射外部地址[external_ip:external_port],
     NAT分配端口後,全部外部設備能夠經過這個[external_ip:external_port]和[internal_ip:internal_port]通訊
  • 受限錐型(Restricted Cone), 或者說是IP受限錐型測試

    內部必須主動連接外部,  被訪問的目標設備[tag_exrenal_ip:*]能夠與之任意端口通訊, 而其餘外部IP則不能
  • 端口受限錐型(Port Restricted Cone), 或者說是IP + PORT受限錐型google

    在受限錐型的基礎之上,對端口進一步約束;目標設備[tag_exrenal_ip:tag_port1]能夠與之通訊,而[tag_exrenal_ip:tag_port2]不行
  • 對稱型(Symmetric)阿里雲

    每次對外訪問, NAT映射外部地址[external_ip:external_port]的端口均不同。如:
      當主機A訪問主機B, A的IP被映射爲[ip:port1]後;
      當主機A訪問主機C, A的IP被映射爲[ip:port2]後。

穿透NAT的協議spa

Google穿透協議[RFC3489][RFC5766]系列介紹了[STUN][TURN]協議(協議版本變化),屬於
client-server的協議,經過client與server之間發送數據包,通訊以獲取一些信息。

STUNcode

STUN-client位於NAT後面,它經過與STUN-server交互,發送\接收[協議的]數據報,能夠經過抓包
簡略查看(好比tcpdump)交互過程,最終將NAT類型和內外二元組返回給STUN-client。固然詳細的
通訊過程,查看goole定義RFCxxxx的協議,最好結合開源的client實現結合。

TURNserver

TURN-client一樣和server交互,其做用是穿透失敗,使用中繼,確保通訊成功的低優先級策略。
就是實際數據中轉的傳輸中心,固然若是TURN存在NAT,須要支持hairpin。協議簡要歸納:client
Allocate請求、建立Permission、創建Channel等等,經過在TURN-server上分配一個Port,做爲
己方的一個候選通訊 [ip:port]。

ICE圖片

穿越協議[RFC5245],能夠理解爲對STUN和TURN的擴展,利用STUN\TURN client收集、檢查、優
先級本地候選地址,用於其餘peer使用並用於鏈接。

NAT穿透實現

試驗幾個組件

1.STUN服務器使用google開放stun.l.google.com:19302
  2.TURN使用開源coturn,主機阿里雲便可,支持hairpin
  3.客戶端實現,使用開源ice4j(實現了STUN\TURN的client,協議版本可能有異)

架構

圖片描述

流程

step1:經過ice4j獲取候選[ip:port]
step2:經過login-server權限校驗以及SDP交換
step3:檢測彼方SDP,進而通訊,ice完成

結語

UDP穿透成功,兩端位於對稱NAT後,這裏沒有使用生日攻擊等端口預測,經過realy能夠通訊

測試源碼

相關文章
相關標籤/搜索