1Panel + Docker
日期: 2026-04-19
环境: Ubuntu + 1Panel + AMH 面板 + Docker
问题描述
在 1Panel 应用商店安装 Gitea 后,通过浏览器访问提示:
ERR_CONNECTION_TIMED_OUT
排查过程
1. 确认容器状态
sudo docker ps --format "table {{.Names}}\t{{.Ports}}" | grep -i gitea
发现: 容器正常运行,端口映射为 192.168.50.117:3000->3000/tcp
2. 确认端口监听
ss -tlnp | grep 3000
发现: 端口 3000 正常监听在 0.0.0.0
3. 检查防火墙
sudo ufw status # inactive(未启用)
sudo iptables -L INPUT -n # 无拦截规则
sudo nft list ruleset 2>/dev/null | grep -E "table|chain|policy"
发现关键问题:
table ip filter {
type filter hook forward priority filter; policy drop; ← 元凶
}
ip filter 表的 forward 链默认策略为 drop,所有转发流量被丢弃。
4. 确认双面板冲突
sudo systemctl list-units | grep -E "amh|iptables|firewall"
发现: amh-start.service 处于 active running 状态,与 1Panel 的 nftables 规则冲突。
根本原因
AMH 面板启动
→ 设置自己的 iptables 规则,破坏 Docker 期望的 iptables 环境
Docker 启动容器
→ 尝试在 FORWARD 链添加 ACCEPT 规则
→ 因环境异常,规则添加失败或被覆盖
结果
→ ip filter 表 forward 链 policy drop 生效
→ 所有到容器的转发流量被丢弃
→ Gitea 无法访问
关键点:
ip filter表由 Docker 通过iptables-nft兼容层创建,
只能用iptables命令操作,nft命令无法直接修改。
解决方案
临时修复(手动添加转发规则)
sudo iptables -I FORWARD -i br-bb2b988571c8 -j ACCEPT
sudo iptables -I FORWARD -o br-bb2b988571c8 -j ACCEPT
br-bb2b988571c8为 Gitea 容器所在的 Docker 桥接口名,
可通过ip link show type bridge查看实际名称。
持久化规则
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
根治方案(推荐)
停止 AMH,让 Docker 重建正确的防火墙规则:
sudo systemctl stop amh-start.service
sudo systemctl restart docker
重启 Docker 后,它会自动为所有容器重建正确的 FORWARD ACCEPT 规则。
防止复发:禁用 AMH 开机启动
sudo systemctl disable amh-start.service
sudo systemctl is-enabled amh-start.service # 应输出 disabled
端口说明
| 端口 | 作用 | 管理方 |
|---|---|---|
| 配置端口(如 5663) | 对外访问端口,OpenResty 反代 | 1Panel |
| Docker 随机端口(如 32771) | 宿主机映射端口 | Docker |
| 3000 | 容器内部监听端口 | Gitea |
教训总结
- 不要在同一台服务器上同时安装两个控制面板(1Panel + AMH),两者的防火墙规则会互相冲突。
ip filter表由 Docker 的iptables-nft创建,只能用iptables命令修改,nft命令会报错。- iptables 规则重启后丢失,需要用
iptables-persistent持久化。 - 排查 Docker 网络问题,优先检查
nft list ruleset中 forward 链的 policy。
常用排查命令速查
# 查看容器端口映射
sudo docker ps --format "table {{.Names}}\t{{.Ports}}"
# 查看 nftables 规则
sudo nft list ruleset 2>/dev/null | grep -E "table|chain|policy"
# 查看 Docker 桥接口
ip link show type bridge
# 查看 iptables FORWARD 链
sudo iptables -L FORWARD -n
# 查看系统服务状态
sudo systemctl list-units | grep -E "amh|docker|firewall"
评论区