SSH接続するのに、急に20秒くらい接続に時間がかかるようになったため調べました。
調べるとすでに同じような記事が多く見つかる。
GSSAPIAuthentication というものだ。
自分もその時のログを残しておきます。
現象
どういう現象かというと、
SSH接続する際になかなか接続がされず、数十秒後にやっと接続される。
どこに時間がかかっているのか、
ssh -vvv <ホスト名>
という感じで、ログ出力するとわかりやすい。
debug3: send packet: type 5
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug3: start over, passed a different list publickey,gssapi-keyex,gssapi-with-mic,password
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup gssapi-keyex
debug3: remaining preferred: gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_is_enabled gssapi-keyex
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug2: we did not send a packet, disable method
debug3: authmethod_lookup gssapi-with-mic
debug3: remaining preferred: publickey,keyboard-interactive,password
debug3: authmethod_is_enabled gssapi-with-mic
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000)
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000)
実際に出ていたログがこんな感じ。
原因
ssh -vvv
でログ出力をして、気になったのは下記のあたり。
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup gssapi-keyex
どうやら、SSHコマンドはホストとのコネクションを確立させたあと、
認証方式を何個か順番に試して、ユーザー認証を行うようです。
↑の順番で認証方式を試していっている様子。
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000)
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000)
時間のかかっている部分はこの箇所、gssapi-with-micのトライで失敗しているようでした。
この施行時間が20秒くらいかかっているので、自分のケースではこれが原因でした。
gssapi-with-micで失敗したあとは、publickey認証にいくので、
そこで問題なく接続はできている。
対処方法
ここでは、対処方法を2つ記載しておきます。
1つ目、認証トライの順番をpublickeyを優先で行う方法。
2つ目は、GSS API認証を無効設定にする方法。
どちらかの対応で充分かと思います。
方法1 認証方式のトライ順を変更する
公開鍵をつかった認証は、publickeyという認証方式になるので、
gssapi-xxxの、認証方式より先にpublickeyでの認証トライをしてもらえれば、
すんなり接続できるようになります。
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
この認証トライの順番を変える方法は、
PreferredAuthentications オプションで指定できるようです。
The methods available for authentication are: GSSAPI-based authentication, host-based authentication, public key authentica-
tion, challenge-response authentication, and password authentication. Authentication methods are tried in the order specified
above, though PreferredAuthentications can be used to change the default order.
認証方式は、デフォルトで上記の順で試されます。
~/.ssh/config
に設定を書くか、
sshコマンドに直接オプション指定するかで対応できます。
ssh -o PreferredAuthentications=publickey <ホスト>
この場合、一発目で publickey認証を行ってくるので、
gssapi-xxxの認証トライで時間がとられなくなります。
方法2GSS API認証方式を無効にする。
GSS API認証というのを無効化する方法もあります。
無効化してるのでgssapi-xxx 系は認証トライもされずにすんなりスキップされて、publickey認証に行けるというわけです。
こちらも、~/.ssh/config に設定を書くか、
sshコマンドに直接オプション指定するかで対応できます。
ssh -o GSSAPIAuthentication=no <ホスト>
$ cat ~/.ssh/config
Host *
GSSAPIAuthentication no
まとめ
SSH接続が遅い場合は、 ssh -vvv
でログ確認してみる。
GSS APIの認証トライで時間がかかってる場合が多いらしいので、
GSS API認証を無効にするか、publickeyなど認証方式を直接指定する設定にしておくと無駄な時間が発生しないです。
今まで、問題なくて、急にSSH遅くなった原因はわかりませんが、
OpenSSHなどのアップデートなどのタイミングでなにか変わったのかもしれません。(謎)