端口转发将网络流量从一个网络监听器(称为“端口”)传输到另一个监听器,无论是在同一台计算机还是不同的计算机上。在此上下文中,端口不是物理对象,而是监听网络活动的软件例程。
当定向到特定端口的流量到达路由器或防火墙或其他联网应用程序时,它可以根据尝试通信的端口来定义接收到的响应。当您使用端口转发时,例如,您可以捕获端口 8080 上传入的通信,并将其转发到端口 80。新的目标端口可能与接收信号的设备位于同一设备上,也可能位于不同的设备上。端口转发有很多方法,并且有不同的理由这样做。本文演示了最常见的场景。
使用路由器进行端口转发
当您在家中托管服务器时,通常需要转发端口。您的家用路由器(通常是从 ISP 处获得的 WiFi 设备)具有内置防火墙,旨在阻止外部世界进入您的家庭网络。您可以使用端口转发来允许特定端口上的流量通过路由器的防火墙,将其发送到您网络上的特定 IP 地址。
例如,假设您正在托管一个 Minetest 服务器 并想邀请朋友。为了让他们通过您的路由器并进入您的 Minetest 服务器,您必须将路由器上的端口转发到托管 Minetest 的计算机。默认情况下,Minetest 服务器在端口 30000 上运行。您可以在路由器上将端口 30000 转发到 Minetest 服务器上的端口 30000,或者您可以随意创建一个更简单的端口供玩家记住,然后转发该端口。我发现人们不可避免地会数错 30000 中的零(尤其是在没有逗号帮助的情况下),所以我使用端口 1234 并将其转发到我的内部 30000 端口。
路由器界面因制造商而异,但无论您在家中使用什么品牌的路由器,其原理都是相同的。首先,登录到您的路由器。
它的 IP 地址和登录信息通常印在路由器本身或其文档中。我拥有一台 TP-Link GX90 路由器,我通过将我的 Web 浏览器指向 10.0.1.1 登录到它,但您的路由器可能是 192.168.0.1 或其他地址。
我的 GX90 路由器将端口转发称为“虚拟服务器”,这是在路由器的 NAT 转发 选项卡中找到的一个类别。NAT 代表网络地址转换。其他路由器可能只是将其称为 端口转发 或 防火墙 或 服务。可能需要稍微点击一下才能找到正确的类别,或者您可能需要花一些时间研究路由器的文档。
当您找到端口转发设置时,添加一个新规则,该规则命名一个外部端口(在我的示例中为 1234)和一个内部端口(30000)。将外部端口转发到您希望人们能够访问的计算机的 IP 地址上的内部端口。如果您需要帮助查找您的 IP 地址,请阅读 Archit Modi 的如何在 Linux 上查找您的 IP 地址 文章。

端口转发规则示例
(Seth Kenlon, CC BY-SA 4.0)
在此示例中,我将到达我家网络端口 1234 的流量转发到位于 10.0.1.2 的我家服务器的端口 30000。
保存规则以继续。
接下来,您需要知道您家庭网络的公共 IP 地址。您可以从 ifconfig.me 或 icanhazip.com 等网站获取。可以打开浏览器访问这些网站之一,或者使用 curl 命令获取 IP。
$ curl ifconfig.me
93.184.216.34
您的朋友现在可以通过在他们的 Minetest 客户端中输入 169.169.23.49:1234
来加入您的 Minetest 服务器。
使用防火墙进行端口转发
系统管理员有时需要转发端口以处理到达服务器的流量。例如,您可能想要接受端口 80 的流量,但向用户提供在端口 8065 上运行的服务。如果没有端口转发,您的用户将不得不记住在他们输入到浏览器中的 URL 末尾附加一个特定的端口,例如 example.com:8065
。 大多数用户不习惯考虑端口,因此拦截对常用 Web 端口 80 的调用并将其重定向到您的 Web 应用程序运行的晦涩端口对您的用户来说是一个很大的便利。
您可以使用 firewall-cmd(firewalld
守护程序的前端命令)在服务器上转发流量。
首先,设置要转发的端口和协议
$ sudo firewall-cmd \
--add-forward-port \
port=80:proto=tcp:toport=8065
要使更改永久生效,请使用 --runtime-to-permanent
选项
$ sudo firewall-cmd --runtime-to-permanent
网络转发
在网络中,除了端口转发之外,还有其他类型的转发。例如,IP 转发和代理都是转发的形式。当您熟悉网络信息在路由过程中的处理方式时,您可以尝试不同类型的转发(并使用 tcpdump
或类似工具观察它)以查看哪种方法最适合您的设置。
评论已关闭。