端口转发

<image>

在电脑网络中，埠转发或埠映射（英语：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