返回

Docker Macvlan 搭配 Clash Tun 实现透明代理网关

在 Debian 12 上使用 Docker Macvlan 和 Clash Tun 模式搭建透明代理网关
2025-08-08
5287 字 · 约 14 分钟阅读

Docker 的 Macvlan 模式可以让容器以 L2 级的虚拟网桥连接宿主机的物理网卡,实现获得独立的 IP 地址,再搭配 Clash Tun 模式可以轻松地实现局域网内的网关透明代理

这一套实现效果会类似于 Docker 版 OpenWrt 透明代理,原理上是一样的,Docker OpenWrt 也是借助 Macvlan 来实现

下面将在 debian12 上实现一个基于 Docker + mihomo 的透明代理网关,达到对局域网内设备的透明代理效果(国内外分流 + Fake-IP 模式)

以下操作默认已经安装了 Docker 和 Docker Compose,并且对基本的 Docker 命令有一定了解

首先创建一个目录:

mkdir mihomo && cd mihomo

接下来创建一个 compose.yaml 文件,内容如下:

services:
  mihomo:
    image: debian:stable
    container_name: mihomo
    privileged: false # 不需要特权模式
    restart: unless-stopped
    dns:
      - 127.0.0.1 # 启用 fake-ip 则这里一定要声明为容器本身的 dns,避免 docker 容器 dns 干扰
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    volumes:
      - ./app:/app
    command: ["/app/mihomo-linux-amd64-v1.19.10", "-d", "/app/config"]
    networks:
      macvlan_net:
        ipv4_address: 192.168.1.2 # 替换为你的静态 IP
    sysctls:
      net.ipv4.ip_forward: 1
networks:
  macvlan_net:
    driver: macvlan
    driver_opts:
      parent: enp1s0  # 替换为你的物理网卡名称
    ipam:
      config:
        - subnet: 192.168.1.0/24 # 替换为你的子网
          gateway: 192.168.1.1 # 替换为你的网关

将上述内容保存为 compose.yaml 文件,并在同一目录下创建一个 app 目录,将 mihomo-linux-amd64-v1.19.10 可执行文件放入其中:

mkdir app && cd app
wget https://github.com/MetaCubeX/mihomo/releases/download/v1.19.10/mihomo-linux-amd64-v1.19.10.gz
gzip -d mihomo-linux-amd64-v1.19.10.gz
chmod +x mihomo-linux-amd64-v1.19.10

先运行 docker compose 命令来启动容器:

docker compose up -d

此时目录结构如下:

# tree -L 2
.
├── app
│   ├── config
│   ├── example.yaml
│   └── mihomo-linux-amd64-v1.19.10
└── compose.yaml

修改 config/config.yaml 文件,并配置 Clash Tun 模式,参考配置文件如下:

log-level: info
secret: "password"

# Web UI 配置
external-controller: 0.0.0.0:9090
external-ui: ui
external-ui-url: https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip

#自定义 geodata url
geox-url:
  geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
  geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
  mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"

# Tun 配置
tun:
  enable: true
  stack: system # gvisor/mixed
  dns-hijack:
    - 0.0.0.0:53 # 需要劫持的 DNS
  auto-detect-interface: true # 自动识别出口网卡
  auto-route: true # 配置路由表

dns:
  enable: true
  ipv6: false # 禁用 IPv6 DNS 查询
  listen: 0.0.0.0:53
  nameserver: [8.8.8.8, 1.1.1.1]
  fallback: [223.5.5.5, 223.6.6.6]
  fake-ip-range: 198.18.0.1/16 # fake-ip 模式下分配的虚拟 IP 段
  enhanced-mode: fake-ip # 启用 fake-ip 模式,防止 DNS 污染和透明代理
  # # 按域名分流 DNS 查询
  nameserver-policy:
    # 命中以下规则集的域名,DNS 查询会走国内 DNS
    RULE-SET:direct,apple,icloud,applications: [192.168.1.1] # 替换为你的 DNS 服务器 IP
  fake-ip-filter:
    - +.msftconnecttest.com
    - +.msftncsi.com
    - rule-set:direct

# 订阅节点
proxy-providers:
  your-subscribe:
    type: http
    url: https://example.com/your-subscribe-url
    interval: 3600
    path: ./subscribes/your-subscribe.yaml

# 代理组
proxy-groups:
  - name: default
    type: select
    url: https://www.gstatic.com/generate_204
    interval: 300
    use:
      - your-subscribe

# 规则提供者
# https://github.com/Loyalsoldier/clash-rules
rule-providers:
  # 直连域名列表
  direct:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt
    path: ./ruleset/direct.yaml
    interval: 86400
  # 代理域名列表
  proxy:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt
    path: ./ruleset/proxy.yaml
    interval: 86400
  # 广告域名列表
  reject:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt
    path: ./ruleset/reject.yaml
    interval: 86400
  # 苹果域名列表
  apple:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/apple.txt
    path: ./ruleset/apple.yaml
    interval: 86400
  # iCloud 域名列表
  icloud:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/icloud.txt
    path: ./ruleset/icloud.yaml
    interval: 86400
  # GFW 域名列表
  gfw:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/gfw.txt
    path: ./ruleset/gfw.yaml
    interval: 86400
  # 非中国大陆使用的顶级域名列表
  tld-not-cn:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/tld-not-cn.txt
    path: ./ruleset/tld-not-cn.yaml
    interval: 86400
  # Telegram 使用的 IP 地址列表
  telegramcidr:
    type: http
    behavior: ipcidr
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/telegramcidr.txt
    path: ./ruleset/telegramcidr.yaml
    interval: 86400
  # 局域网 IP 地址列表
  lancidr:
    type: http
    behavior: ipcidr
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/lancidr.txt
    path: ./ruleset/lancidr.yaml
    interval: 86400
  # 中国大陆 IP 地址列表
  cncidr:
    type: http
    behavior: ipcidr
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/cncidr.txt
    path: ./ruleset/cncidr.yaml
    interval: 86400
  # 需要直连的常见软件列表
  applications:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/applications.txt
    path: ./ruleset/applications.yaml
    interval: 86400

# 分流规则排序,根据需要调整优先级
rules:
  - RULE-SET,cncidr,DIRECT
  - RULE-SET,direct,DIRECT
  - RULE-SET,icloud,DIRECT
  - RULE-SET,lancidr,DIRECT
  - RULE-SET,applications,DIRECT
  - RULE-SET,apple,default
  - RULE-SET,gfw,default
  - RULE-SET,proxy,default
  - RULE-SET,telegramcidr,default
  - RULE-SET,tld-not-cn,default
  - RULE-SET,reject,REJECT

  - MATCH,DIRECT

访问 192.168.1.2:9090/ui 访问 Clash 的 Web UI,在上面修改完毕后可动态加载配置文件,无需重启

将局域网内其他设备的 ip 与 dns 设置为容器 ip,测试分流效果即可

留言

发表留言