目 录CONTENT

文章目录

内网代理共享实战:基于 Docker + Mihomo 搭建网关,拯救无网机器(含国内外流量分流)

允诺
2026-07-03 / 0 评论 / 0 点赞 / 0 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

内网代理共享实战:基于 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 配置有误,导致服务未向局域网暴露。

0

评论区