问题背景
最近在使用 1Panel 面板配置端口转发时遇到了一个问题。操作路径 系统 > 防火墙 > 端口转发 时,界面突然出现飘字报错:
服务内部错误: exit status 1
这个错误提示很简洁,但没有说明具体原因。经过一番排查,我发现这是由于防火墙框架冲突导致的。今天就把完整的排查过程和解决方案分享给大家。
问题现象
在 1Panel 面板中尝试添加端口转发规则时,界面出现以下错误:
服务内部错误: exit status 1
这个问题导致无法正常配置端口转发功能,影响了服务的正常访问。
错误日志分析
查看面板日志
首先我查看了 1Panel 的日志审计(系统日志),发现了关键错误信息:
[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.
错误信息解读:
iptables v1.8.9 (nf_tables):当前系统使用的是 nftables 后端的 iptableschain '1PANEL_PREROUTING' ... is incompatible:1Panel 创建的链与当前防火墙框架不兼容use 'nft' tool:提示应该使用 nft 工具
问题根源分析
这个错误的根本原因是底层防火墙框架冲突:
- 系统环境:Debian 10+ 及 Ubuntu 20.04+ 默认使用
nftables作为防火墙后端 - 软件依赖:1Panel 当前版本仍使用
iptables命令集 - 冲突本质:当尝试在
nat表中操作1PANEL_PREROUTING链时,nftables 框架拒绝执行 iptables 语法规则
技术背景:
- iptables-legacy:传统的 iptables 实现,直接操作内核 netfilter
- iptables-nft:新的 iptables 实现,通过 nftables 后端工作
- 两者语法不完全兼容,需要切换模式
解决方案
通过以下三步可以彻底解决这个兼容性问题:
步骤 1:切换 iptables 到 legacy 模式
首先需要将系统的 iptables 实现切换到 legacy 模式。
执行以下命令:
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
技术作用:
- 将系统的 iptables 实现从 nftables 后端切换回 legacy 模式
- 解决命令语法兼容性问题
- 确保 1Panel 的防火墙操作可正常执行
验证切换结果:
# 查看 iptables 当前模式
update-alternatives --list iptables
# 应该输出:
# /usr/sbin/iptables-legacy
# /usr/sbin/iptables-nft
步骤 2:创建并挂接专用规则链
切换模式后,需要手动创建 1Panel 所需的防火墙链。
创建专用链:
# 在 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 地址转换规则 |
工作原理:
PREROUTING链:数据包进入系统后、路由决策前处理POSTROUTING链:数据包离开系统前处理- 通过
j 1PANEL_PREROUTING跳转到 1Panel 的管理链
此时端口转发功能应该已经可以正常使用了。
步骤 3:配置规则持久化
如果设备重启,上述配置都会失效,需要重新配置一遍,会相当麻烦。因此我们需要配置规则持久化。
安装持久化工具包:
sudo apt install iptables-persistent -y
保存当前规则集:
sudo netfilter-persistent save
这会将规则写入 /etc/iptables/rules.v4 文件。
创建 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
启用并激活服务:
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启用并启动服务
sudo systemctl enable --now 1panel-firewall.service
持久化机制说明:
netfilter-persistent save将规则写入/etc/iptables/rules.v4- systemd 服务确保在系统启动阶段(网络就绪后)自动加载规则
- 服务依赖关系保证在基础网络服务启动后执行
Requires=netfilter-persistent.service确保依赖服务先启动
解决方案验证
完成配置后,需要验证是否成功。
验证 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 模式
# 查看当前 iptables 模式
update-alternatives --list iptables
# 显示详细信息
update-alternatives --display iptables
检查规则详细定义
# 查看 1PANEL_PREROUTING 链的详细规则
sudo iptables-legacy -t nat -S 1PANEL_PREROUTING
# 查看所有 NAT 表规则
sudo iptables-legacy -t nat -L -n -v
监控服务运行状态
# 查看服务状态
sudo systemctl status 1panel-firewall
# 查看服务日志
sudo journalctl -u 1panel-firewall -f -n 20
# 重启服务
sudo systemctl restart 1panel-firewall
手动保存规则
# 手动保存当前规则
sudo netfilter-persistent save
# 手动重新加载规则
sudo netfilter-persistent reload
注意事项
1. 权限要求
所有操作需通过 sudo 提权执行:
sudo -i # 切换到 root 用户
2. 规则备份
操作前建议备份当前规则集:
# 备份当前规则
sudo iptables-legacy-save > ~/iptables-backup-$(date +%Y%m%d).rules
# 恢复备份
sudo iptables-legacy-restore < ~/iptables-backup-20250727.rules
3. 模式回退
如果需要恢复 nftables 模式:
sudo update-alternatives --set iptables /usr/sbin/iptables-nft
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft
4. 防火墙策略
如果系统还启用了 ufw 或 firewalld,需要注意规则顺序:
# 检查 ufw 状态
sudo ufw status
# 如果需要,可以临时禁用 ufw
sudo ufw disable
常见问题
Q1:为什么会出现这个问题?
A: 这是由于 Linux 防火墙框架演进造成的。新的 Debian 和 Ubuntu 系统默认使用 nftables,但 1Panel 还在使用传统的 iptables 命令。
Q2:切换到 legacy 模式安全吗?
A: 完全安全。legacy 模式是成熟稳定的实现,广泛用于生产环境。只是使用的是旧版本的 API,功能上没有差别。
Q3:会影响其他服务吗?
A: 不会。切换只影响 iptables 命令的行为,不影响实际的防火墙功能和性能。
Q4:可以不用 legacy 模式吗?
A: 理论上可以修改 1Panel 源码使其支持 nftables,但这需要开发工作。使用 legacy 模式是最简单的解决方案。
总结
希望这篇详细的解决方案能帮助到遇到同样问题的朋友!如果你有其他问题或更好的解决方案,欢迎在评论区交流。
默认评论
Halo系统提供的评论