通過TLS上的DNS保護Ubuntu 18.04上的DNS隱私

本教程將向您展示如何使用以下方法在Ubuntu 18.04桌面上保護DNS隱私: TLS上的DNS。 我們將使用一個名為 粗短 實現這一目標。 但是首先,讓我告訴您為什麼DNS不安全。

DNS漏洞

DNS是不安全的,因為默認情況下,DNS查詢未加密,因此中間實體可以利用它。 DNS緩存毒物是DNS濫用之一,中國長城防火牆(GFW)廣泛使用它來審查中國Internet。 GFW會檢查發送到中國以外的DNS服務器的每個DNS查詢。 由於純文本DNS協議基於無連接協議UDP,因此GFW可以欺騙客戶端IP和服務器IP。 當GFW在其阻止列表中找到域名時,它將更改DNS響應。 例如,如果中國的互聯網用戶想要訪問google.com,則中國的防火牆將向中國的IP地址返回到DNS解析器,而不是Google的真實IP地址。 然後,DNS解析器將偽造的IP地址返回給用戶的計算機。

什麼是基於TLS的DNS? 如何保護您的隱私?

TLS上的DNS表示DNS查詢是通過使用TLS加密的安全連接發送的,TLS是與加密HTTP流量相同的技術,因此沒有第三方可以看到您的DNS查詢。 與HTTPS和加密的SNI(服務器名稱指示)一起,可以完全保護您的瀏覽歷史記錄,以防止ISP進行間諜活動。

Stubby是由getdns團隊開發的開源DNS存根解析器。 它使用getdns庫。 存根解析器是最終用戶計算機上的小型DNS客戶端,它從Firefox等應用程序接收DNS請求,並將請求轉發到遞歸解析器(如1.1.1.1或8.8.8.8)。 Stubby的特殊之處在於它支持基於TLS的DNS。 默認情況下,它將僅發送加密的DNS請求。 還有另一個名為的存根解析器 cloudflared 支持基於HTTPS的DNS,但stubby已經存在於Ubuntu 18.04存儲庫中,並且非常易於使用。

如何在Ubuntu 18.04桌面上安裝和使用Stubby

Stubby位於Ubuntu 18.04存儲庫中。 打開一個終端窗口,然後運行以下命令進行安裝。

sudo apt install stubby

這將安裝stubby和 getdns 圖書館。 安裝後,Stubby將在後台運行。 您可以通過以下方式查看其狀態:

systemctl status stubby

通過運行以下命令可以看到,Stubby偵聽本地主機(127.0.0.1)的TCP和UDP端口53:

sudo netstat -lnptu | grep stubby

在tls上的stubby dns

提供的默認存根解析器 systemd-resolved 偵聽127.0.0.53的TCP和UDP端口53。

sudo netstat -lnptu | grep systemd-resolv

systemd解析的存根解析器

注意:如果dnsmasq正在偵聽127.0.0.1的TCP端口53,則Stubby將僅偵聽127.0.0.1的UDP端口53。

主要配置文件是 /etc/stubby/stubby.yml。 通常,除非您要使用其他或自己的遞歸解析器,否則無需對其進行更改。 讓我解釋一些默認配置。 您可以使用以下方式打開文件:

sudo nano /etc/stubby/stubby.yml

下面的代碼行使stubby作為stub解析器而不是完整的遞歸解析器運行,因此將其命名為stubby。

resolution_type: GETDNS_RESOLUTION_STUB

以下配置使存根發送使用TLS加密的DNS查詢。 它不會以純文本形式發送查詢。

dns_transport_list:
- GETDNS_TRANSPORT_TLS

此以下行要求遠程遞歸解析器上有有效的TLS證書。

tls_authentication: GETDNS_AUTHENTICATION_REQUIRED

以下幾行設置了stubby守護程序的偵聽地址。 默認情況下,IPv4和IPv6均已啟用。

listen_addresses:
- 127.0.0.1
- 0::1

