firewalld端口转发需同时满足三个前提:开启IPv4转发(sysctl net.ipv4.ip_forward=1)、启用IP伪装(firewall-cmd --add-masquerade --zone=public --permanent)、添加永久转发规则并执行--reload重载;缺一将导致响应包无法返回。

Firewalld 开启端口转发不是加一条命令就行,必须同时满足三个前提:系统开启 IPv4 转发、防火墙启用 IP 伪装(masquerade)、正确添加转发规则并重载配置。漏掉任意一个,外网请求能进来,但内网服务的响应包无法返回,连接就卡在 SYN_SENT 或直接超时。
1. 确保系统已启用 IPv4 转发
这是底层网络基础,firewalld 本身不控制它:
- 临时生效:echo 1 > /proc/sys/net/ipv4/ip_forward
- 永久生效:向 /etc/sysctl.conf 追加一行 net.ipv4.ip_forward = 1,再执行 sysctl -p
- 验证是否开启:sysctl net.ipv4.ip_forward 返回值应为 1
2. 启用 IP 伪装(Masquerade)
否则内网目标主机回包时源 IP 是私有地址(如 192.168.1.100),外网客户端无法路由识别:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 运行命令:firewall-cmd --add-masquerade --zone=public --permanent
- 必须指定 zone(通常是 public),可用 firewall-cmd --get-active-zones 确认
- 该 zone 的 target 不能是 REJECT 或 default;若不确定,先设为 ACCEPT 测试:firewall-cmd --set-target=ACCEPT --zone=public --permanent
3. 添加端口转发规则
语法清晰,但注意 toaddr 和 toport 的组合逻辑:
- 转发到其他机器(典型 DNAT):
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100 - 转发到本机另一个端口(本地映射):
firewall-cmd --permanent --add-forward-port=port=8443:proto=tcp:toport=443(无需 toaddr) - 务必加 --permanent,否则重启失效;仅加此参数不会立即生效
4. 重载并验证
所有配置完成后必须重载,否则不生效:
- 执行:firewall-cmd --reload
- 检查是否生效:firewall-cmd --list-all,确认输出中包含 forward-ports: 行及对应规则
- 从外部机器测试连接,例如:curl -v http://服务器IP:8080










