clash

clash

clash 用作 Linux 透明代理 (旁路由)

配置概述

局域网网段 192.168.0.0/16。clash 部署于旁路由 192.168.1.X 上。主路由是 192.168.1.1。DHCP 由主路由负责。

clash fake-ip 网段配置为 10.100.0.0/16;redir 端口 7892, DNS 端口 7874。

注:如果主路由上面也跑clash,建议每个路由上面 clash 配置的 fake-ip 使用不同网段,然后在主路由路由表里把旁路由的 clash fake-ip 网段路由到旁路由这里,同时在每个路由 iptables 的透明代理拦截规则里排除掉其它路由的 fake-ip 网段。这样弄避免 DNS 错误配置等情况造成无法上网。以下配置假定主路由上跑了 clash, fake-ip 网段配置的是 10.100.0.0/16。

开启 dnsmasq (udp/53),配置上游 DNS 服务器为 clash DNS。拦截所有接受到的 DNS 解析请求到本机。/etc/resolv.conf 指定 DNS 服务器为本机 127.0.0.1 的 dnsmasq。

/etc/resolv.conf

nameserver 127.0.0.1

dnsmasq 配置 /etc/dnsmasq.conf :

no-resolv
server=127.0.0.1#7874
conf-dir=/etc/dnsmasq.d/,*.conf

/etc/sysctl.conf 配置开启 ipv4 转发和 bbr (修改后运行 sysctl -p 生效)

net.ipv4.ip_forward=1
net.ipv4.tcp_congestion_control=bbr
net.core.default_qdisc=fq

/etc/clash/config.yaml

mixed-port: 7890
redir-port: 7892
allow-lan: true
bind-address: '*'
mode: rule
ipv6: false
interface-name: eth0
#log-level: debug
external-controller: 0.0.0.0:9090 # http (rest / websocket) API for web UI

dns:
  enable: true
  listen: 127.0.0.1:7874
  default-nameserver:
    - 114.114.114.114
    - 8.8.8.8
  nameserver:
    - tls://8.8.8.8:853
    - https://1.1.1.1/dns-query
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 10.101.0.0/16
  fake-ip-filter:

proxies:
  - name: "ss1"
    type: ss
    server: 1.2.3.4
    port: 443
    cipher: chacha20-ietf-poly1305
    password: "password"
    udp: true
  - name: "ss2"
    type: ss
    server: 2.3.4.5
    port: 443
    cipher: chacha20-ietf-poly1305
    password: "password"
    udp: true

proxy-groups:                     
  - name: "auto"                  
    type: url-test # url-test, fallback, load-balance, select
    proxies:
      - ss1
      - ss2
    url: 'http://www.gstatic.com/generate_204'               
    interval: 300                                            
  - name: "fallback-auto"                                    
    type: fallback                                           
    proxies:                                                 
      - ss1
      - ss2
    url: 'http://www.gstatic.com/generate_204'               
    interval: 300                                            
  - name: "load-balance"                                     
    type: load-balance                                       
    proxies:                                                 
      - ss1                                      
      - ss2
    url: 'http://www.gstatic.com/generate_204'               
    interval: 300                                            
  - name: Proxy                                              
    type: select                                             
    proxies:                                                 
      - ss1
      - ss2
      - auto                                                 

rules:                                                       
  - DOMAIN-SUFFIX,google.com,auto                            
  - DOMAIN-KEYWORD,google,auto                               
  - DOMAIN,google.com,auto                                   
  - DOMAIN-SUFFIX,ad.com,REJECT                              
  #- SRC-IP-CIDR,192.168.1.201/32,DIRECT                     
  - IP-CIDR,127.0.0.0/8,DIRECT                               
  - IP-CIDR,192.168.0.0/16,DIRECT                            
  - GEOIP,CN,DIRECT                                          
  #- DST-PORT,80,DIRECT                                      
  #- SRC-PORT,7777,DIRECT                                    
  #- RULE-SET,apple,REJECT # Premium only                    
  - MATCH,auto

iptables 规则

iptables -F
iptables -t mangle -F
iptables -t nat -F

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 53

# clash persistent rules
iptables -t mangle -N clash
iptables -t nat -N clash
iptables -t mangle -A PREROUTING -j clash
iptables -t nat -A PREROUTING -j clash
iptables -t nat -A OUTPUT -d 10.101.0.0/16 -j clash


# clash running time rules

iptables -t mangle -F clash
iptables -t nat -F clash
iptables -t mangle -A clash -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A clash -d 10.100.0.0/16 -j RETURN
iptables -t mangle -A clash -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A clash -p udp --dport 53 -j RETURN
iptables -t mangle -A clash -p udp -j TPROXY --on-port 7892

iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash -d 10.100.0.0/16 -j RETURN
iptables -t nat -A clash -d 255.255.255.255/32 -j RETURN
iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892

启动 clash

clash -d /etc/clash

默认设置下日志输出到 stdout。

clash 自启动的 OpenRC (init.d) 脚本 /etc/init.d/clash 参考这里

Tips

  • 直接用 root 用户启动 clash。
  • 有人推荐用专门的 clash 用户启动 clash,然后用 iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner clash -j REDIRECT --to-port 7892 避免本机发出的流量回环。但我测试用非 root 用户启动 clash 时会报错 "Failed to start Redir UDP Listener: operation not permitted"。所以上面的 iptables 规则还是用传统(openclash使用)的方法,本机发出的流量仅 fake ip 走 clash 透明代理。

优化

  • dnsmasq 和 clash dns 之间加一个 smartdns:去广告、解析中国域名IP不走 clash dns等。
  • ipset 保存中国 IP,对于中国 IP 在 iptables 层直连,不通过 clash。
  • clash 配置里增加高级的分流规则等。

Web UI

Web UI 使用 CORS 与 clash http API 通信。由于现代浏览器的安全限制,通常 Web UI 必须用 http 网站(除非 clash API 放在 https 反向代理后面)。

yacd

使用 React 开发的 clash UI。支持通过 hostname, port, secret 等 URL query variable 参数传入clash API 地址。port 默认 9090。例如:


Last update: 2021-04-14 01:35:58 UTC