Networking

如何避免轉發埠?

  • September 24, 2018

我正在做 UDP 套接字程式C。為了監聽埠,我需要在路由器中轉發埠。我的問題是如何避免這樣做並且仍然能夠通過網際網路進行通信,如果不能使用套接字,那麼可能的最低級別是多少?換句話說,每個設備都可以監聽一個 http 伺服器,那麼 http 是唯一的解鎖方式嗎?

通常,您的 ISP 會為您提供一個 IP 地址,而您的家庭路由器會進行網路地址轉換(NAT),以向您的 ISP 假裝您家庭網路中的所有設備都只是與路由器本身俱有相同地址的單個設備。

因此,如果有人想從外部聯繫您的家庭網路,路由器必須“轉發一個埠”到您的家庭網路中執行服務的設備,因為從外部可見的唯一 IP 地址是路由器的IP地址。

如果您不希望這樣,唯一的選擇是直接在路由器上執行您的服務,或者斷開路由器與您的 ISP 的連接,而是連接直接執行服務的電腦(如果它具有這樣做的硬體)。

無論您使用什麼協議,都沒有其他方法。

您也可以向您的 ISP 付費以提供多個 IPv4 地址(這會很昂貴)。或者,如果您的 ISP 為您提供 IPv6 全域前綴,那麼您家庭網路中的每個設備都會有自己的 IPv6 地址,可以從外部訪問。所以沒有 NAT,不需要埠轉發,但它只適用於 IPv6。

OTOH,設置埠轉發並不完全是黑魔法,所以就去做吧。

編輯

當您“訪問一個網站”時,即您的本地http客戶端將聯繫遠端http伺服器,路由器中的NAT 會將傳出數據包的源地址從您的私有設備地址改寫為ISP 的IP 地址。它還會記住本地設備打開了一個傳出連接,當屬於該連接的傳入數據包到達時,它會反過來重寫目標地址並將它們發送到本地設備。這就是NAT。

因此,對於來自本地設備的傳出連接,您不需要埠轉發。NAT 為您處理這個問題。對於傳入的連接,例如,如果您執行一個 http伺服器,您需要告訴您的路由器“請將埠 80 轉發到以下本地設備”。

如何在不訪問路由器設置的情況下打開埠?

對於傳入連接,您不能。正如我已經試圖解釋的那樣。

編輯

如果你用Google搜尋 UDP 的範常式序,總會有一個伺服器在監聽埠,而客戶端不監聽,而是聯繫伺服器(之後伺服器和客戶端都可以在任何方向交換數據包)。所以“如何在不監聽埠的情況下接收資訊”是您編寫客戶端,而不是伺服器,然後伺服器可以向客戶端發送數據,因此客戶端“接收資訊”。

如果沒有埠轉發,您將無法在 NAT 後面執行伺服器。時期。不管你問多少次。不適用於 TCP,不適用於 UDP,也不適用於“使用低級協議”。

如果您不想在路由器的 GUI 中啟用埠轉發:許多路由器允許您通過 UPnP 設置埠轉發,有時甚至是臨時埠轉發。您的路由器可能有也可能沒有此功能。

還有其他技巧,例如首先聯繫一種通用類型的伺服器,然後它將與 NAT 後面的其他對等點建立連接(參見例如STUN協議)。

但是,如果您在 NAT 之後,您首先必須聯繫“真實”網際網路上的伺服器。此伺服器將偵聽埠,您的客戶端不會。或者,如果你有一個伺服器監聽一個埠,你需要設置埠轉發。沒有其他選擇。忍受它。

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