概述

traffic example

本文讲述如何在一台普通的Linux(常见的发行版应该都没问题)安装Mihomo核心代理本机和局域网流量,并让steam和tailscale流量直连。同时不需要手动编辑iptables和nftables的规则。

对于负责代理的主机/软件,这里统称为 代理网关

在代理网关内部的流量,默认都会经过代理网关,局域网的流量则根据规则来判断。

准备工作

开启Linux内核流量转发

开启内核流量转发的关键在于设置以下几个参数

如果需要持久启用,可以将以下内容填入/etc/sysctl.d/99-sysctl.conf(如果由systemd管理),也可以在/etc/sysctl.conf设置

net.ipv4.ip_forward = 1
net.ipv4.conf.all.forwarding = 1
net.ipv6.conf.all.forwarding = 1

设置路由器静态路由

将FakeIP网段192.18.0.0/16的下一条设置为代理网关的IP,这样所有通过FakeIP DNS解析的请求都会被路由到代理网关。

Tun

TUN设备是一个虚拟的三层网络接口,其实功能和只能用IP通信的网口(网卡)一样,特定的流量会被路由到TUN设备,只不过这些流量在被路由到TUN设备之后不会像普通的网卡一样,去往网关,而是会回到本机,由用户空间的程序进行处理(在这里指得就是Mihomo了)。不过因为TUN设备在三层,是无法获取到需要的代理的流量原本的域名,所以还需要需要 IP-域名 的映射表,这样就可以对流量进行分流。

TUN设备配置

Mihomo Tun的基础配置。

记得排除其他VPN网段的流量,如tailscale使用 100.64.0.0/10 网段。

tun:
  enable: true
  stack: mixed # 可选system或者gvisor,如果在windows上或者mac系统上选择mixed或者system需要放行防火墙
  auto-route: true # 自动设置路由表,
  route-exclude-address: # 把以下这些地址/网络排除在外
    - 192.168.0.0/16
    - fc00::/7

    # 排除Tailscale流量
    - 100.64.0.0/10

FakeIP

FakeIP能够创建这样一张映射表。启用FakeIP首先需要启用DNS功能。FakeIP是一个具有“黑魔法”的DNS服务器,它需要监听53端口(当然也可以通过DNS劫持等方法将DNS流量劫持到Mihomo),设置上游DNS服务器。对于不需要返回fakeip(也就是不走代理的流量,作用一样,但是并不是同一个东西)的请求,它将请求的域名转发给上游,最后返回服务器的IP地址,向IP-域名映射表中记录真实的映射关系。真正的“黑魔法”在于:对于需要代理的请求,FakeIP在收到这个请求以后立即返回一个虚假的IP,并添加到映射表中,对于后续的IP流量,直接转发给对端(也就是代理供应商的)。

注意,当启用FakeIP进行透明代理时,需要关闭浏览器/操作系统的安全DNS(DoH,DoT),并将DNS服务器设为代理网关的IP。

FakeIP配置

如果想要开启FakeIP,首先需要配置DNS,为了只代理有需要的流量,还需要进行DNS分流。

DNS 分流

在Mihomo中,DNS的作用如下:

  • 规则匹配: 当匹配到基于IP的规则(且没有no-resolve,反之则不解析)时,比如根据geoip数据库判断是否为国内流量,如果是则走直连GEOIP,cn,DIRECT,Mihomo调用DNS模块解析出IP,然后进行比对,并判断是否执行操作。
  • 直连: 如果请求的域名在fake-ip-filter中,返回由上游DNS解析出的真实IP,后续的流量请求则不再经过代理网关。

分流规则集: clash-rules

fake ip filter

把希望直连或者代理会出问题(主要是游戏和NTP,一是延迟高,二是服务器可能处理不好UDP)的域名放在fakeip filter中。如果不是来自本机,在fake ip filter中的域名的后续请求不会再经过代理网关。

