使用雲伺服器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月,天天有驚喜;點選我要上雲,抓住機會擁有一臺屬於自己的雲伺服器吧·