下面的代碼行以循環的方式使存根查詢遞歸解析器成為可能。 如果設置為 0,Stubby將順序使用每個上游服務器,直到它不可用為止,然後繼續使用下一個。

round_robin_upstreams: 1

默認情況下,在stubby配置文件中啟用了3個遞歸解析器。 它們由存根開發人員運行,並支持基於TLS的DNS。 您可以在DNS Privacy網站上查看推薦服務器的完整列表。

dnsovertls.sinodun.com     145.100.185.15
dnsovertls1.sinodun.com    145.100.185.16
getdnsapi.net              185.49.141.37

在其他DNS服務器 Additional Servers 默認情況下被禁用的部分。

dns.quad9.net
unicast.censurfridns.dk
dnsovertls3.sinodun.com (supporting TLS1.2 and TLS 1.3)
dnsovertls2.sinodun.com
dns.cmrg.net
dns.larsdebruin.net
......

也有DNS服務器在端口443上偵聽。如果網絡中阻止了端口853,則可以取消注釋它們以使用這些服務器。

dnsovertls.sinodun.com
dnsovertls1.sinodun.com
dns.cmrg.net
dns.neutopia.org

現在,您可以按以下鍵退出nano文本編輯器 Ctrl+X

切換到Stubby

編輯 /etc/resolve.conf 建議不要再使用文件更改名稱服務器。 請按照以下說明進行操作 systemd-resolved 將DNS查詢發送到Stubby。

GNOME桌面

單擊桌面右上角的網絡管理器圖標。 然後選擇有線設置。 (如果您使用的是Wi-fi,請選擇Wi-fi設置。)

加密dns

點擊齒輪按鈕。

在tls上的cloudflare dns

選擇 IPv4 標籤,然後在DNS設置中切換 Automatic 設置為OFF,這將阻止您的Ubuntu系統從路由器獲取DNS服務器地址。 輸入 127.0.0.1 在DNS字段中。 請點擊 Apply 按鈕以保存您的更改。

通過tls端口853的dns

然後重新啟動NetworkManager以使更改生效。

sudo systemctl restart NetworkManager

重新連接後,可以看到您的Ubuntu系統現在使用127.0.0.1作為DNS服務器。 Details 標籤。

通過tls的存根解析器dns

Unity桌面

推薦閱讀:如何在Ubuntu 18.04上安裝Unity桌面環境。

單擊桌面右上角的網絡管理器圖標,然後單擊 edit connections

網絡管理員更改DNS

選擇您的連接名稱,然後點擊齒輪圖標。

stubby systemd解析

選擇“ IPv4設置”選項卡,從以下位置更改方法 Automatic(DHCP)Automatic(DHCP) addresses only,這將阻止您的Ubuntu系統從路由器獲取DNS服務器地址。 然後指定一個DNS服務器(127.0.0.1)。 Stubby監聽127.0.0.1。

在tls上的ubuntu dns

保存您的更改。 然後重新啟動NetworkManager以使更改生效。

sudo systemctl restart NetworkManager

重新連接後,再次單擊網絡管理器圖標,然後選擇 connection information。 您可以看到您的Ubuntu系統現在使用127.0.0.1作為DNS服務器。

ubuntu 18.04在tls上的dns

與桌面無關的方式來更改DNS服務器

只要您的桌面環境使用NetworkManager,就可以使用以下方法更改DNS服務器。

打開一個終端窗口,然後轉到“網絡管理器”連接配置文件目錄。

cd /etc/NetworkManager/system-connections/

然後列出系統上可用的連接名稱。

ls

網絡管理器從命令行更改dns服務器

如您所見,我的系統上有多個連接,其中之一是有線連接。 一些是無線連接,一種是VPN連接。 因為我的台式計算機是通過以太網電纜連接到路由器的,所以我需要使用以下命令編輯有線連接配置文件 nano 命令行文本編輯器。

sudo nano 'Wired connection 1'

如果您的計算機是通過Wi-fi連接的,則需要編輯無線連接配置文件。 在此文件中,找到 [ipv4] 配置。 默認情況下,它應如下所示:

[ipv4]
dns-search=
method=auto

要使您的系統使用Stubby,請將配置更改為以下內容。

[ipv4]
dns=127.0.0.1;
dns-search=
ignore-auto-dns=true
method=auto

要在Nano文本編輯器中保存文件,請按 Ctrl+O,然後按Enter確認。 按 Ctrl+X 退出。 然後重新啟動網絡管理器以使更改生效。

sudo systemctl restart NetworkManager

現在,您可以通過運行以下命令來檢查當前的DNS服務器:

systemd-resolve --status

樣本輸出:

Link 2 (enp5s0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 127.0.0.1

如果127.0.0.1被列為DNS服務器,則您的系統正在使用Stubby。

如何檢查您的DNS通信是否已加密

我們可以使用WireShark監視DNS流量。 從Ubuntu 18.04存儲庫安裝WireShark。

sudo apt install wireshark

如果系統詢問您“非超級用戶是否可以捕獲數據包?”,請回答“是”。 安裝完成後,運行以下命令將您的用戶帳戶添加到wireshark組,以便您可以捕獲數據包。

sudo adduser your-username wireshark

註銷並重新登錄,以使更改生效。 然後從應用程序菜單中打開WireShark,在WireShark中選擇您的網絡接口。 例如,我的以太網接口名稱是enp5s0。 然後輸入 port 853 作為捕獲過濾器。 這將使WireShark僅捕獲端口853上的流量,該端口是DNS通過TLS使用的端口。

ubuntu 18.04粗短

單擊左上角的按鈕開始捕獲。 之後,在終端窗口中,使用以下命令查詢域名 dig 效用。 例如,我可以查詢我的域名的A記錄。

dig A linuxbabe.com

現在,您可以在WireShark中查看捕獲的DNS通信。 如您所見,我的DNS查詢已發送到 185.49.141.37145.100.185.15145.100.185.16,這是stubby配置文件中定義的3個默認DNS解析器。 連接是通過TCP進行的,並使用TLS加密,這正是我想要的。

安全DNS

如果發送的DNS查詢沒有加密,則計算機將通過端口53與DNS服務器聯繫。 port 53 作為捕獲過濾器,但在WireShark中將看不到任何數據包,這意味着stubby正在加密DNS查詢。

如何將CloudFlare DNS添加到Stubby

我發現計算機與3個默認DNS服務器之間存在高延遲(超過200毫秒),而CloudFlare DNS服務器(1.1.1.1、1.0.0.1)卻給我帶來了非常低的延遲(不到20毫秒)。 CloudFlare還支持基於TLS的DNS。 要添加CloudFlare DNS服務器,請編輯存根配置文件。

sudo nano /etc/stubby/stubby.yml

向下滾動到 upstream_recursive_servers: 部分,並在其他DNS服務器上方添加以下文本。

#CloudFlare servers
  - address_data: 1.1.1.1
    tls_auth_name: "cloudflare-dns.com"
  - address_data: 1.0.0.1
    tls_auth_name: "cloudflare-dns.com"

然後找到以下行:

round_robin_upstreams: 1

更改 10。 這將使stubby始終使用CloudFlare DNS服務器。 如果CloudFlare不可用,則存根將使用其他DNS服務器。 保存文件並重新啟動stubby,以使更改生效。

sudo systemctl restart stubby

DNS over HTTPS支持

Stubby將在版本0.3中支持基於HTTPS的DNS。 Ubuntu 20.10隨附0.2.6版本。 要檢查Stubby版本,請運行

stubby -V

包起來

我希望本教程可以幫助您通過TLS上的DNS保護Ubuntu 18.04上的DNS隱私。 與往常一樣,如果您發現這篇文章很有用,請訂閱我們的免費新聞通訊以獲取更多提示和技巧。 照顧自己。

Sidebar