跳转至

代理

代理服务器(Proxy Server)是网络中的一个中间实体,它代表客户端向目标服务器发送请求,并接收目标服务器的响应。其主要功能包括转发请求、缓存数据、访问控制、隐藏客户端真实IP以及突破网络限制等。

代理工作在应用层,通常是 HTTP/HTTPS/SOCKS。通常不加密 (HTTPS代理除外)。流量仅限配置了代理的特定应用(如浏览器、下载软件)。速度较快(因为只处理特定流量且可能不加密)。

发明代理服务器的根本原因是为了提高性能、控制访问和节省资源。在带宽昂贵且有限的情况下,设置一个HTTP代理服务器,可以把内容缓存起来,后面人再访问时,直接从代理服务器获取即可。同时,当机构需要知道个人上网在做什么,或者禁止访问某些网站时,可以设置代理服务器,对流量进行控制和审计。

DNS

  • 在系统代理模式下,代理软件仅代理应用层流量(HTTP/HTTPS/SOCKS),不强制接管 DNS。系统 DNS 设置仍生效,但 DNS 请求可能被代理规则处理。
  • 在透明代理/TUN 模式下,代理软件通过虚拟网卡接管所有网络流量,包括 DNS 请求。此时代理软件完全控制 DNS 解析。
  • 如果代理软件未显式配置 DNS,大多数代理工具会沿用系统 DNS
  • 如果代理软件显式配置了 DNS(例如 Clash 配置中指定了 nameserver: 114.114.114.114,且开启了 dns.enable: true),代理软件会拦截 DNS 请求,并使用自身配置的 DNS 服务器。

判断

nslookup google.com
  • 如果返回的 DNS 服务器地址是 127.0.0.1 或代理软件监听的端口(如 127.0.0.1:53),说明 DNS 被代理接管。
  • 如果返回的是系统 DNS(如 10.10.0.21),说明代理未接管。

系统代理

当设置了 HTTPS_PROXY=127.0.0.1:7890,实际上是在告诉系统中所有支持该变量的软件(比如 curlpipgit 或浏览器):请不要直接建立连接,而是先把数据包交给 127.0.0.1:7890 托管。即使要访问本地服务,程序在检查环境变量,发现存在 HTTPS_PROXY后,也会把流量发给代理端口。

NO_PROXY

为了防止这种“自己找自己还要通过代理”的尴尬情况,网络协议栈引入了另一个关键环境变量:NO_PROXY。当设置:

export HTTPS_PROXY=127.0.0.1:7890
export NO_PROXY=localhost,127.0.0.1,::1

程序就会检查 NO_PROXY,发现目标在排除名单中,绕过代理,直接建立回环连接。

Clash

配置文件

rules:
    // 绕过本地地址,避免回环
  - IP-CIDR,127.0.0.0/8,DIRECT
  - DOMAIN,localhost,DIRECT

Mihomo

订阅导入

  • 返回完整 YAML 配置的订阅:
# 一条命令更新(自动注入自定义规则)
python3 ~/.config/mihomo/update_gladost.py

# 然后重启生效
sudo systemctl restart mihomo

脚本会自动: 1. 下载 GLaDOS 订阅配置 2. 注入浙大直连、Tailscale 直连、内网直连等自定义规则 3. 修改 WSL 适配设置(allow-lan 等) 4. 写入 config.yaml

poke-mon 订阅(返回 base64 节点列表)

curl -sL "你的订阅链接" | base64 -d | python3 ~/.config/mihomo/gen_config.py > ~/.config/mihomo/config.yaml
sudo systemctl restart mihomo

通用更新脚本(推荐用这个)

python3 ~/.config/mihomo/update_config.py
sudo systemctl restart mihomo

二、切换节点

方式1: Web Dashboard(最接近 Windows 体验,推荐)

mihomo 有外部控制器 API 在 127.0.0.1:9090。

在 Windows 浏览器打开以下任一面板: - yacd: https://yacd.haishan.me - metacubexd: https://metacubex.github.io/metacubexd/

连接地址填:http://127.0.0.1:9090

注意:WSL NAT 模式下,Windows 可能无法直接访问 127.0.0.1:9090。 需要先在 WSL 里运行端口转发,或者用 WSL 的实际 IP。 查看 WSL IP: hostname -I | awk '{print $1}' 然后在 Windows 浏览器打开 http://:9090/ui

方式2: curl API 直接切

# 查看所有代理组
curl -s http://127.0.0.1:9090/proxies | python3 -m json.tool

# 查看当前 PROXY 组选了哪个节点
curl -s http://127.0.0.1:9090/proxies/PROXY | python3 -m json.tool

# 切换到某个节点(GLaDOS 用 "Default Proxy" 组)
curl -s -X PUT http://127.0.0.1:9090/proxies/Default%20Proxy \
  -H "Content-Type: application/json" \
  -d '{"name":"US-Dedicated-F1-1"}'

# 切换到 Auto(自动测速)
curl -s -X PUT http://127.0.0.1:9090/proxies/Default%20Proxy \
  -H "Content-Type: application/json" \
  -d '{"name":"Auto"}'

三、代理模式(规则/全局/直连)

通过 API 切换

# 规则模式(默认,按 rules 列表匹配)
# 这是默认模式,不需要额外操作

# 全局模式(所有流量走代理)
curl -s -X PUT http://127.0.0.1:9090 \
  -H "Content-Type: application/json" \
  -d '{"mode":"global"}'

# 规则模式
curl -s -X PUT http://127.0.0.1:9090 \
  -H "Content-Type: application/json" \
  -d '{"mode":"rule"}'

# 直连模式
curl -s -X PUT http://127.0.0.1:9090 \
  -H "Content-Type: application/json" \
  -d '{"mode":"direct"}'

通过 Web Dashboard

在 yacd/metacubexd 面板里直接点选模式。

四、TUN 模式 vs 系统代理

当前:系统代理模式

环境变量方式,只有读取 http_proxy 的程序才走 mihomo:

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

适用于:curl, git, pip, npm, apt 等命令行工具。

TUN 模式(可选)

创建虚拟网卡,拦截所有流量(包括不支持代理的程序)。

在 config.yaml 中添加:

tun:
  enable: true
  stack: system        # 或 gvisor
  dns-hijack:
    - any:53
  auto-route: true
  auto-detect-interface: true

注意: - WSL 里开 TUN 需要 root 权限 - 可能和 Tailscale 冲突 - 目前系统代理方式对 WSL 来说够用

五、常用命令速查

# 查看 mihomo 状态
sudo systemctl status mihomo

# 重启 mihomo
sudo systemctl restart mihomo

# 查看实时日志
sudo journalctl -u mihomo -f

# 查看最近的日志(看走了什么规则)
sudo journalctl -u mihomo --since "5 min ago" | grep "match"

# 测试代理是否工作
curl -I --proxy http://127.0.0.1:7890 https://www.google.com
curl -I --proxy http://127.0.0.1:7890 https://www.baidu.com

# 查看 WSL IP(Windows 浏览器连面板用)
hostname -I | awk '{print $1}'

# 更新 GLaDOS 订阅
python3 ~/.config/mihomo/update_gladost.py && sudo systemctl restart mihomo

六、自定义规则说明

当前已配置的自定义规则(注入到 rules 最前面):

规则 说明
DOMAIN-SUFFIX,zju.edu.cn,DIRECT 浙大官网
DOMAIN-SUFFIX,zju.cn,DIRECT 浙大域名
DOMAIN-SUFFIX,cc98.org,DIRECT CC98 论坛
DOMAIN-SUFFIX,zjucc.com,DIRECT 浙大社区
DOMAIN-SUFFIX,zjuer.cn,DIRECT 浙大人
IP-CIDR,100.64.0.0/10,DIRECT Tailscale 网段
IP-CIDR,fd7a:115c:a1e0::/48,DIRECT Tailscale IPv6
IP-CIDR,10.0.0.0/8,DIRECT 内网 A 类
IP-CIDR,172.16.0.0/12,DIRECT 内网 B 类
IP-CIDR,192.168.0.0/16,DIRECT 内网 C 类
DOMAIN-SUFFIX,portal.azure.com,DIRECT Azure 门户
GEOSITE,cn,DIRECT 中国域名直连
GEOIP,CN,DIRECT 中国 IP 直连

这些规则优先级最高,匹配后直接走直连,不经过代理。

七、文件位置

~/.config/mihomo/
├── config.yaml          # 当前生效的配置(mihomo 读这个)
├── config_raw.yaml      # poke-mon 订阅原始 base64 数据
├── gen_config.py        # poke-mon 订阅转 config 的脚本
├── update_gladost.py    # GLaDOS 订阅更新脚本(注入自定义规则)
├── update_config.py     # 通用更新脚本(合并所有订阅)
├── geoip.metadb         # GeoIP 数据库
└── cache.db             # 连接缓存

八、故障排查

# mihomo 启动失败
sudo journalctl -u mihomo --since "5 min ago" --no-pager

# 端口被占用
ss -tlnp | grep 7890
ss -tlnp | grep 9090

# 代理不通
curl -v --proxy http://127.0.0.1:7890 https://www.google.com 2>&1 | head -20

# DNS 问题
nslookup google.com 223.5.5.5