Linux防火墙启用IP伪装及端口转发添加/移除教程

添加端口转发

#开启端口伪装
firewall-cmd --add-masquerade --permanent

firewall-cmd --permanent --add-forward-port=port=xxx:proto=tcp:toaddr=XXX.XXX.XXX.XXX:toport=xxx

firewall-cmd --reload


移除端口转发

执行命令,显示成功,但转发规则并未移除

解决方案

在 Linux 中使用 firewall-cmd 移除端口转发规则时,若命令未生效,可能是由于 规则匹配不精确 或 配置未持久化 导致。以下是分步解决方案:

1. 确认现有转发规则

首先检查当前生效的端口转发规则,确保移除命令参数与添加时的规则完全一致:

# 查看所有端口转发规则
sudo firewall-cmd --list-forward-ports

# 或检查富规则(Rich Rules)
sudo firewall-cmd --list-rich-rules

若输出中包含类似以下条目,则表明规则存在:

forward-port port=80 proto=tcp toport=80 to-addr=XXX.XXX.XXX.XXX

2. 确保命令参数完全匹配

--remove-forward-port 必须与原始添加命令的参数 完全一致,包括 port、proto、toport 和 toaddr。
检查原添加命令是否包含以下细节:

  • 是否使用了 --permanent 参数?
  • toaddr 是否为 IPv4 地址且格式正确?
  • 协议(proto)是否为 tcp 或 udp?

修正后的移除命令:

# 若原规则是临时添加的(未用 --permanent)
sudo firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=XXX.XXX.XXX.XXX

# 若原规则是永久添加的(用了 --permanent)
sudo firewall-cmd --permanent --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=XXX.XXX.XXX.XXX

# 重新加载防火墙配置
sudo firewall-cmd --reload

3. 直接删除富规则(替代方案)

如果通过 --add-rich-rule 添加了转发规则,需使用 --remove-rich-rule 删除:

# 查看现有富规则
sudo firewall-cmd --list-rich-rules

# 删除匹配的富规则(示例)
sudo firewall-cmd --remove-rich-rule='rule family="ipv4" forward-port port="80" protocol="tcp" to-port="80" to-addr="XXX.XXX.XXX.XXX"'

# 永久删除需加 --permanent
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" forward-port port="80" protocol="tcp" to-port="80" to-addr="XXX.XXX.XXX.XXX"'

# 重新加载配置
sudo firewall-cmd --reload

4. 检查防火墙状态与配置

(1) 确认防火墙服务运行正常:

sudo firewall-cmd --list-all

(2) 查看完整防火墙配置:

sudo firewall-cmd --list-all

(3) 检查是否其他规则覆盖:

某些情况下,direct 规则或 iptables 可能直接修改了链(如 nat 表),需同步清理:

# 查看 NAT 表中的端口转发规则
sudo iptables -t nat -L -n --line-numbers

# 删除对应的 iptables 规则(示例)
sudo iptables -t nat -D PREROUTING 1  # 删除编号为 1 的规则

5. 验证配置持久化

若使用 --permanent 参数,需确保配置已写入 /etc/firewalld/zones/*.xml 文件。手动检查配置文件:

sudo cat /etc/firewalld/zones/public.xml

若文件中仍包含旧的转发规则,手动编辑后重新加载:

sudo vi /etc/firewalld/zones/public.xml
sudo firewall-cmd --reload

6. 最终验证

  • 测试端口转发是否移除:
curl -I http://<服务器IP>:80 # 应无法访问到 10.254.144.33:32080 的服务 telnet <服务器IP> 80 # 连接应被拒绝或超时
  • 抓包验证(可选):
sudo tcpdump -i any port 80 -nn

总结

步骤

命令/操作

1. 确认规则存在

sudo firewall-cmd --list-forward-ports

2. 精确匹配移除

sudo firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=32080:toaddr=10.254.144.33

3. 清理 iptables

sudo iptables -t nat -L -n --line-numbers + 删除对应规则

4. 重载配置

sudo firewall-cmd --reload

5. 验证结果

curl 或 telnet 测试

若问题仍未解决,检查 SELinux 是否阻止端口转发:

sudo ausearch -m avc -ts recent     # 查看 SELinux 拒绝日志
sudo setsebool -P httpd_can_network_connect 1  # 允许 HTTP 网络连接(如有必要)
原文链接:,转发请注明来源!