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 正常 |
200 |
国外流量走 igoproxy | |
| 百度 | 200 或 302 |
国内流量直连 |
查看路由日志:
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
无需 tls、sni、skip-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-host。redir-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 版本(含 tun、fake-ip、dns.hosts、sni、skip-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 |
200(国外走 igoproxy,经 HTTPS :22 连 Squid) |
|
| 百度 | 200 或 302(国内直连) |
文档版本:2026-07-05 | 验证环境:Ubuntu 20.04.6 LTS / kernel 5.4 / Clash.Verge 2.5.1