2013-05-02 115 views
1

我需要在NAT後面實現一個簡單的P2P應用程序。它應該通過可靠和安全的連接發送數據(TCP上的加密數據)。從理論背景我知道在幾個RFC(5389,5769和5780)中描述了幾種NAT穿透技術(例如用於NAT的會話遍歷實用程序)。P2P連接的NAT遍歷實現

雖然在實踐中我找不到需要的工具/庫來實現這樣的系統(最好用C++編程語言)。我已經通過谷歌搜索盲目地發現身邊:ICETURNlibnicelibjingleSTUNTMAN

下面的圖像描述它應該是什麼樣子。我有一個有效IP地址的VPS,一個位於NAT後面的PC和位於另一個NAT後面的傳感器。他們有私人IP。我想讓我的傳感器連接到服務器,找到監視器並向它發送連接請求。連接建立後,不應該使用中繼服務器來引導數據流量。我希望我的傳感器和監測使用此路徑進行通信:

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} <--> R2 <--> Monitor 

目前,所有數據通過VPS傳輸:

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} R1 <--> 
VPS <--> R1 <--> {THE INTERNET} <--> R2 <--> Monitor 

Network

+0

我知道我甚至不應該問,但是端口轉發或UPnP支持是沒有問題的? – 2013-05-02 14:59:49

+0

@AnthonyAccioly不,我只是忘了提及。我完全困惑。不能轉動我的頭並找到一個起點...... – 2013-05-02 15:02:10

回答

2

基本上,如果你可以port forward,那麼這是一個比編程更基礎設施的問題。您只需將路由器配置爲將來自公共IP /端口的流量引導至專用IP /端口,例如:

R2: Port 500 - TCP -> Laptop-PT - Port 500 
R3: Ports 16000/16500 - TCP/UDP -> PDA-PT - Port 16000/16500 

如果你想獲得幻想和你的路由器支持UPnP,只是訴諸實現庫中的IGD protocol(例如,MiniUPnP),爲了使您的應用程序控制端口映射。 This article提供了一個很好的起點以及一些示例代碼(儘管我真的會推薦一個強大的庫)。

+0

我需要訪問路由器配置嗎? – 2013-05-02 15:49:29

+0

是的。無論是手動(如@chris指出,通過它的管理界面配置路由器),或者如果路由器通過UPnP庫支持UPnP(並啓用它)。看看我的回答中的文章,我認爲它會說清楚。 – 2013-05-02 15:55:10

+0

我讀過那篇文章。現在我可以考慮使用UPnP進行端口轉發。那麼,現實世界中的路由器如何?我是否應該擔心在所有數據路徑路由器中缺乏UPnP支持? – 2013-05-02 16:02:38

2

因爲你最終想要的中繼服務器被完全刪除,並希望監視器和終端直接進行通信 - 你真的試圖解決直接通信的問題NAT之間的兩臺服務器之間的通信。

所以有兩個問題需要解決:

1)允許傳感器以獲得監控系統的公共IP地址。

2)允許TCP連接的SYN數據包通過Router-PT R2上的NAT中繼到您的監視器。

繼電器可以提供幫助的第一個問題:您可以使用TURN通過服務器轉發消息,以將監視器的公共IP地址傳送到傳感器。

然而,第二個問題我沒有意識到任何廣義的解決方案,因爲它真的歸結爲路由器上的配置。路由器需要知道NAT後面的許多系統中的哪一個來轉發SYN。它不能將它轉發給所有人:他們都會迴應。

大多數支持NAT的路由器都具有配置設置,允許您配置要將傳入數據包路由到的主機。查看是否使筆記本電腦監控系統成爲DMZ,或將特定TCP端口的流量導向您所需的系統。但是,每個路由器都會以不同的方式處理此配置我沒有注意到這種配置的標準化。

希望有所幫助。

+1

是的,但是由於TCP連接是點對點的,並且您不希望通過中繼服務器轉發數據,所以它無法幫助建立連接(除了,正如我所說的,在獲取顯示器的公共IP地址時) – chris 2013-05-02 15:46:31

+1

換句話說,中繼可以幫助傳送建立TCP連接的參數,但它不能幫助實際的TCP連接進行任何數據傳輸;包括最難的部分 - 發送給TCP連接的第一個數據包:SYN數據包。 – chris 2013-05-02 15:48:40