Docker内部对外网络不通解决方案

697 字
3 分钟
Docker内部对外网络不通解决方案

原因分析#

Docker容器(主动向外网链接时)内部依赖 NAT 与宿主机的网卡沟通,因此在1panel中如果关闭Docker的iptables自动控制,就会使得docker无法在iptables中建立NAT的规则,造成容器内无法向外界请求,表现为:

  • 如果使用WordPress或者halo这些WEB服务,客户端在访问服务器页面时会保持正常,但是当打开服务的商店系统,或者要求服务向外连接下载时,返回超时
  • 拿 curl -v www.baidu.com 时返回DNS解析后的IP地址,但是就是无法访问成功
  • 前期应用可以正常使用,但是在容器重建后或者更新后就无法使用了

解决#

方案一(打开Docker的iptables)#

在使用1panel时,可以到docker的配置目录开启iptables,并且重启docker,但是要注意:打开后可能容器会向外映射,以此绕过防火墙

方法二(手动维护iptables)#

需要手动通过指令维护,因此我推荐使用一下脚本,每隔3min检测一下

#!/bin/bash
# ========================
# Docker NAT Masquerade 添加脚本(带日志提示)
# ========================
# 要伪装的网段(你的 Docker 网络网段)
SUBNET="172.18.0.0/16"
# ================================
# 方式1:最常用 - 不指定出接口(绝大多数情况够用)
# ================================
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 正在检查/添加 MASQUERADE 规则 (网段: $SUBNET) ..."
if iptables -t nat -C POSTROUTING -s "$SUBNET" -j MASQUERADE 2>/dev/null; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 规则已经存在,无需重复添加 → 跳过"
else
if iptables -t nat -A POSTROUTING -s "$SUBNET" -j MASQUERADE; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 成功添加 MASQUERADE 规则!"
echo " → 容器现在应该可以正常访问外网了"
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 【错误】添加规则失败!请检查 iptables 是否正常"
exit 1
fi
fi
# ================================
# 方式2:更推荐(指定出接口) - 更安全,建议使用
# 先自己运行下面这行,得到你的公网网卡名,然后把 eth0 改成你自己的
# ip route get 8.8.8.8 | awk '{print $5; exit}'
# ================================
# OUT_INTERFACE="eth0" # ←←← 改成你真正的公网网卡名字!!
# echo ""
# echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查/添加 精确版规则 (出接口: $OUT_INTERFACE) ..."
# if iptables -t nat -C POSTROUTING -s "$SUBNET" -o "$OUT_INTERFACE" -j MASQUERADE 2>/dev/null; then
# echo " → 精确规则已经存在,无需添加"
# else
# if iptables -t nat -A POSTROUTING -s "$SUBNET" -o "$OUT_INTERFACE" -j MASQUERADE; then
# echo " → 成功添加精确版 MASQUERADE 规则"
# else
# echo " 【错误】添加精确规则失败!"
# fi
# fi
echo ""
echo "当前 nat POSTROUTING 规则一览(可快速确认):"
iptables -t nat -L POSTROUTING -n -v --line-numbers | grep -i MASQUERADE || echo "(暂未看到 masquerade 规则)"
echo ""
echo "完成!可以去容器里测试 ping 8.8.8.8 / curl 1.1.1.1"

要注意修改SUBNET,改为要使正常的网段

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Docker内部对外网络不通解决方案
https://www.cacablog.top/posts/docker_net_problem/
作者
CaCa
发布于
2026-02-15
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
CaCa
Hello!远到而来的朋友,不如来我的酒馆里歇息一下吧!
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
6
分类
5
标签
7
总字数
5,431
运行时长
0
最后活动
0 天前

目录