内网代理共享实战:基于 Docker + Mihomo 搭建网关,拯救无网机器(含国内外流量分流)
应用场景:机房或公司内网中,仅有一台 Linux 服务器(如
10.2.44.166)具备外网访问权限,同网段的其他机器(如10.8.x.x)因网络策略被完全隔离。
终极目标:利用这台 Linux 服务器作为网关,让内网其他机器实现全局上网;并且结合上游代理节点,实现国内网站直连、国际网站走代理的智能分流。
方案概览
核心思路是使用 Docker + Mihomo (原 Clash 内核) 搭建一个高性能的代理网关,对外提供 HTTP/SOCKS5 混合代理服务(端口 7890)。
- 基础环境(纯国内):Mihomo 充当透明转发角色,流量直接通过 Linux 服务器的物理网卡出口,访问国内服务(如拉取国内镜像、访问百度/淘宝等)。
- 进阶架构(接轨国际):将另一台具备翻墙能力的机器(例如你工作笔记本上运行的 Clash)作为“上游节点”接入 Mihomo,通过规则引擎实现国内外流量精准分流。
环境准备
- 代理网关机:一台能正常上网的 Linux 服务器(本文假设 IP 为
10.2.44.166),需预装 Docker 与 Docker Compose。 - 上游代理机(可选):一台能访问国际网络的设备(本文假设 IP 为
10.2.46.30,代理软件监听局域网的7897端口)。
第一步:部署 Mihomo 容器
为了保证环境干净且易于维护,我们采用 Docker Compose 进行容器化部署。
1. 创建项目目录
mkdir -p ~/clash-docker/config && cd ~/clash-docker
2. 编写 docker-compose.yml
services:
mihomo:
image: metacubex/mihomo:latest
container_name: mihomo
restart: always
network_mode: "host" # 推荐使用 host 模式,减少 NAT 性能损耗
volumes:
- ./config:/root/.config/mihomo
environment:
- TZ=Asia/Shanghai
第二步:配置基础代理(仅访问国内网络)
如果你的内网机器只需要拉取国内代码或访问常规网站,请在 config 目录下创建最简版 config.yaml:
# config/config.yaml(基础直连版)
mixed-port: 7890
allow-lan: true
bind-address: '0.0.0.0'
mode: rule
log-level: info
rules:
- GEOIP,CN,DIRECT # 中国大陆 IP 直接走网关机物理网卡
- MATCH,DIRECT # 兜底规则:其余流量也全部直连
配置完成后,一键启动容器:
docker-compose up -d
第三步:配置进阶代理(国内外智能分流)
如果你需要内网机器也能无缝访问 Google、GitHub 等外部资源,我们可以将那台 10.2.46.30 的笔记本作为上游网关。
修改 config/config.yaml 为以下进阶配置:
mixed-port: 7890
allow-lan: true
bind-address: '0.0.0.0'
mode: rule
log-level: info
# ---------- 1. 定义上游代理节点 ----------
proxies:
- name: "Upstream-Gateway"
type: socks5 # 确保与上游实际协议一致 (http/socks5)
server: 10.2.46.30 # 笔记本的内网 IP
port: 7897 # 笔记本代理的监听端口
# ---------- 2. 策略组配置 ----------
proxy-groups:
- name: "PROXY"
type: select
proxies:
- "Upstream-Gateway"
- DIRECT
# ---------- 3. 路由规则 (严格按顺序匹配) ----------
rules:
# 国内高频域名及 IP 直连,降低上游节点压力
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-SUFFIX,baidu.com,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
- DOMAIN-SUFFIX,qq.com,DIRECT
- DOMAIN-SUFFIX,weixin.com,DIRECT
- GEOIP,CN,DIRECT
# 未匹配的剩余流量 (国际流量),全部交由上游节点处理
- MATCH,PROXY
重启容器使配置生效:docker-compose restart
第四步:连通性验证与防火墙放行
1. 放行端口
请务必确认网关服务器的防火墙已放行 7890 端口:
firewall-cmd --permanent --add-port=7890/tcp
firewall-cmd --reload
2. 科学的测试方法
在任意一台无网的内网机器上,使用 curl 进行测试。
⚠️ 避坑警告:HTTP/SOCKS5 属于应用层代理,无法代理 ICMP 协议。千万不要用
ping google.com来测试代理是否生效,必定会超时!
正确测试命令:
# 测试国内网络
curl -I -x http://10.2.44.166:7890 https://www.baidu.com
# 测试国际网络 (应返回 HTTP 状态码,如果是 Google 可能会返回 301/302 重定向)
curl -I -x http://10.2.44.166:7890 https://www.google.com
终极形态:Windows 客户端全局无感接管
如果你希望内网机器上的所有软件(不仅仅是浏览器,还包括微信、Git、开发工具等)都能无缝上网,强烈推荐使用 Clash Verge 配合虚拟网卡实现真·全局接管。
1. 新建本地配置
在内网机器的 Clash Verge 中,新建一个“本地 (Local)”配置,填入以下内容:
mode: rule
log-level: info
proxies:
- name: "Lan-Proxy-Gateway"
type: socks5
server: 10.2.44.166
port: 7890
proxy-groups:
- name: "Outbound-Proxy"
type: select
proxies:
- "Lan-Proxy-Gateway"
- DIRECT
rules:
# 内网互访流量直连,防止内网 SSH、数据库连接中断
- IP-CIDR,10.0.0.0/8,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,172.16.0.0/12,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT
# 剩下的所有外网请求,全部打包扔给网关服务器
- MATCH,Outbound-Proxy
2. 开启 TUN 模式(核心步骤)
保存并启用该配置后,必须前往 Clash Verge 的网络设置面板中,开启“虚拟网卡 (TUN) 模式”。只有开启 TUN 模式,底层网络流量才会被强制劫持,彻底解决“只有浏览器能上网,其他软件断网”的世纪难题。
🔧 常见问题排雷 (FAQ)
-
**Q: 容器启动失败,日志报错
if "respect-rules" is turned on, "proxy-server-nameserver" cannot be empty** -
A: 如果你在配置中添加了
dns模块并启用了respect-rules: true,Mihomo 要求必须指定解析代理服务器域名的 DNS。最简单的解法是直接删除整个 DNS 块,或者补充proxy-server-nameserver: [114.114.114.114]。 -
Q: 我想在配置里写上游机器的主机名 (Hostname) 而不是固定 IP?
-
A: 可以在
docker-compose.yml中将主机的/etc/hosts挂载进去 (- /etc/hosts:/etc/hosts:ro),但注意 Mihomo 默认不读取本地 hosts。你需要在配置文件中完整定义 DNS 模块并开启use-hosts: true。对于非重度折腾玩家,直接写死 IP 是最稳定的选择。 -
Q: 为什么网关服务起来了,但内网机器还是连不上?
-
A: 进入网关服务器执行
ss -lntp | grep 7890,检查监听地址是否为0.0.0.0:7890或者是:::7890。如果是127.0.0.1,说明你的bind-address配置有误,导致服务未向局域网暴露。
评论区