端口转发

LinuxBeginner
立即练习

简介

在本实验中,你将学习端口转发。

假设你住在一个可以收信的地址。后来你搬到了新房间,希望所有寄往旧房间号(80 号房)的邮件都能自动送到新房间号(8080 号房)。你不想让所有人都修改地址簿,只希望由大楼管理员处理转寄。

端口转发属于NAT(网络地址转换)的一部分。它会重写传入流量,使到达一个端口的请求重定向到另一个目标。

这意味着防火墙不仅是在允许或阻止流量,还会主动转换数据包的目标信息,使一个对外可见的服务入口能够指向不同的内部目标。

场景:

你有一个运行在 8080 端口上的 Web 服务器。但是,标准 Web 浏览器通常会在 80 端口查找网站。你无需修改 Web 服务器,只需告诉防火墙:「如果有人访问 80 端口,就直接将其发送到 8080 端口。」

在本实验中,你将:

  1. 为防火墙处理流量做好准备(伪装)。
  2. 创建一条将 80 端口转发到 8080 端口的规则。
  3. 测试并了解端口重定向的行为。

启用伪装

在此步骤中,firewalld 在转发端口之前需要获得修改网络数据包的权限。此功能称为伪装(Masquerading)。

伪装是地址转换的一种形式。在许多实际部署中,防火墙或网关正是通过它介入通信,使流量看起来来自与其原始来源不同的地址环境。

你可以把伪装理解为授予防火墙充当中间人的权限:它会重写数据包上的地址标签,使数据包能够到达正确的位置。

注意:在本实验环境中,我们使用 trusted 区域作为活动区域,以确保 Web 终端始终保持连接。

首先,检查当前处于活动状态的区域。

sudo firewall-cmd --get-active-zones

你通常会看到 trusted 以及对应的网络接口(例如 eth0)。

现在,在 trusted 区域启用伪装。

sudo firewall-cmd --zone=trusted --add-masquerade

验证伪装是否已启用。

sudo firewall-cmd --zone=trusted --query-masquerade

如果输出为 yes,就可以继续下一步。

创建转发规则

在此步骤中,你将创建转发规则。

当你希望对外保持稳定的访问方式,而不修改应用本身时,转发规则非常有用。防火墙会成为客户端预期访问位置与服务实际监听位置之间的转换层。

我们要实现的规则是:「对于 trusted 区域,将所有目标端口为 80 的 TCP 流量转发到端口 8080。」

运行以下命令:

sudo firewall-cmd --zone=trusted --add-forward-port=port=80:proto=tcp:toport=8080

下面解释各个参数:

  • port=80:原始目标端口(旧房间)。
  • proto=tcp:使用的协议(Web 流量使用 TCP)。
  • toport=8080:新的目标端口(新房间)。

验证规则是否已正确添加。

sudo firewall-cmd --zone=trusted --list-forward-ports

你应该会在输出中看到这条规则。

测试转发

在此步骤中,你将直接访问环境初始化时已在 8080 端口启动的简单 Web 服务器,确认它正常工作。

curl http://127.0.0.1:8080

你应该会看到:Hello from Port 8080! Port Forwarding is working.

现在,通过访问本机 IP 地址的 80 端口来测试端口转发。

查找本机 IP 地址:

MY_IP=$(hostname -I | awk '{print $1}')
echo "My IP is: $MY_IP"

使用这个 IP 地址连接 80 端口。

curl http://$MY_IP:80

测试说明:在许多 Linux 环境中(包括本实验环境),你可能会看到 Connection refused 错误。这是一个已知限制,称为 NAT 回环(NAT Loopback)。内核通常会阻止计算机通过自己的外部 IP 地址连接自身所配置的 NAT 规则。

请记住这一限制,因为它说明了配置正确性与本地测试行为之间的区别。有时规则本身是有效的,但从同一台计算机进行自测可能会产生误导。

在实际场景中,来自另一台计算机的访问者可以成功完成重定向。上一步运行 list-forward-ports 命令时显示了这条规则,这才是成功的真正证明!

删除规则

在此步骤中,你将删除转发规则,使流量恢复正常行为。完成操作后进行清理是良好习惯。

清理防火墙配置很重要,因为过时的规则可能会在原始测试被遗忘很久之后,仍然悄悄改变应用的暴露范围。

删除规则时,需要使用 --remove-forward-port,并提供与添加规则时完全相同的参数。

sudo firewall-cmd --zone=trusted --remove-forward-port=port=80:proto=tcp:toport=8080

验证规则是否已经删除。

sudo firewall-cmd --zone=trusted --list-forward-ports

输出应该为空。

总结

在本实验中,你学习了如何使用端口转发重定向网络流量。你完成了以下操作:

  1. 启用伪装,让防火墙可以重写数据包。
  2. 创建一条将流量从 80 端口转发到 8080 端口的规则。
  3. 了解 NAT 回环,以及本地测试有时可能遇到的问题。
  4. 删除规则,恢复原始状态。

这是一项非常实用的技术,常用于通过标准公共端口公开内部服务,例如数据库或自定义应用。