埠轉發

在電腦網路中，埠轉發或埠映射（英語：Port forwarding）是網路地址轉換（NAT）的一種應用，當網路封包穿越閘道器時，例如路由器或防火牆時，將帶有 IP位址和通訊埠的連線請求轉發到指定的 IP 位址及其埠口上，換句話說，就是將一台主機的網路埠轉發到另外一台主機並由另一台主機提供轉發的網路服務。此技術最常用於將位於受保護網路或區域網路（LAN）內主機上的服務提供給廣域網路（WAN）上的主機。

## 目的

埠轉發，此技術被提出的目的是為了讓遠端主機（例如網際網路上的主機）能與區域網路內的特定主機或服務之間建立連線。

在一般的家用網路中，每一節點（電腦或是智慧電冰箱等）皆連線到路由器或具有網路 IP 地址轉換（NAT/NAPT）功能的 ATU-R 或纜線數據機來相互連線或連線到網際網路。而除了透過實體線路連線至路由器，也可以連接到網路交換器或透過 Wi-Fi 連線至無線區域網路在連線到路由器等設備。NAT 設備的 WAN 孔通常具有有公開 IP 地址。換句話說，除了路由器本身，其他的設備對網際網路上的其他主機來說是不可見的、被隱藏的，因為它們相互僅透過私有 IP 地址進行資料交換或是僅透過路由器等設備取得位於網際網路的資料。

在部署埠轉發時，網路管理員通常會在閘道器上開放一個埠口，專門用於與位於區域網路內特定主機連線。外部主機必須知道此閘道器的公共 IP 地址和其被對應的埠口，才能與處在區域網路內的我們所指定的設備建立連線。通常，若被部屬的服務為常見服務，在區域網路內依舊會的依照標準來選擇服務所在的埠口位置，例如用於網頁服務（HTTP）的 80埠。

其他常見的應用還有以下：

- 在區域網路內部署需被公開的網頁伺服器
- 允許從網際網域對區域網路上的主機進行 Secure Shell 連線
- 允許從網際網域對區域網路上的主機進行 FTP 連線
- 在區域網路內部署需被公開的遊戲伺服器（如 Minecraft 等等）

網路管理員通常在閘道器的作業系統中配置相關的埠轉發規則。舉例來說，在 Linux 系統中，會透過 iptables 或 netfilter 的封包過濾規則實現埠轉發。BSD 和 macOS 則是在使用 Yosemite（OS 10.10.X）之前透過 Ipfirewall（ipfw）來實現埠轉發，而在其開始之後則是透過 PF防火牆（pf）來實現埠轉發。

當在閘道器上建立規則時，埠轉發可以透過一條規則來實現，以將本機的埠口對應至目標主機的 IP 地址和埠口（在 Linux 系統中，會透過 DNAT 規則來實現）。在這種情況下，封包將原封不動地被轉發出去，封包上的來源 IP 地址（Source IP）和埠口將保持不變。但若是在不是該區域網路的默認閘道器上部屬時，則必須將來源 IP 地址更改為實際閘道器的主機 IP 地址，否則封包將被防火牆攔截並最終導致連線失敗。

當埠轉發並非是由作業系統來實現，而是透過一些軟體來實現時（例如：部署在應用層上的防火牆軟體、基於 SOCKS 的防火牆或通過 TCP 封包代理等等方式），雖然不會更動封包內容，但這通常會導致來源 IP 地址被更改為該台具有埠轉發功能主機的 IP 地址。

通常一個埠口只能被對應到唯一的一台主機上，但我們也可以通過在閘道器上區分來源主機的 IP 地址來將連線分別導向至區域網路內不同的主機上。

有時也會在類Unix系統上使用埠轉發來讓程式可以以使用者身份來執行，避免因小於 1024 的埠口只能以超級使用者執行的程序監聽等原因，而直接以超級使用者執行程式，進而造成可能的安全漏洞，具體來說，會將低號埠口轉發至另一個高號埠口。

UPnP 提供了一項功能，可在一區域網路的閘道器中自動完成埠轉發。UPnP 定義了網際網路網關設備協議（IGD），具體來說，具有 UPnP 功能的閘道器透過簡單服務發現協議（SSDP）在區域網路內廣播其存在。若在此區域網路內還有其他具有 UPnP 功能的主機，就能自動與此閘道器建立埠轉發規則並使用 UPnP 的 IGD 協議在閘道器上註冊一個埠，同時使閘道器將封包轉發到其Unix域套接字。

## 類型

埠轉發具體有三大類型：本地、遠端和動態埠轉發。

### 本地埠轉發

