使用 Envoy 和 AdGuard Home 阻擋煩人的廣告
原文連結:使用 Envoy 和 AdGuard Home 阻擋煩人的廣告
通常我們使用網路時,寬頻運營商會為我們分配一個 DNS 伺服器。這個 DNS 通常是最快的,距離最近的伺服器,但會有很多問題,比如:
- 訪問某些網路服務很緩慢,比如 Apple 的 iCloud 服務。
- 比較擔心安全問題,希望能通過設定 DNS 來保證你訪問安全的網站。
- 厭煩了每當你輸入一個不正確的網址,運營商總會給你跳轉到一個充滿廣告的介面。
這個時候我們就需要自定義 DNS,自定義 DNS 不僅能夠加快網頁開啟的速度,還能夠提高瀏覽網頁的安全性。更重要的一點是,如果你使用過 Google Chrome
,應該知道 Google 未來將會限制“攔截廣告”的擴充套件,要想解決此問題只能裝個全域性的攔截廣告軟體或者直接從 DNS 伺服器層面攔截廣告(如果你不想換瀏覽器)。
AdGuard Home 是一款全網廣告攔截與反跟蹤軟體,可以將廣告與追蹤相關的域名遮蔽,指向空的主機(DNS 黑洞)。簡單來說它就是一個開源的公共 DNS 服務,使用 Go 語言開發,支援家長控制和廣告過濾!關鍵是它還支援 DNS over TLS
和 DNS over HTTPS
,可以執行在 x86 Linux,樹莓派上,也可以通過 Docker
部署在群暉 NAS 上。
1. AdGuard Home 安裝
AdGuard Home 的安裝方法根據你所使用的平臺而有所不同,它的二進位制檔案位於 https://github.com/AdguardTeam/AdGuardHome/releases,可以根據自己的平臺下載最新版本。MacOS 的安裝方法如下:
# 下載 AdGuard Home $ wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.98.1/AdGuardHome_MacOS.zip # 解壓並進入 AdGuardHome_MacOS 目錄 $ unzip AdGuardHome_MacOS.zip && cd AdGuardHome_MacOS # 將二進位制檔案拷貝到 $PATH $ cp ./AdGuardHome /usr/local/bin/ # 建立 Launch Daemon 的 plist 檔案並啟動服務 $ AdGuardHome -s install
現在就可以看到服務的配置和狀態資訊了:
$ sudo launchctl list AdGuardHome
{
"StandardOutPath" = "/var/log/AdGuardHome.stdout.log";
"LimitLoadToSessionType" = "System";
"StandardErrorPath" = "/var/log/AdGuardHome.stderr.log";
"Label" = "AdGuardHome";
"TimeOut" = 30;
"OnDemand" = false;
"LastExitStatus" = 0;
"PID" = 1464;
"Program" = "/usr/local/bin/AdGuardHome";
"ProgramArguments" = (
"/usr/local/bin/AdGuardHome";
"-s";
"run";
);
};
plist 檔案位於 /Library/LaunchDaemons/
目錄下:
$ cat /Library/LaunchDaemons/AdGuardHome.plist
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd" >
<plist version='1.0'>
<dict>
<key>Label</key><string>AdGuardHome</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/AdGuardHome</string>
<string>-s</string>
<string>run</string>
</array>
<key>WorkingDirectory</key><string>/Users/freya/Downloads/Compressed/AdGuardHome_MacOS</string>
<key>SessionCreate</key><false/>
<key>KeepAlive</key><true/>
<key>RunAtLoad</key><true/>
<key>Disabled</key><false/>
<key>StandardOutPath</key>
<string>/var/log/AdGuardHome.stdout.log</string>
<key>StandardErrorPath</key>
<string>/var/log/AdGuardHome.stderr.log</string>
</dict>
</plist>
對 Launch Daemon 不熟悉的同學可以參考 Mac OS X 的 Launch Daemon / Agent。
檢視埠號:
$ sudo lsof -iTCP -sTCP:LISTEN -P -n|grep AdGuard
AdGuardHo 9990 root 3u IPv6 0xb76d091ec878f951 0t0 TCP *:3000 (LISTEN)
開啟瀏覽器,輸入網址 http://127.0.0.1:3000/
即可訪問 AdGuard Home 的管理介面。
點選“開始配置”,然後設定網頁管理介面和 DNS 服務的埠。
點選“下一步”設定使用者名稱和密碼。
最後點選“下一步”就大功告成了。
在儀表盤上,我們可以看到 DNS 查詢次數、被過濾器攔截的網站、查詢 DNS 請求的客戶端地址等等資訊。
現在再檢視埠號,管理介面會變成你剛剛設定的埠,另外還會多出一個 DNS 服務的埠:
$ sudo lsof -iTCP -sTCP:LISTEN -P -n|grep AdGuard
AdGuardHo 10619 root 11u IPv6 0xb76d091eb6671751 0t0 TCP *:53 (LISTEN)
AdGuardHo 10619 root 12u IPv6 0xb76d091ebc3c7751 0t0 TCP *:5300 (LISTEN)
$ sudo lsof -iUDP -P -n|grep AdGuard
AdGuardHo 10619 root 10u IPv6 0xb76d091eb89601c1 0t0 UDP *:53
2. 配置優化
預設的配置比較簡單,為了更強力地攔截廣告,我們可以對配置進行優化。
常規設定
勾選【使用過濾器和 Hosts 檔案以攔截指定域名】、【使用 AdGuard 瀏覽安全網頁服務】、【強制安全搜尋】。如果你想攔截成人網站,也可以勾選【使用 AdGuard 家長控制服務】。
過濾器
雖然 AdGuard 本身提供了 AdGuard
、AdAway
的廣告過濾規則,但在中國有點水土不服,如果要想更完美的實現廣告遮蔽還需要自己新增規則,AdGuard 可以相容 Adblock
的語法。最知名的過濾規則 EasyList 就是由 Adblock Plus 團隊維護,過濾規則往往是一個 txt
檔案,在檔案的開頭部分會顯示規則的最後更新日期。
推薦廣告過濾規則:
- EasyList China : 國內網站廣告過濾的主規則。
- EasyPrivacy : EasyPrivacy 是隱私保護,不被跟蹤。
- CJX's Annoyance List : 過濾煩人的自我推廣,並補充EasyPrivacy隱私規則。
- 廣告淨化器規則 : 國內大部分視訊網站的廣告過濾。
- I don't care about cookies : 我不關心 Cookie 的問題,遮蔽網站的 cookies 相關的警告。
優酷網如果播放無限載入,那在自定義靜態規則里加入一條規則 @@mp4.ts
(參考下圖)。
上游 DNS 設定
官方預設使用 Cloudflare
的 DNS over HTTPS 作為上游伺服器,在國內可能請求上游 DNS 延遲比較高,可以加上或替換國內的 DNS。我自己另外加了中科大的兩組無汙染 DNS,每次查詢的時候會對所有的上游 DNS 同時查詢,加速解析。
查詢日誌
在這個介面裡可以看見所有裝置的 DNS 查詢日誌,可以下載整個日誌檔案,也可以針對某個域名進行快速攔截和放行。
提升 QPS
有兩個引數可以明顯提升 QPS:
ratelimit
: DDoS 保護,客戶端每秒接收的資料包數。建議禁用該引數(將值改為 0),預設值是 20。blocked_response_ttl
: TTL 快取時間,建議設定為 60
配置檔案預設路徑是 /usr/local/bin/AdGuardHome.yaml
3. 使用 Envoy 作為前端代理
其實到這裡已經算是結束了,但本人有強迫症,我可不想將應用的管理介面設定為一些奇奇怪怪的非標準埠。有人或許會說:那你為什麼不將管理介面設定為 80 或 443 埠啊?問得好,因為我的電腦上部署了各種奇奇怪怪的應用,80 埠只有一個,不夠用的,只能考慮加個前端代理了。
作為一名雲原生狂熱信徒,當然是選 Envoy
了,雖然 Envoy 很難編譯,但 Tetrate 的工程師(包括 Envoy 的核心貢獻者和維護者)發起了一個 GetEnvoy 專案,目標是利用一套經過驗證的構建工具來構建 Envoy,並通過常用的軟體包管理器來分發,其中就包括 Homebrew
。我們可以直接通過 Homebrew 來安裝:
$ brew tap tetratelabs/getenvoy
==> Tapping tetratelabs/getenvoy
Cloning into '/usr/local/Homebrew/Library/Taps/tetratelabs/homebrew-getenvoy'...
Tapped 1 formula.
$ brew install envoy
==> Installing envoy from tetratelabs/getenvoy
==> Downloading ...
######################################################################## 100.0%