SSH 連線輸入密碼前卡住 10-30 秒,或執行指令後回顯緩慢。
預設 UseDNS yes,sshd 接受連線後對客戶端 IP 做 PTR 查詢,再對解析出的主機名做 A 記錄查詢驗證一致性。DNS 伺服器無回應或無 PTR 記錄導致超時等待。
vi /etc/ssh/sshd_config
# UseDNS yes → UseDNS no
systemctl reload sshd
即使關閉 UseDNS,SSH 客戶端連線時仍可能觸發主機名解析 (如 ssh user@host、KnownHosts 檢查、GSSAPI 認證)。/etc/nsswitch.conf 中 hosts 行若將 dns 置於 files 之前,且 DNS 不通,會造成解析卡頓。
vi /etc/nsswitch.conf
# 原:hosts: files dns myhostname
# 改:hosts: files dns [NOTFOUND=return]
# 或更激進:hosts: files [NOTFOUND=return] dns
[NOTFOUND=return] 表示 files (含 /etc/hosts) 查無記錄時直接返回失敗,不再嘗試 DNS,避免超時等待。
| 項目 | 配置 | 效果 |
|---|---|---|
| GSSAPI 認證 | GSSAPIAuthentication no | 禁用 Kerberos 交換,減少往返 |
| DNS 解析快取 | 安裝 nscd 或 systemd-resolved | 本地快取 PTR/A 記錄 |
| IPv6 優先 | AddressFamily inet (sshd_config) | 強制 IPv4,避免 IPv6 連線失敗重試 |
| 連線多工 | ControlMaster auto / ControlPersist 60s (ssh_config) | 複用 TCP 連線,二次連線秒開 |
time ssh -v user@host true # 觀察 debug 輸出耗時點
ssh -o UseDNS=no user@host # 臨時覆蓋測試
SSH 延遲 90% 來自 DNS 解析。服務端關 UseDNS、客戶端調 nsswitch.conf 雙管齊下,配合連線多工與快取,可將首次連線從秒級降至毫秒級。