/etc/hosts 是 Linux/Unix 系統的靜態主機名稱查詢表,優先順序高於 DNS。它讓您在不架設 DNS 伺服器的情況下,自訂主機名稱對應 IP,廣泛用於開發環境網域測試、封鎖廣告/追蹤網域、內部伺服器別名管理。本文詳細說明格式、各發行版差異、實戰範例與常見誤區。
IP位址 主機名稱 [別名1 別名2 ...]
# 註解行以 # 開頭,系統忽略
127.0.0.1 localhost.localdomain localhost
127.0.1.1 myhostname # 部分發行版(Debian/Ubuntu)用於設定本機主機名
192.168.1.100 webserver.local webserver # 內部網站伺服器
192.168.1.200 db.internal db # 資料庫伺服器
# 封鎖廣告/追蹤
0.0.0.0 analytics.google.com
0.0.0.0 doubleclick.net
| 發行版 | 主機名稱設定檔 | 說明 |
|---|---|---|
| RHEL/CentOS/Fedora | /etc/hostname |
hostnamectl set-hostname 永久修改 |
| Debian/Ubuntu | /etc/hostname + /etc/hosts 127.0.1.1 行 |
需同步修改兩處,否則 sudo 會報「unable to resolve host」 |
| Arch Linux | /etc/hostname |
同 RHEL 系 |
myapp.test 指向 127.0.0.1,無需修改 DNS 或申請網域。web01, db01),SSH/腳本直呼別名。0.0.0.0 或 127.0.0.1,系統層級攔截(可搭配 StevenBlack/hosts 定期更新)。名稱解析順序由 /etc/nsswitch.conf 的 hosts: 行決定,預設通常為:
hosts: files dns
即 先查 /etc/hosts (files),再查 DNS。修改 /etc/hosts 即時生效,無需重啟服務(除非應用程式快取 DNS,如瀏覽器、Java 應用需重啟)。
/etc/hosts 以「加速存取」—— DNS 快取與 CDN 就近節點通常更快,且 IP 變更會導致連線失敗。127.0.0.1 封鎖網域卻忘記 IPv6(::1)—— 建議雙寫或使用 0.0.0.0(不回應連線,效能稍佳)。/etc/hostname 與 /etc/hosts,並執行 hostnamectl set-hostname newname(systemd 系統)。hosts 映射納入版控(如 dev.hosts),CI/CD 階段自動注入容器/VM。