Steam分流

Steam的分流策略:默认直连,同时对Steam Community进行代理。Steam用 +.steamserver.net 域名来判断下载地区,所以需要返回真实IP。

Tailscale

除了排除Tailscale的网段以外,为了能够正常连接tailscale服务器,还需要为Tailscale有关域名返回真实IP。 可以在这里找到需要跳过的域名: What if I really, really want to specify the hostnames that Tailscale uses to operate its service?

Example

dns:
  enable: true
  listen: 0.0.0.0:53
  default-nameserver:
    - 223.5.5.5
    - 1.12.12.12
  nameserver:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query
  nameserver-policy:
    # 国内域名
    "rule-set:applications,direct,icloud,apple":
      - https://doh.pub/dns-query
      - https://dns.alidns.com/dns-query
    
    # 内网域名使用内网DNS来解析
    "+.your-domain.home":
      - 192.168.1.1

  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter-mode: blacklist
  fake-ip-filter:
   - '*.lan'

    # 规则来自github仓库Loyalsoldier/clash-rules
    - "rule-set:applications,private,direct,icloud,apple"

    # steam返回真实IP
    - '+.steamserver.net' 

    # 不代理tailscale的流量
    - 'login.tailscale.com'
    - 'controlplane.tailscale.com'
    - 'log.tailscale.io'
    - 'log.tailscale.com'
    - '+.tailscale.com'

规则配置

当设置了FakeIP filter以后,不需要代理的流量就不再会经过代理网关,而需要代理的流量可以简单的走代理。如果代理网关本身不需要代理,且不需要后续更加准确的分流,那么规则配置就不必过多关心。

但是如果需要代理本机的流量,或者像上文中为steam进行代理时对steam community和steam其他流量的区分,这就需要配置规则,将这些流量都引入本机,并进行更加精细的分流操作

需要注意的是,在设置代理规则时,域名规则一定要放在IP规则的前面。

rules:
  # 直连tailscaled发出的流量
  - PROCESS-NAME, tailscaled, DIRECT

  # mail
  - DST-PORT, 465, DIRECT
  - DST-PORT, 25, DIRECT
  - DST-PORT, 993, DIRECT
    
  - DST-PORT, 22, DIRECT

  # 代理steam community流量,让其他流量直连
  - DOMAIN, steamcommunity.com, PROXY
  - GEOSITE, steam, DIRECT
  
  # 使用规则集进行分流
  - RULE-SET,applications,DIRECT
  - DOMAIN,clash.razord.top,DIRECT
  - DOMAIN,yacd.haishan.me,DIRECT
  - RULE-SET,private,DIRECT
  - RULE-SET,reject,REJECT
  - RULE-SET,icloud,DIRECT
  - RULE-SET,apple,DIRECT
  - RULE-SET,google,PROXY
  - RULE-SET,proxy,PROXY
  - RULE-SET,direct,DIRECT
  - RULE-SET,lancidr,DIRECT
  - RULE-SET,cncidr,DIRECT
  - RULE-SET,telegramcidr,PROXY

  # IP规则兜底处理,直连本地和国内流量
  - GEOIP,LAN,DIRECT
  - GEOIP,CN,DIRECT

  - MATCH,PROXY

⚠️注意事项

  1. 使用FakeIP时需要关闭浏览器和操作系统的安全DNS,以及windows的多宿主智能解析,否则其他设备的请求无法被正确地路由到代理网关。
  2. 配置代理规则时,域名规则需要放在IP规则的前面,而对于不需要解析的IP,比如不通过域名访问的私有的VPS,可以在规则的后面加上no-resolve。
  3. 在使用这个代理方案时,默认是没有办法代理纯IP(比如telegram的流量)的流量的,必须手动在路由器上添加静态路由。
  4. 当使用FakeIP时,代理流量的域名解析不会在本地(指代理网关)进行,有可能会代理隐私问题。