使用 Clash.Meta 替代 Clash
小玲在《Debian 路由器上使用 Clash 作为透明代理》中使用的 Clash 的版本是 1.7.1。那为什么不用更高的版本呢?今天小玲就来解释为什么不用更高的版本以及介绍一个更好的 Clash 分支。
因为 Clash 从 1.8.0 开始删除了 redir-host 的远程解析功能。1 2 没有了 redir-host 的远程解析功能之后,如果还想正常访问原本无法访问的网站,就必须确保 DNS 返回无污染的 IP。小玲也用了一段时间 1.8.0 以上的版本,但还是有一些小问题,让小玲不得不退回 1.7.1 版本。
没有 redir-host 的远程解析功能时遇到的问题
首先,先说说没有 redir-host 的远程解析功能时遇到的问题,贴一段 Clash 的 DNS 的配置。
dns:
enable: true
listen: :53
ipv6: false
enhanced-mode: redir-host
default-nameserver:
- 8.8.8.8
nameserver:
- udp://[2001:4860:4860::8888]:53
- udp://[2001:4860:4860::8844]:53
fallback:
- https://dns.rubyfish.cn/dns-query
- https://101.101.101.101/dns-query
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
一般情况下,咱们使用 Clash 时,都是在 dns.nameserver
里写解析国内网站的 DNS 服务器,在 dns.fallback
里写解析国外网站的 DNS 服务器。那 Clash 是怎么知道你要访问的网站是国内的还是国外的呢?答案是 Clash 通过一个存放了 IP 地址数据的 Country.mmdb
文件和 dns.fallback-filter
里的配置来决定你要访问的域名的 IP 地址是通过 dns.nameserver
里的 DNS 服务器解析出来的还是通过 dns.fallback
里的 DNS 服务器解析出来的。
举个例子,现在 Country.mmdb
里存放了所有中国的 IP 地址,并且 dns.fallback-filter.geoip
的值为 true
,dns.fallback-filter.geoip-code
的值为 CN
,当访问 baidu.com
时,通过 dns.nameserver
里的 DNS 服务器解析出来的 IP 地址为 110.242.68.66
,通过 dns.fallback
里的 DNS 服务器解析出来的 IP 地址为 110.242.68.66
。这个地址命中了 Country.mmdb
里的中国的 IP 地址。所以 Clash 就采用 dns.nameserver
里的 DNS 服务器解析出来的 IP 地址而不是 dns.fallback
里的 DNS 服务器解析出来的 IP 地址。
当访问 www.google.com
时,通过 dns.nameserver
里的 DNS 服务器解析出来的 IP 地址为 199.16.156.75
,通过 dns.fallback
里的 DNS 服务器解析出来的 IP 地址为 172.217.160.68
。由于 199.16.156.75
这个地址不命中 Country.mmdb
里的中国的 IP 地址。所以 Clash 就采用 dns.fallback
里的 DNS 服务器解析出来的 IP 地址 172.217.160.68
。
当你只使用 IPv4 时,没有 redir-host 的远程解析功能且 dns.fallback
里的 DNS 服务器是无污染的时候也能打开绝大部分原本无法访问的网站。但是当你使用 IPv6 时就不行了。原因小玲也说不上来。小玲猜测是 Country.mmdb
文件里没有全部的中国的 IPv6 地址。于是小玲换过好多次一些人提供的 Country.mmdb
文件,均没有解决问题。小玲只好放弃使用 1.8.0 以上版本的 Clash。
使用 Clash.Meta
有一天,小玲发现 Clash 还有一个分支 Clash.Meta,不仅有 redir-host 的远程解析功能,还有 Clash 的 1.8.0 版本后新增的功能。小玲果断把 Clash 换成了 Clash.Meta。由于 Clash 从 1.8.0 版本开始支持 fwmark,所以做透明代理就不再需要添加用户了。在这里小玲只写与《Debian 路由器上使用 Clash 作为透明代理》的差异,具体安装方法还是请看《Debian 路由器上使用 Clash 作为透明代理》
在 Clash 的配置文件 config.yaml
里加上下面的内容。
# 这里填写通往外网的接口名称。
interface-name: ppp0
# 这里将 Clash 发出的流量都打上值为 "1" 的 mark。
routing-mark: 1
# 这里加上 Clash.Meta 独有的嗅探器的配置。
sniffer:
enable: true
sniffing:
- tls
- http
docker-compose.yml
文件。
version: "3"
services:
clash:
cap_add:
- NET_ADMIN
container_name: clash
image: metacubex/clash-meta
network_mode: host
restart: always
volumes:
- ./config/clash:/root/.config/clash
/etc/nftables.conf
文件。
table inet clash
delete table inet clash
table inet clash {
set ipv4_addr {
type ipv4_addr
flags interval
elements = {
10.0.0.0/8,
127.0.0.0/8,
169.254.0.0/16,
172.16.0.0/12,
192.168.0.0/16,
240.0.0.0/4
}
}
set ipv6_addr {
type ipv6_addr
flags interval
elements = {
::ffff:0.0.0.0/96,
64:ff9b::/96,
100::/64,
2001::/32,
2001:10::/28,
2001:20::/28,
2001:db8::/32,
2002::/16,
fc00::/7,
fe80::/10
}
}
chain clash-tproxy {
fib daddr type { unspec, local, anycast, multicast } return
ip daddr @ipv4_addr return
ip6 daddr @ipv6_addr return
udp dport { 123 } return
meta l4proto { tcp, udp } meta mark set 1 tproxy to :7893 accept
}
chain clash-mark {
fib daddr type { unspec, local, anycast, multicast } return
ip daddr @ipv4_addr return
ip6 daddr @ipv6_addr return
udp dport { 123 } return
meta mark set 1
}
chain mangle-output {
type route hook output priority mangle; policy accept;
# 下面这行与原来的有差异。
meta l4proto { tcp, udp } mark != 1 ct direction original jump clash-mark
}
chain mangle-prerouting {
type filter hook prerouting priority mangle; policy accept;
iifname { lo, enp1s0 } meta l4proto { tcp, udp } ct direction original jump clash-tproxy
}
}
Clash.Meta 比 Clash 增加的功能远不止如此,你还可以查看它的 文档。欢迎和小玲一起加入使用 Clash.Meta 的队伍。