问题现象
在1Panel面板操作路径 系统 > 防火墙 > 端口转发
时,界面出现飘字报错:
服务内部错误: exit status 1
错误日志分析
在面板日志审计(系统日志)中发现关键错误条目:
[2025-07-27 15:34:01] [ERROR] iptables failed, err: stderr: iptables v1.8.9 (nf_tables): chain `1PANEL_PREROUTING' in table `nat' is incompatible, use 'nft' tool.
问题根源
此错误由底层防火墙框架冲突导致:
- 系统环境:Debian 10+ 及 Ubuntu 20.04+ 默认使用
nftables
作为防火墙后端 - 软件依赖:1Panel 当前版本仍使用
iptables
命令集 - 冲突本质:当尝试在
nat
表中操作1PANEL_PREROUTING
链时,nftables 框架拒绝执行 iptables 语法规则
解决方案
通过以下三步解决兼容性问题:
步骤1:切换iptables到legacy模式
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
技术作用:
- 将系统的iptables实现从nftables后端切换回legacy模式
- 解决命令语法兼容性问题
- 确保1Panel的防火墙操作可正常执行
步骤2:创建并挂接专用规则链
# 在nat表中创建专用链
sudo iptables-legacy -t nat -N 1PANEL_PREROUTING
sudo iptables-legacy -t nat -N 1PANEL_POSTROUTING
# 将专用链挂载到PREROUTING和POSTROUTING钩子
sudo iptables-legacy -t nat -A PREROUTING -j 1PANEL_PREROUTING
sudo iptables-legacy -t nat -A POSTROUTING -j 1PANEL_POSTROUTING
链功能说明:
链名称 | 表类型 | 流量阶段 | 功能 |
---|---|---|---|
1PANEL_PREROUTING | nat | 入站预处理 | 处理DNAT端口转发规则 |
1PANEL_POSTROUTING | nat | 出站后处理 | 处理SNAT地址转换规则 |
此时其实已经可以正常使用了,但是如果设备重启的话,上述配置都会失效,需要重新配置一遍,这会相当的麻烦,于是我们使用配置持久化让其重启也可以正常生效
步骤3:配置规则持久化
# 安装持久化工具包
sudo apt install iptables-persistent -y
# 保存当前规则集
sudo netfilter-persistent save
# 创建systemd服务单元
sudo tee /etc/systemd/system/1panel-firewall.service > /dev/null <<'EOF'
[Unit]
Description=1Panel Firewall Rules Loader
After=network.target
Requires=netfilter-persistent.service
[Service]
Type=oneshot
ExecStart=/usr/sbin/netfilter-persistent reload
[Install]
WantedBy=multi-user.target
EOF
# 启用并激活服务
sudo systemctl daemon-reload
sudo systemctl enable --now 1panel-firewall.service
持久化机制:
netfilter-persistent save
将规则写入/etc/iptables/rules.v4
- systemd服务确保在系统启动阶段(网络就绪后)自动加载规则
- 服务依赖关系保证在基础网络服务启动后执行
解决方案验证
验证1:检查链挂接状态
# 确认PREROUTING链包含跳转规则
sudo iptables-legacy -t nat -L PREROUTING --line-numbers
# 预期输出示例:
# Chain PREROUTING (policy ACCEPT)
# num target prot opt source destination
# 1 1PANEL_PREROUTING all -- anywhere anywhere
验证2:重启持久性测试
sudo reboot
sudo iptables-legacy -t nat -L 1PANEL_PREROUTING # 链应保持存在
验证3:功能测试
# 在目标主机启动测试监听
nc -lkp 8080
# 通过转发端口访问(假设配置80→8080转发)
curl -v http://服务器公网IP:80
# 检查nc端是否收到连接请求
管理命令参考
# 查看当前iptables模式
update-alternatives --list iptables
# 检查规则详细定义
sudo iptables-legacy -t nat -S 1PANEL_PREROUTING
# 监控服务运行状态
sudo journalctl -u 1panel-firewall -f -n 20
注意事项
- 权限要求:所有操作需通过
sudo
提权执行 - 规则备份:操作前建议备份当前规则集
sudo iptables-legacy-save > ~/iptables-backup-$(date +%Y%m%d).rules
- 模式回退:如需恢复nftables模式(不推荐):
sudo update-alternatives --set iptables /usr/sbin/iptables-nft
默认评论
Halo系统提供的评论