Contents

Firewalld 端口转发完全指南:IPv4/IPv6 双栈 NAT 配置与排错

1. 为什么需要端口转发?

云服务器拿到手之后,你很快就会遇到一个需求:把本机的某端口流量转给另一台机器

举个例子:你有一台腾讯云上海服务器(BGP 多线,低延迟),还有一台搬瓦工洛杉矶 CN2 GIA VPS(线路好、带宽大)。你想让国内用户通过上海服务器访问洛杉矶机器上的服务——直接暴露洛杉矶 IP 不怕 DDoS,走上海中转既快又安全。

这就是端口转发要解决的问题。在 Linux 上,实现方式有三种:

方案 层级 性能 复杂度 适用场景
firewalld 内核 netfilter 极高 单机 IPv4/IPv6 转发,规则简单
iptables 内核 netfilter 极高 复杂 NAT 链,精确控制四表五链
Realm 用户态 多节点负载均衡、跨栈中转、同一端口多出口

选型建议:如果只是「A 机器端口 X → B 机器端口 Y」,用 firewalld——内核级性能 + 3 条命令搞定。如果需要「一个端口根据策略转发到多个目标」或「IPv4→IPv6 跨栈中转」,去看 Realm 端口转发教程

本文以 firewalld 为核心,覆盖 IPv4/IPv6 双栈的全部配置场景。


2. 实验环境

项目 详情
操作系统 Debian 12 / Ubuntu 24.04
防火墙 firewalld
IPv4 示例 本机 port 10001 → 158.178.231.249:30553
IPv6 示例 本机 port 60000 → [2603:c024:…]:33333
云厂商 阿里云 / 腾讯云轻量云 / 搬瓦工

如果你是新机器,建议先跑一遍 Linux 服务器初始化指南——系统更新、安全加固、BBR 优化,10 分钟全部搞定。


3. 核心概念:NAT 转发怎么工作?

两台机器建立转发通道,需要三步:

  1. 内核开启 IP 转发 — 系统默认不转发,包来了直接丢
  2. firewalld 入站放行 — 允许外部连接本机端口
  3. NAT 转发 + IP 伪装 — 重写目标地址,并给源包打上本机 IP(MASQUERADE),否则回程包找不到路
最容易踩的坑
漏掉 MASQUERADE 是端口转发不生效的第一大原因。iptables 世界里 -j MASQUERADE 是显式的,firewalld 提供了 --add-masquerade 封装——但很多人跳过了这一步。

4. 最佳实践:完整配置步骤

第 1 步:开启内核 IP 转发

sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

第 2 步:安装并启动 firewalld

sudo apt update -y
sudo apt install firewalld -y
sudo systemctl enable --now firewalld

第 3 步:添加端口转发规则

本机 10001 端口 → 158.178.231.249:30553:

# TCP 转发
sudo firewall-cmd --permanent --add-forward-port=port=10001:proto=tcp:toaddr=158.178.231.249:toport=30553

# UDP 转发
sudo firewall-cmd --permanent --add-forward-port=port=10001:proto=udp:toaddr=158.178.231.249:toport=30553

第 4 步:开启 NAT 伪装(关键!)

sudo firewall-cmd --permanent --add-masquerade
Warning
不执行这一步,数据包出站时源 IP 没被改写,目标服务器回程包找不到路,连接永远不通。

第 5 步:放行入站端口

sudo firewall-cmd --permanent --add-port=10001/tcp
sudo firewall-cmd --permanent --add-port=10001/udp

第 6 步:重载生效并验证

sudo firewall-cmd --reload

# 查看所有规则
sudo firewall-cmd --list-all

# 验证底层 NAT 表(确认规则已写入 netfilter)
sudo nft list ruleset | grep -A 5 "port 10001"

第 7 步(云厂商用户必做):安全组放行

阿里云腾讯云 的轻量服务器有两层防火墙:

  • 系统层:firewalld/iptables(你这一步配置的)
  • 云厂商层:安全组 / 防火墙规则(控制台配置的)

两者是 AND 关系——任缺其一,端口都不通。登录云控制台,在对应实例的安全组中放行你的转发入口端口(本例中为 10001)。


5. 删除转发规则

不再需要转发时,用 --remove- 对称清理:

# 删除端口放行
sudo firewall-cmd --permanent --remove-port=10001/tcp
sudo firewall-cmd --permanent --remove-port=10001/udp

# 删除转发规则
sudo firewall-cmd --permanent --remove-forward-port=port=10001:proto=tcp:toaddr=158.178.231.249:toport=30553
sudo firewall-cmd --permanent --remove-forward-port=port=10001:proto=udp:toaddr=158.178.231.249:toport=30553

# 重载
sudo firewall-cmd --reload

6. 进阶:IPv6 端口转发

IPv6 转发不能套用 --add-forward-port——firewalld 默认当 IPv4 处理。IPv6 必须用富文本规则(rich-rule),显式指定 family="ipv6"

开启 IPv6 转发

sudo sysctl -w net.ipv6.conf.all.forwarding=1
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl --system

添加 IPv6 伪装与转发

# IPv6 MASQUERADE
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" masquerade'

# 转发 TCP:本机 60000 → [目标 IPv6]:33333
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" forward-port port="60000" protocol="tcp" to-port="33333" to-addr="2603:c024:450f:3066:e654:bdf2:7bf8:3a5c"'

# 转发 UDP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" forward-port port="60000" protocol="udp" to-port="33333" to-addr="2603:c024:450f:3066:e654:bdf2:7bf8:3a5c"'

sudo firewall-cmd --reload

删除 IPv6 规则

--add-rich-rule--remove-rich-rule,镜像清理即可:

sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv6" forward-port port="60000" protocol="tcp" to-port="33333" to-addr="2603:c024:450f:3066:e654:bdf2:7bf8:3a5c"'
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv6" masquerade'
sudo firewall-cmd --reload

7. FAQ

Q: 为什么端口转发不生效?

按优先级排查:

  1. 内核转发开了吗? sysctl net.ipv4.ip_forward 必须是 1
  2. MASQUERADE 开了吗? firewall-cmd --list-all | grep masquerade 确认是 yes
  3. 入站端口放行了吗? 转发规则 ≠ 入站放行,两步互相独立
  4. 云厂商安全组放行了吗? 登录控制台检查实例安全组,确认入口端口在规则列表中
  5. 目标服务器可达吗? 在中转机上 curl -v telnet://目标IP:目标端口,排除目标端问题

三步不卡脖子:内核转发 + MASQUERADE + 安全组放行。90% 的排错落在这三个点上。

Q: firewalld 和 iptables 能同时用吗?

不推荐。firewalld 本质上是 iptables/nftables 的前端封装,两者直接混用会导致规则冲突,且难以审计。选定一种:小规模场景用 firewalld,需要四表五链精确控制时直接用 nftables。详情见本站 Linux 服务器初始化指南 中的防火墙选型讨论。

Q: 转发延迟会增加多少?

内核 netfilter 转发增加的延迟在微秒级,对 99% 的场景可以忽略。实际延迟取决于中转机 → 目标机之间的网络质量。如果两者在同一云厂商同地域(如阿里云上海 → 阿里云上海),增加 < 1ms。


8. 替代方案

firewalld 的单端口点对点转发适合简单场景。以下需求需要跳转其他方案: