如何處理Linux中被佔用的port 53

自架Pi-holeAdGuard Home,這類透過domain name解析來擋廣告的服務時,最容易遇到Port 53被佔用的情況。

原因

出現這樣的問題應該是systemd-resolved這個service佔用了這個埠,systemd-resolved像是在你的主機上啟動了個DNS server服務

systemd-resolved處理主機發出的DNS query的動作如下:

  1. 應用程式會去讀取 /etc/resolv.conf,發現裡面寫著 nameserver 127.0.0.53
  2. 應用程式把 DNS 請求發送給本地的 127.0.0.1:53(也就是 systemd-resolved
  3. systemd-resolved 收到請求後,檢查自己有沒有快取
  • 有快取:直接回
  • 無快取:它會幫你把請求轉發給真正的外部 DNS 伺服器(例如路由器分配的 DNS、8.8.8.8 或 1.1.1.1),拿到答案後快取起來,再回傳給你的應用程式

如何釋放port 53被佔用

停用 systemd-resolved 服務

1
2
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

更換真實的 DNS 檔案

因為 systemd-resolved 停用了,原本指向 127.0.0.1:53 的軟連結 /etc/resolv.conf 會失效,必須手動建立一個真實的檔案並填入外部 DNS

  1. 刪除舊有軟連結
1
sudo rm /etc/resolv.conf
  1. 增加一個/etc/resolv.conf
1
sudo vim /etc/resolv.conf
  1. 內容寫入要使用的DNS server
1
2
nameserver 168.95.1.1
nameserver 1.1.1.1

這樣Port 53就不會被佔用,domain name查詢的功能也不會因此失效

Built with Hugo
Theme Stack designed by Jimmy