防火墙端口转发需四步协同:开启IPv4转发、启用masquerade、配置精准forward-port规则、放行入口端口并确保内网服务可达;缺一不可,否则连接中断或超时。

防火墙实现端口转发与内网流量重定向,核心不是“开个端口”,而是构建一条可进可出、地址可转换、路径可闭环的网络通路。关键在四点协同:开启内核转发、启用地址伪装、配置精准转发规则、放行必要端口。
必须开启 IPv4 转发
这是整个转发链路的底层开关。没有它,数据包能进来但无法路由出去,连接会卡在 SYN 阶段或直接超时。
- 临时生效:sudo sysctl -w net.ipv4.ip_forward=1
- 永久生效:向 /etc/sysctl.conf 追加 net.ipv4.ip_forward = 1,再运行 sudo sysctl -p
- 验证是否成功:sysctl net.ipv4.ip_forward 返回 1 即表示启用
为对应区域启用 masquerade(地址伪装)
内网服务响应时,源 IP 是私有地址(如 192.168.10.5),外网客户端无法识别和回包。masquerade 把回程包的源地址替换成防火墙本机公网 IP,确保路径闭环。
- 先查活跃区域:sudo firewall-cmd --get-active-zones(常见为 public)
- 启用伪装:sudo firewall-cmd --permanent --zone=public --add-masquerade
- 确认已启用:sudo firewall-cmd --query-masquerade --zone=public 应返回 yes
添加带目标地址和端口的转发规则
firewalld 的 --add-forward-port 必须明确指定 toaddr 和 toport,否则只转到本机或不生效。
- 示例(外网 8080 → 内网 192.168.10.5:8081):sudo firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toport=8081:toaddr=192.168.10.5
- 如需支持 UDP,单独加一条:--add-forward-port=port=8080:proto=udp:toport=8081:toaddr=192.168.10.5
- toaddr 必须是真实可达的内网 IP,不能写 127.0.0.1 或 localhost
放行入口端口并检查目标服务可达性
firewalld 不自动放行外网入口端口,也不控制内网机器自身的防火墙策略。这两步漏掉,转发就停在最后一环。
- 在防火墙主机上放行外网端口:sudo firewall-cmd --permanent --add-port=8080/tcp
- 确保内网目标机器(如 192.168.10.5)监听 0.0.0.0:8081(而非仅 127.0.0.1),且其本地防火墙允许该端口入站
- 最后务必重载:sudo firewall-cmd --reload
- 验证规则是否加载:sudo firewall-cmd --list-all --zone=public,检查 forward-ports: 下是否有对应条目


















