Networking
UDP 或 TCP 打孔以連接兩個對等點(每個對等點位於路由器後面)
我正在嘗試將我的電腦直接(沒有第 3 方伺服器)連接到朋友的電腦。我們都在 ISP 路由器後面,並且希望(作為一個挑戰!)在不修改路由器配置的情況下進行連接。
myself$ nc -p 7777 public-ip-friend 8888 friend$ nc -p 8888 public-ip-myself 7777
和 UDP 打孔:
myself$ nc -u -p 7777 public-ip-friend 8888 friend$ nc -u -p 8888 public-ip-myself 7777
但他們都沒有工作。
如何解決這個問題?
注意:VPS(不在 NAT 後面)<–> 我的家用電腦(仍在路由器後面)使用相同的方法工作。
有時問題中給出的命令會起作用,但有時不會。
這就是原因。
比方說:
- 我本地網路上的電腦 IP:192.168.1.10
- 我家公網IP:203.0.113.10
- 我朋友的公網IP:198.51.100.27
在我的電腦上執行此操作時:
myself$ nc -u -p 7777 198.51.100.27 8888
在 NAT 轉換之前,我們有:
srcip srcport destip destport 192.168.1.10 7777 198.51.100.27 8888
但是在家庭路由器 NAT 轉換之後,我們有:
srcip srcport destip destport 203.0.113.10 55183(*) 198.51.100.27 8888
即源 IP 被 NAT 重寫,但源埠也被重寫。
因此,我的家庭防火牆中確實會創建一個“洞”(接受來自我朋友 198.51.100.27 的流量),但針對埠 55183,而不是針對埠7777。
這解釋了為什麼當我的朋友這樣做時它會失敗:
friend$ nc -u -p 8888 203.0.113.10 7777
注意 (*):在某些情況下,路由器可能會保留 srcport=7777 而不是將其重寫為 55183 之類的隨機埠。在這種情況下,問題中給出的解決方案可能會起作用。但這是隨機行為!