添加端口转发
#开启端口伪装
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 网络连接(如有必要)