1. 程式人生 > >使用 Envoy 和 AdGuard Home 阻擋煩人的廣告

使用 Envoy 和 AdGuard Home 阻擋煩人的廣告

原文連結:使用 Envoy 和 AdGuard Home 阻擋煩人的廣告

通常我們使用網路時,寬頻運營商會為我們分配一個 DNS 伺服器。這個 DNS 通常是最快的,距離最近的伺服器,但會有很多問題,比如:

  1. 訪問某些網路服務很緩慢,比如 Apple 的 iCloud 服務。
  2. 比較擔心安全問題,希望能通過設定 DNS 來保證你訪問安全的網站。
  3. 厭煩了每當你輸入一個不正確的網址,運營商總會給你跳轉到一個充滿廣告的介面。

這個時候我們就需要自定義 DNS,自定義 DNS 不僅能夠加快網頁開啟的速度,還能夠提高瀏覽網頁的安全性。更重要的一點是,如果你使用過 Google Chrome,應該知道 Google 未來將會限制“攔截廣告”的擴充套件,要想解決此問題只能裝個全域性的攔截廣告軟體或者直接從 DNS 伺服器層面攔截廣告(如果你不想換瀏覽器)。

AdGuard Home 是一款全網廣告攔截與反跟蹤軟體,可以將廣告與追蹤相關的域名遮蔽,指向空的主機(DNS 黑洞)。簡單來說它就是一個開源的公共 DNS 服務,使用 Go 語言開發,支援家長控制和廣告過濾!關鍵是它還支援 DNS over TLSDNS 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 本身提供了 AdGuardAdAway 的廣告過濾規則,但在中國有點水土不服,如果要想更完美的實現廣告遮蔽還需要自己新增規則,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%