最近有同事遇到 SSH 登入過程緩慢的問題, 恰巧我幾年前有研究過此問題 (好奇心旺盛:p), 當時是在 Debian 5 上面 trace, 跟大家分享一下.
問題
進行 SSH 連線時, 如果沒有特別使用 Public key authentication [1], 就必須輸入帳號/ 密碼以進行身份驗證.
但輸入帳號後, 往往會需要等待相當長的時間, 才會顯示輸出密碼的欄位.雖然最終都能順利登入SSH server, 但對於我本人不能接受這些無謂的等待. 於是就來研究 ssh connection.
首先在 ssh 後面加入 -v 的參數, -v 是 verbose mode 的意思, 啟動它能顯示更多詳細資訊, 協助我們瞭解 ssh 的連線過程
Verbose mode. Causes ssh to print debugging messages about its progress. This is helpful in debugging connection, authentica‐
tion, and configuration problems. Multiple -v options increase the verbosity. The maximum is 3.
根據hang 的地方, 搭配 source code 來看, 確認為 DNS lookup problem.
SSH server 會對於 SSH client 進行 DNS 反查的動作, 以確保它沒有假造 hostname. 但機器沒有特別設定 /etc/hosts 的內容, 才會導致查無資料, 需等待 timeout.
而此問題也被紀錄在 SSH FAQ 中 [2].
解法
除了修改 /etc/hosts外, 我們也可以透過修改 sshd_config 來設定不使用此功能.
echo 'UseDNS no' >> /etc/ssh/sshd_config
設定完, 重啟 SSH server 即生效.
我們可以看到 SSH 連線即刻變順 !
生命應該浪費在美好事物上, 小小設定就可以省下這些不必要的等待時間.
ref:
[1]: https://linuxconfig.org/passwordless-ssh
[2]: https://www.complang.tuwien.ac.at/doc/openssh-server/faq.html#3.3