igozhang

——

    Ubuntu 20.04 配置 Squid/HTTP (TUN 全局分流)

    适用场景:内网已有 Squid HTTP 代理,希望在 Ubuntu 20.04 服务器上实现 所有流量按规则分流(国内直连、国外走代理)。

    本文基于 Clash.Verge 2.5.1 deb 安装包 内置的 Mihomo 内核,无需 GUI,5 步完成部署。


    架构一览

    ┌─────────────┐     TUN 接管      ┌──────────────┐    HTTP CONNECT     ┌─────────────────┐
    │  应用程序    │ ───────────────► │ mihomo       │ ──────────────────► │ Squid 代理       │
    │ curl/浏览器  │   198.18.0.0/30  │ 127.0.0.1    │  10.80.238.40:3128  │ 明文 HTTP 代理    │
    └─────────────┘                   │ :7890 / :9090│                     └─────────────────┘
                                      └──────────────┘
                                            │
                              ┌─────────────┼─────────────┐
                              ▼             ▼             ▼
                           DIRECT        DIRECT         PROXY
                        (局域网/国内)   (指定域名)      (其余流量)
    
    组件 说明
    Squid 代理 企业 HTTP 代理,10.80.238.40:3128,明文 HTTP CONNECT
    mihomo Clash Meta 内核,从 Clash.Verge deb 中提取,负责 TUN 分流
    TUN 模式 系统层接管全部流量,按 rules 决定 DIRECT 或 PROXY
    fake-ip DNS TUN 下国外域名返回假 IP(198.18.x.x),避免 8.8.8.8 直连被阻断

    前置条件

    检查项 命令 预期
    系统版本 cat /etc/os-release Ubuntu 20.04
    架构 uname -m x86_64
    TUN 设备 test -c /dev/net/tun && echo OK OK
    上游代理可达 nc -zv -w 3 10.80.238.40 3128 succeeded
    deb 包已上传 ls ~/Clash.Verge_2.5.1_amd64.deb 文件存在

    关于 Clash Verge GUI: Ubuntu 20.04 无法安装 Clash Verge 图形界面(缺少 libwebkit2gtk-4.1-0,该库仅 22.04+ 提供)。本文直接从 deb 中提取 Mihomo 内核 以命令行 + systemd 方式运行,效果等同且更适合服务器。


    五步部署

    以下命令均在目标 Ubuntu 20.04 机器上执行,假设 deb 位于 /home/igo/
    igo 替换为你的实际用户名。

    第 1 步:从 deb 提取 Mihomo 内核

    无需联网,直接从已上传的 deb 解包:

    dpkg-deb -x /home/igo/Clash.Verge_2.5.1_amd64.deb /tmp/cve && \
    sudo cp /tmp/cve/usr/bin/verge-mihomo-alpha /usr/local/bin/mihomo && \
    sudo chmod +x /usr/local/bin/mihomo && \
    /usr/local/bin/mihomo -v
    

    预期输出类似:

    Mihomo Meta alpha-xxx linux amd64 with go1.26.x
    

    同时复制 GeoIP 数据库(供 GEOIP,CN 规则使用):

    sudo mkdir -p /etc/mihomo && \
    sudo cp "$(find /tmp/cve -iname 'country.mmdb' | head -1)" /etc/mihomo/
    

    第 2 步:写入配置文件

    将以下完整配置写入 /etc/mihomo/config.yaml

    sudo tee /etc/mihomo/config.yaml > /dev/null <<'EOF'
    mixed-port: 7890
    allow-lan: false
    bind-address: '*'
    mode: rule
    log-level: info
    ipv6: false
    external-controller: 127.0.0.1:9090
    
    tun:
      enable: true
      stack: system
      auto-route: true
      auto-detect-interface: true
      dns-hijack:
        - any:53
    
    dns:
      enable: true
      ipv6: false
      enhanced-mode: fake-ip
      fake-ip-range: 198.18.0.1/16
      respect-rules: true
      default-nameserver:
        - 223.5.5.5
        - 119.29.29.29
      nameserver:
        - 223.5.5.5
        - 119.29.29.29
      proxy-server-nameserver:
        - 223.5.5.5
        - 119.29.29.29
      fallback:
        - 8.8.8.8
        - 1.1.1.1
      fallback-filter:
        geoip: true
        geoip-code: CN
    
    proxies:
      - name: igoproxy
        type: http
        server: 10.80.238.40
        port: 3128
    
    proxy-groups:
      - name: PROXY
        type: select
        proxies:
          - igoproxy
          - DIRECT
    
    rules:
      - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
      - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
      - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
      - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
      - IP-CIDR,::1/128,DIRECT,no-resolve
      - AND,((NETWORK,UDP),(DST-PORT,443)),REJECT
      - DOMAIN-SUFFIX,cursor.com,DIRECT
      - DOMAIN-SUFFIX,igozhang.cn,DIRECT
      - DOMAIN-SUFFIX,igozhang.cc,DIRECT
      - GEOIP,CN,DIRECT,no-resolve
      - MATCH,PROXY
    EOF
    

    校验配置语法:

    sudo /usr/local/bin/mihomo -t -d /etc/mihomo
    

    预期:configuration file ... test is successful


    第 3 步:创建 systemd 服务

    TUN 模式需要 CAP_NET_ADMIN 权限:

    sudo tee /etc/systemd/system/mihomo.service > /dev/null <<'EOF'
    [Unit]
    Description=Mihomo Proxy with TUN
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
    Restart=on-failure
    RestartSec=5
    LimitNOFILE=65536
    AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
    CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    sudo systemctl daemon-reload && \
    sudo systemctl enable --now mihomo
    

    第 4 步:验证分流

    等待 3 秒让 TUN 就绪,然后测试:

    sleep 3
    getent hosts www.google.com
    curl -s -o /dev/null -w "google=%{http_code}\n" https://www.google.com
    curl -s -o /dev/null -w "baidu=%{http_code}\n"  http://www.baidu.com
    
    测试项 预期 含义
    getent 198.18.x.x www.google.com fake-ip DNS 正常
    Google 200 国外流量走 igoproxy
    百度 200302 国内流量直连

    查看路由日志:

    journalctl -u mihomo --no-pager -n 30 | grep -E 'TCP|PROXY|DIRECT'
    

    第 5 步:清理(可选)

    Clash Verge GUI 包在 20.04 上无法正常使用,可移除:

    sudo dpkg -r clash-verge
    

    临时解包目录可删除:

    rm -rf /tmp/cve
    

    配置要点说明

    为什么用 TUN 而不是系统代理 / 环境变量?

    方式 覆盖范围
    http_proxy 环境变量 仅部分 CLI 工具
    系统代理设置 仅部分 GUI 应用
    TUN 模式 几乎全部 TCP/UDP 流量

    TUN 在网卡层接管流量,再由 Mihomo 按 rules 分流,是服务器上实现「全局按规则走代理」的最简方案。

    两个关键配置项

    1. 明文 HTTP 代理(3128 端口)

    上游 Squid 使用明文 HTTP CONNECT,配置尽量简洁:

    proxies:
      - name: igoproxy
        type: http
        server: 10.80.238.40
        port: 3128
    

    无需 tlssniskip-cert-verify。部署前验证上游可用:

    curl -x http://10.80.238.40:3128 -o /dev/null -w "%{http_code}\n" https://www.google.com
    # 预期: 200
    

    若 Squid 要求 HTTPS 代理:22 + 域名 igoproxy.sunwoda-evb.com),见文末 HTTPS 连 Squid

    2. enhanced-mode: fake-ip

    TUN 模式下 不要用 redir-hostredir-host 需要 fallback DNS(8.8.8.8)可达,而多数企业网络会阻断直连 8.8.8.8,导致 Google 等域名无法解析。

    fake-ip 由 Mihomo 直接返回 198.18.x.x 假 IP,连接时再按域名规则分流,无需依赖外部 DNS 可达。


    分流规则

    当前规则优先级(从上到下):

    顺序 规则 效果
    1 局域网 IP 段 直连
    2 UDP/443 (QUIC) 拒绝(防止浏览器绕过代理)
    3 cursor.com / igozhang.cn / igozhang.cc 直连
    4 GEOIP,CN 国内 IP 直连
    5 MATCH 其余全部走 Squid 代理

    按需修改 /etc/mihomo/config.yaml 中的 rules 段,改完后:

    sudo /usr/local/bin/mihomo -t -d /etc/mihomo && sudo systemctl restart mihomo
    

    日常运维

    # 查看运行状态
    systemctl status mihomo
    
    # 重启服务(TUN 会短暂中断 1~2 秒)
    sudo systemctl restart mihomo
    
    # 查看最近 60 行日志
    journalctl -u mihomo --no-pager -n 60
    
    # 校验配置语法
    sudo /usr/local/bin/mihomo -t -d /etc/mihomo
    
    # 停止并禁用(恢复原始网络)
    sudo systemctl stop mihomo
    sudo systemctl disable mihomo
    
    端口 用途
    TUN Meta 接口 全局流量入口(自动创建)
    127.0.0.1:7890 本地 mixed 代理(可选,供手动 -x 使用)
    127.0.0.1:9090 RESTful API(仅本机)

    HTTPS 连 Squid

    适用场景:企业 Squid 使用 HTTPS 代理(mihomo → Squid 走 TLS),需将第 2 步默认的明文 HTTP(3128)改为 HTTPS。

    本环境已验证参数: 10.80.238.40:22,证书域名 igoproxy.sunwoda-evb.com(企业自签证书)。

    与明文 HTTP 相比,HTTPS 模式需额外三处配置:

    配置项 作用
    dns.hosts Mihomo 不读系统 /etc/hosts,内网代理域名须在此声明
    proxies.sni TLS 握手时携带证书域名(Squid 证书签给域名而非 IP)
    proxies.skip-cert-verify 跳过企业自签/内网 CA 证书校验

    第 1 步:确认 Squid HTTPS 代理可用

    在改 mihomo 配置前,先用 curl 单独验证上游:

    nc -zv -w 3 10.80.238.40 22
    curl -x https://10.80.238.40:22 --proxy-insecure -o /dev/null -w "%{http_code}\n" https://www.google.com
    # 预期: 200
    

    --proxy-insecure 仍失败,说明 Squid HTTPS 未就绪,先联系网管,不要改 mihomo。

    第 2 步:写入 HTTPS 完整配置

    以下脚本会覆盖 /etc/mihomo/config.yaml 为已验证可用的 HTTPS 版本(含 tunfake-ipdns.hostssniskip-cert-verify):

    sudo tee /etc/mihomo/config.yaml > /dev/null <<'EOF'
    mixed-port: 7890
    allow-lan: false
    bind-address: '*'
    mode: rule
    log-level: info
    ipv6: false
    external-controller: 127.0.0.1:9090
    
    tun:
      enable: true
      stack: system
      auto-route: true
      auto-detect-interface: true
      dns-hijack:
        - any:53
    
    dns:
      enable: true
      ipv6: false
      enhanced-mode: fake-ip
      fake-ip-range: 198.18.0.1/16
      respect-rules: true
      # Mihomo 不读系统 hosts,代理域名须在此声明
      hosts:
        igoproxy.sunwoda-evb.com: 10.80.238.40
      default-nameserver:
        - 223.5.5.5
        - 119.29.29.29
      nameserver:
        - 223.5.5.5
        - 119.29.29.29
      proxy-server-nameserver:
        - 223.5.5.5
        - 119.29.29.29
      fallback:
        - 8.8.8.8
        - 1.1.1.1
      fallback-filter:
        geoip: true
        geoip-code: CN
    
    proxies:
      - name: igoproxy
        type: http
        server: 10.80.238.40
        port: 22
        tls: true
        sni: igoproxy.sunwoda-evb.com
        skip-cert-verify: true
    
    proxy-groups:
      - name: PROXY
        type: select
        proxies:
          - igoproxy
          - DIRECT
    
    rules:
      - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
      - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
      - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
      - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
      - IP-CIDR,::1/128,DIRECT,no-resolve
      - AND,((NETWORK,UDP),(DST-PORT,443)),REJECT
      - DOMAIN-SUFFIX,cursor.com,DIRECT
      - DOMAIN-SUFFIX,igozhang.cn,DIRECT
      - DOMAIN-SUFFIX,igozhang.cc,DIRECT
      - GEOIP,CN,DIRECT,no-resolve
      - MATCH,PROXY
    EOF
    

    proxies 段关键字段说明:

    字段 说明
    port 22 Squid HTTPS 代理端口(非 3128)
    tls true mihomo → Squid 走 TLS
    sni igoproxy.sunwoda-evb.com 与 Squid 证书域名一致
    skip-cert-verify true 企业自签证书必须开启

    第 3 步:校验并重启

    sudo /usr/local/bin/mihomo -t -d /etc/mihomo && sudo systemctl restart mihomo
    

    第 4 步:验证分流

    sleep 3
    getent hosts www.google.com
    curl -s -o /dev/null -w "google=%{http_code}\n" https://www.google.com
    curl -s -o /dev/null -w "baidu=%{http_code}\n"  http://www.baidu.com
    journalctl -u mihomo --no-pager -n 30 | grep -E 'TCP|PROXY|DIRECT|igoproxy'
    
    测试项 预期
    getent 198.18.x.x www.google.com
    Google 200(国外走 igoproxy,经 HTTPS :22 连 Squid)
    百度 200302(国内直连)

    文档版本:2026-07-05 | 验证环境:Ubuntu 20.04.6 LTS / kernel 5.4 / Clash.Verge 2.5.1

    MP3