Networking

UDP 或 TCP 打孔以連接兩個對等點(每個對等點位於路由器後面)

  • December 4, 2018

我正在嘗試將我的電腦直接(沒有第 3 方伺服器)連接到朋友的電腦。我們都在 ISP 路由器後面,並且希望(作為一個挑戰!)在不修改路由器配置的情況下進行連接。

正如這里這裡所建議的,我們嘗試了兩種 TCP 打孔:

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 之類的隨機埠。在這種情況下,問題中給出的解決方案可能會起作用。但這是隨機行為!

引用自:https://unix.stackexchange.com/questions/421471