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
- yacd (Github)
- Clash Dashboard (非官方?) (Github)
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。例如: