1. 程式人生 > 其它 >使用雲伺服器ECS搭建DoH服務的開發實踐

使用雲伺服器ECS搭建DoH服務的開發實踐

本文來自於雲伺服器ECS徵文活動投稿,已獲得作者(暱稱紹羽)授權釋出

 

我們都知道,DNS伺服器(Domain Name Server)可以將人類易於理解的域名(就是平時說的網址)轉換為機器易於理解的「IP 地址」,它使用UDP埠53對外提供服務。通常,DNS查詢是明文的,這意味著你的網站訪問記錄可以輕易被網路管理員和ISP獲取到。

 

面對日益嚴峻的行為管理、隱私洩露和惡意劫持,DoH作為一種更安全的DNS查詢方式正在被更廣泛使用。它通過RFC 8484指定的經過TLS加密的HTTP連線提供DNS解析,這意味著我們的DNS查詢得到了加密保護。

 

那麼我能不能嘗試一下在公網搭建一個DoH伺服器呢?

 

當我有這種想法之後便開始行動,通過查閱網路公開資料也解決了很多疑點,最終,藉助阿里雲的ECS(映象源真的很快,推薦),成功地完成了搭建Doh伺服器的實踐。

 

接下來,跟著我一起看看是怎樣完成搭建的吧~

 

01 資源準備:雲伺服器+域名

 

1.雲伺服器

本次實踐推薦使用一臺裝載Ubuntu映象的雲伺服器,在阿里雲的試用中心可以免費使用一個月t5例項:https://free.aliyun.com/

 

如果您是高校學生或老師,可以使用高校計劃可以免費領用2.5個月:https://developer.aliyun.com/plan/student

 

2.域名準備

建議使用阿里雲萬網購買域名,優勢是可以獲得免費的SSL證書。

 

02  便捷搭建方案

如果只是想便捷配置可以參考下面的步驟:

 

1、安裝docker

 

apt-get install docker.io

2、啟動docker

 

 

service docker start

3、下載建立並初始化Dnscrypt容器

 

docker run --name=dnscrypt-server -p 443:443/udp -p 443:443/tcp \
--restart=unless-stopped \
-v /etc/dnscrypt-server/keys:/opt/encrypted-dns/etc/keys \
jedisct1/dnscrypt-server init -N example.com -E '192.168.1.1:443'

說明

①:example.com替換為您的域名,192.168.1.1:443替換為ECS公網IP,可以指定多個逗號分隔的 IP 和埠,如 -E'192.168.1.1:443,[2001:0db8::412f]:443'. -v

 

②:/etc/dnscrypt-server:/opt/encrypted-dns/etc/keys 表示容器內部的路徑。

/opt/encrypted-dns/etc/keys 對映到 /etc/dnscrypt-server/keys。

啟動服務命令:docker start dnscrypt-server

4、下載建立並初始化Doh-server容器

 

docker run -d --restart unless-stopped --network host --name doh-server \
  -e UPSTREAM_DNS_SERVER="udp:127.0.2.1:53" \
  -e DOH_HTTP_PREFIX="/dns-query" \
  -e DOH_SERVER_LISTEN="127.0.0.1:8053" \
  -e DOH_SERVER_TIMEOUT="10" \
  -e DOH_SERVER_TRIES="3" \
  -e DOH_SERVER_VERBOSE="true" \
  satishweb/doh-server

5、 驗證容器狀態

 

docker ps -a

 

6、設定自啟動

 

docker update --restart=unless-stopped dnscrypt-server   docker update --restart=unless-stopped doh-server

7、Web客戶端和ssl證書參照下文nginx

8、檢查配置-所有服務啟動,我們就得到了Doh服務,請轉最後小結部分。

 

03  進階搭建教程

 

如何搭建是個問題,那麼這裡列舉3種方案與思路。

i. nginx + doh-server + dnscrypt(本文使用)

ii.  nginx + doh-server + Bind(備選方案)

iii. nginx + doh-server + CoreDNS(雲原生方案)

 

1、安裝software-properties-common軟體包:

這是一個預備操作。我使用的是阿里雲官方提供的Ubuntu  20.04 64位系統,其缺少add-apt-repository命令,需要在系統終端中執行以下命令來安裝software-properties-common軟體包:

 

sudo apt update
sudo apt -y install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates

Tips

可以使用以下命令新增PPA儲存庫:

 

sudo add-apt-repository ppa:<PPA Name>

新增PPA儲存庫後,更新程式包列表並從儲存庫安裝新程式包:

 

sudo apt update
sudo apt install

 

2、安裝Dnscrypt-Proxy

 

a) 安裝和驗證

Dnscrypt-Proxy是具備很多現代化功能的DNS代理伺服器程式,其支援DNSCrypt v2(身份認證), DNS-over-HTTPS【RFC8484,DNS Queries over HTTPS (DoH)】等功能。

 

由於Dnscrypt-Proxy使用golang開發,所以其不支援在CentOS5及之前的Linux發行版上安裝。Dnscrypt-Proxy需要佔用53埠,所以安裝前可以先檢視一下53埠使用情況,命令:

 

ss -lp 'sport = :domain'

我們可以使用志願者貢獻的PPA來快捷安裝和保持程式的最新版本:

 

sudo add-apt-repository ppa:shevchuk/dnscrypt-proxy
sudo apt install dnscrypt-proxy

安裝後,Dnscrypt-Proxy服務將在伺服器上自動啟動。 

 

程式會被安裝到/etc/dnscrypt-proxy資料夾,dnscrypt-proxy的監聽地址通常為(V:2.1.0~ppa6):127.0.0.53:53,我們可以使用dig命令檢視一下。

 

其配置檔案/etc/dnscrypt-proxy/dnscrypt-proxy.toml檔案的server_names欄位要求你設定一個或多個你喜歡的伺服器即可,第一個請求失敗會自動向第二個伺服器請求。例如:server_names = ['alidns-doh']我們這裡不做更改,根據伺服器所在可用區的不同,我們可能會修改這裡的引數。

 

b)  修改系統DNS配置

移除系統DNS配置命令:

 

apt-get remove resolvconf

為系統DNS配置檔案設定備份:

 

cp /etc/resolv.conf /etc/resolv.conf.backup

修改原DNS配置檔案:

 

vim /etc/resolv.conf

修改為nameserver 127.0.0.53  options edns0

最後重啟dnscrypt-proxy服務:

  •  
sudo systemctl restart dnscrypt-proxy

說明:系統Systemd 服務使用的預設套接字型檔地址為127.0.2.1:53

 

3、安裝DNS-over-HTTPs

這是一個基於golong開發的開源DoH伺服器程式,它可以接受http請求並執行DNS查詢。我們可以使用deb安裝包快捷的安裝DNS-over-HTTPs伺服器程式:

 

如果使用debian,則命令為:

 

sudo dpkg -i doh-server_2.0.1_amd64.deb

在ubuntu裡面,命令為:

 

sudo apt install doh-server_2.0.1_amd64.deb

 

sudo apt install /root/doh-server_2.0.1_amd64.deb

注意:以上檔案路徑請據實替換

Tips:如果你在安裝 deb 軟體包的過程中得到一個依賴項的錯誤,你可以使用下面的命令來修復依賴項的問題:

 

sudo apt install -f

安裝好的DoH伺服器程式的配置檔案在路徑/etc/dns-over-https/doh-server.conf。為了設定反向解析,我們修改其upstream欄位(上游DNS解析),將其修改為上面提到的dnscrypt-proxy的監聽地址;dnscrypt-proxy監聽欄位可以在/etc/dnscrypt-proxy/dnscrypt-proxy.toml檔案裡修改。這樣DoH程式就會使用Dnscrypt-proxy來執行DNS請求。

 

修改程式碼:

 

vim /etc/dns-over-https/doh-server.conf

修改如下圖所示:

 

重啟服務進行應用更改:

 

sudo systemctl restart doh-server

 

4、安裝Nginx

Nginx是一款高效能的反向代理伺服器程式,在這裡它負責接受客戶端HTTPS DNS請求,然後作為反向代理解碼來自客戶端的HTTPS請求並向DoH伺服器程式傳送DoH請求。它是與客戶端交流的門戶,我們還會為它配置一個SSL證書以便於驗證HTTPS請求。

 

我使用的是“Ondřej Surý”提供的相關版本,在百度中搜索此關鍵詞,然後進入網頁下載對應的安裝包就好。以下為安裝命令:

 

sudo add-apt-repository ppa:ondrej/nginx  
sudo apt install nginx-full

Nginx被安裝在/etc/nginx目錄下,我們需要編輯配置檔案。

 

Vim /etc/nginx/sites-available/dns-over-https

其中server_name欄位需要使用您自己的域名,域名是提供DoH服務所必需的。upstream dns-backend就是你需要Nginx轉發到的地址,這裡就是我們的DOH的監聽地址。以下為一個示例配置:

 

完成後我們需要把配置檔案放到/etc/nginx/sites-available/dns-over-https

 

sudo ln -s /etc/nginx/sites-available/dns-over-https /etc/nginx/sites-enabled/dns-over-https

驗證並重啟:

 

sudo nginx -t  sudo systemctl reload nginx

我們可以配置nginx對ssl證書的檢查:

 

vim /etc/nginx/conf.d/stapling.conf

配置如下圖,其中resolver變數是DNScrypt的監聽地址。

 

5、申請SSL證書

 

方法一:手動安裝

如果你購買的是阿里雲的域名,那麼我們可以選擇手動安裝,優點是有效期時間長達一年,缺點是比較麻煩。

 

進入控制檯-數字證書管理服務https://yundun.console.aliyun.com/

 

購買DV單域名證書包後可以點選建立證書,填寫申請並驗證即可。

 

購買成功後我們可以下載證書並部署到伺服器上。通過ftp或其他方式將證書上傳到伺服器目錄內,修改nginx配置檔案以應用更改。示例配置如下:

 

使用nginx -t命令可測試配置是否正確。

重啟nginx進行應用配置:

 

sudo systemctl reload nginx

 

方法二:使用外掛安裝

Certbot 是一個免費的開源申請SSL證書的工具,用於在手動管理的網站上自動部署免費的Let's Encrypt證書以啟用HTTPS。在nginx伺服器上使用Certbot來配置證書是很棒的選擇。優點是比較方便,缺點是有效期短。

 

使用PPA安裝certbot:

 

sudo add-apt-repository ppa:certbot/certbot

 

sudo apt install python3-certbot-nginx

 

成功後的截圖如下:

為你的域名申請證書,注意替換,根據提示輸入Agree即可下一步:

 

sudo certbot --nginx -d dns.example.com

 

下一步我們選擇2以便把HTTP流量轉發到HTTPS,如果選擇1則表示不轉發。(如下圖所示)

 

該外掛配置檔案地址為vim /etc/letsencrypt/options-ssl-nginx.conf

 

重啟nginx進行應用配置:

 

sudo systemctl reload nginx

由於Let’s Encrypt頒發的證書的有效期只有90天,我們可以使用certbot renew命令來更新證書。

 

04 DOH的使用方法小結

 

RFC8484中指定使用/dns-query路徑作為預設查詢路徑。在客戶端方面,火狐、谷歌等瀏覽器均已支援DoH,其中谷歌瀏覽器中的配置路徑為:設定-安全和隱私設定-高階-使用安全DNS:

 

當然,由於政策性原因,我們在中國境內搭建的Doh伺服器並不能在沒有經營性備案的情況下向公網提供服務,所以本次實踐的意義在於學習和動手實踐的樂趣。

 

另外,由於提供DNS服務有快速和準確等要求,所以個人搭建的伺服器並不是最優選擇;若有需求,可以試一下阿里雲的公共DoH服務。

 

官方活動時間:阿里雲採購季還剩最後10天了,整個3月,天天有驚喜;點選我要上雲,抓住機會擁有一臺屬於自己的雲伺服器吧·