本地埠轉發是最常見的埠轉發類型。它常用於一主機透過路由器等設備連線到另一主機，換句話說，使用者所執行的程序所產生的封包可以透過本地埠轉發至指定的主機上。透過使用本地埠轉發，可以繞過限制來源 IP 連線的防火牆。

我們也可讓具有 SSH 功能的主機透過 SSH 連線至同樣具有 SSH 協定的伺服器，讓伺服器以 SSH 連線並轉發我們的封包到指定的目標伺服器。就像其他的本地埠轉發一樣，將伺服器上的某一埠口對應到目標伺服器上，而該埠口被稱為「轉發埠」。任何想要連接到該目標主機的主機都可以透過 SSH 連線到伺服器上那被配置為轉發埠，間接地連線至目標主機，而不是直接連接到目標主機。連接被建立後，SSH 伺服器會持續在轉發埠上監聽，並將所有該埠口收到的封包經過解密之後全部轉發到目標主機及其埠口。

本地埠轉發的一些其他用途：

- 使用本地埠轉發來接收郵件
- 使用 SSH 從筆記型電腦連線到第三方網站。

### 遠端埠轉發

遠端埠轉發讓伺服器端的程序能夠透過 SSH 連線反過來對客戶端進行連線。當然除 SSH 之外，也可以利用其他協定來達到相同的目的。換句話說，遠端埠轉發允許用戶從伺服器端（無論是 SSH 還是其他協定）反向連線到客戶端。

要使用遠端埠轉發，必須在閘道器上設置目標主機（客戶端）的公開 IP 地址以及兩個埠口（閘道器和目標主機的埠口）。至於要選擇哪一埠口則取決於要部屬的服務。

遠端埠轉發允許其他主機透過閘道器訪問遠端主機上所部署的服務，例如：

- 一家公司的一名員工在自己家中部署了一台 FTP 伺服器，同時希望允許使用特定 IP 的主機能使用該 FTP 服務。為此，該名員工可以在公司的內部主機上設置遠端埠轉發，將封包轉發至該名員工的 FTP 伺服器的 IP 地址以及正確的埠口（FTP 的預設埠口是 TCP/21）。
- 從網際網路連線至遠端桌面是遠端埠轉發的一個常見用途。透過 SSH 連線至目標主機上的 VNC（預設為 5900埠口）之類的服務。

### 反向埠轉發

簡而言之，當您的主機以此方式連線到遠端主機時，對該遠端主機的 IP 的連線請求或是封包將被轉發到您的主機（一般是將您的主機的連線轉發至遠端伺服器）且由您的筆記型電腦做出響應（一般是由遠端伺服器做出響應）。

### 動態埠轉發（DPF）

動態埠轉發（DPF）是一種透過使用 FoD（全稱：Firewall on Demand）來穿透防火牆或 NAT 的方法。其目的是使客戶端能夠安全地連線到受信任的中介伺服器，以便向一個或多個目標伺服器發送和接收數據。

DPF 可以通過部屬本地應用程序（如 SSH）作為 SOCKS 代理伺服器來實現，該代理伺服器可透過網路或網際網路來傳遞封包。可以透過如網頁瀏覽器等程序，來透過代理伺服器去轉發封包，達到將本地機器隱藏起來的目的，可是一旦不再需要繼續轉發封包，就必須手動刪除規則。由於 DPF 的手動要求，網路管理員通常會優先使用其他的代理方式。

一旦連線被建立，DPF 可為連線到不受信任網路的使用者提供額外的安全性。由於封包必須在與代理伺服器建立安全連線並且加密後才會由代理伺服器轉送出至其原始目的地，進而避免使用者的封包在區域網路上被截獲。

DPF 是一個功能強大的工具，具有許多用途；例如，透過咖啡店、酒店或其他安全性較低等地方的網路連接到網際網路的使用者，就有可能希望使用 DPF 作為保護隱私的一種方式。了以上情境，例如在企業網路中， DPF 也可用於繞過限制訪問外部網站的防火牆。

## 查看更多

- Port Control Protocol (PCP)
- NAT埠映射協議 (NAT-PMP)
- Firewall pinhole
- NAT traversal
- Packet forwarding
- Port address translation (PAT)
- Port triggering
- UDP Helper Address
- 網路地址轉換
- Secure Shell

## 外部連結

- Using UPnP for Programmatic Port Forwardings and NAT Traversal – Free software which uses UPnP and the Internet Gateway Device Protocol (IGD) to automate port forwarding
- TCP forwarding source code in C# – Source code in C# explaining/PoC TCP forwarding.
- Open.NAT – Lightweight and easy-to-use .NET class library to allow port forwarding in NAT devices that support UPNP and PMP.
- Port Checker Port Forwarding Testing Tool