由於 Clash 的某些部分執行在第 3 層(網路層),因此其資料包的網域是無法取得的,也就無法進行基於規則的路由。
導入 fake-ip:它支援規則式路由,可盡量降低 DNS 污染攻擊的影響並提升網路效能,有時改善幅度相當明顯。
fake-ip
「fake IP」的概念源自 RFC 3089:
一個「fake IP」位址被用於查詢相應的「FQDN」資訊的關鍵字。
fake-ip 集區的預設 CIDR 為 198.18.0.1/16,這是保留的 IPv4 位址範圍,可在 dns.fake-ip-range 中變更。
DNS 請求送至 Clash DNS 後,Clash 核心會管理網域與 fake-ip 位址的內部對應關係,並從集區分配一個空閒的 fake-ip 位址。
以下以瀏覽器存取 http://google.com 為例。
瀏覽器向 Clash DNS 查詢
google.com的 IP 位址Clash 檢查內部對應關係並回傳
198.18.1.5瀏覽器將 HTTP 請求傳送至
198.18.1.5的80/tcp連接埠收到送往
198.18.1.5的入站封包時,Clash 會查詢內部對應關係,並確認用戶端實際上正將封包傳送至google.com根據規則的不同:
Clash 可能僅將網域傳送到 SOCKS5 或 shadowsocks 等出站代理,並與代理伺服器建立連線
或者,Clash 可能依據
SCRIPT、GEOIP、IP-CIDR規則,或透過 DIRECT 直接連線出站查詢google.com的實際 IP 位址
由於這個概念較難理解,以下以 cURL 程式存取 http://google.com 為例:
$ curl -v http://google.com
<---- cURL 向您的系统 DNS (Clash) 询问 google.com 的 IP 地址
----> Clash 决定使用 198.18.1.70 作为 google.com 的 IP 地址, 并记住它
* Trying 198.18.1.70:80...
<---- cURL 连接到 198.18.1.70 tcp/80
----> Clash 将立即接受连接, 并且..
* Connected to google.com (198.18.1.70) port 80 (#0)
----> Clash 在其内存中查找到 198.18.1.70 对应于 google.com
----> Clash 查询对应的规则, 并通过匹配的出口发送数据包
> GET / HTTP/1.1
> Host: google.com
> User-Agent: curl/8.0.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-ahELFt78xOoxhySY2lQ34A' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
< Date: Thu, 11 May 2023 06:52:19 GMT
< Expires: Sat, 10 Jun 2023 06:52:19 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 0
< X-Frame-Options: SAMEORIGIN
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact