こういう症状はLinux管理者なら一度は経験するはずだ。接続自体は確立されるので後回しにしがちだが、放置するとバッチスクリプトや定期実行処理で致命的なタイムロスになることもある。
SSH接続の遅延には典型的な原因が3つある。逆引きDNS解決(UseDNS)・Kerberos認証待ち(GSSAPIAuthentication)・ネットワーク経路の遅延だ。この記事では
ssh -v の出力を読んで遅延箇所を特定する方法から、/etc/ssh/sshd_config の修正、ControlMaster によるセッション多重化まで、RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTSで動作確認した手順を解説する。この記事のポイント
・SSH接続遅延の原因はUseDNS・GSSAPIAuthentication・ネットワーク経路の3パターン
・ssh -vの出力からどのフェーズで止まっているかを正確に特定できる
・UseDNS no / GSSAPIAuthentication noの2行で大多数の遅延が解消する
・繰り返し接続が多い運用ではControlMasterのセッション多重化が効果大
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
SSH接続が遅い時の3つの典型的な原因
まず全体を俯瞰しておこう。SSH接続の遅延は次の3カテゴリに分類される。・逆引きDNS解決待ち(UseDNS): sshdが接続元のIPアドレスを逆引きDNSで調べる。DNSが遅い or 逆引きエントリが無い環境で数秒~10秒以上止まる
・Kerberos認証待ち(GSSAPIAuthentication): sshdがKerberos/GSSAPIによる認証を試みてタイムアウトするまで待つ。Kerberosを使っていない環境でも発生する
・ネットワーク経路の遅延: サーバーまでのRTTが高い、MTUミスマッチ、TCPスロースタートによる遅延。pingのRTTが高い場合に疑う
実務経験上、最も多いのは逆引きDNS待ちとGSSAPI待ちの組み合わせだ。この2つを無効化するだけで「10秒かかっていた接続が1秒以内になった」というケースは珍しくない。まず原因をピンポイントで特定してから対処する。
ssh -vで遅延フェーズを特定する
対処の前に、必ずssh -v で「どこで止まっているか」を確認する。原因を推測で潰していくのは非効率だし、複数の原因が重なっている場合は見落とすリスクがある。1. -vオプションで詳細ログを確認する
# クライアントPCから実行する(-vはデバッグ出力を有効化) $ ssh -v user@192.0.2.10 # さらに詳細が欲しい場合は -vv または -vvv を使う $ ssh -vv user@192.0.2.10
2. どのフェーズで止まっているかを読む
ssh -v の出力を時系列で見ると、大きく4つのフェーズに分けられる。| フェーズ | 出力例(debug1行) | 疑われる原因 |
|---|---|---|
| TCPセッション確立 | Connecting to 192.0.2.10 [192.0.2.10] port 22. | ネットワーク経路の遅延 |
| sshdによる接続元の識別 | Connection established.(から認証開始まで) | UseDNSによる逆引きDNS待ち |
| GSSAPI認証 | Next authentication method: gssapi-with-mic | GSSAPIAuthenticationのタイムアウト |
| 鍵・パスワード認証 | Next authentication method: publickey | 通常ここはすぐ進む |
debug1: Connecting to 192.0.2.10 [192.0.2.10] port 22. debug1: Connection established. # ← ここで約8秒間フリーズ(UseDNSが原因) debug1: Authenticating to 192.0.2.10:22 as 'taro' debug1: Next authentication method: gssapi-keyex debug1: Next authentication method: gssapi-with-mic # ← ここでさらに3秒待つ(GSSAPIが原因) debug1: Unspecified GSS failure. Minor code may provide more information debug1: Next authentication method: publickey debug1: Offering public key: /home/taro/.ssh/id_ed25519 ED25519 debug1: Server accepts key: /home/taro/.ssh/id_ed25519 ED25519 debug1: Authentication succeeded (publickey).
原因1: UseDNSによる逆引きDNS待ち
sshdはデフォルトでUseDNS yes が設定されており、接続元のIPアドレスを逆引きDNSで照合する。内部ネットワークで逆引きゾーンが整備されていない環境や、DNSレスポンスが遅い環境では、ここで数秒単位の待機が発生する。1. 症状の特定 — どこで止まるか
前節の出力でConnection established. の後、Authenticating to に進むまでに時間がかかっている場合がこれに該当する。サーバー側のsshdログでも確認できる。# サーバー側で確認(journaldを使用) $ sudo journalctl -u sshd -f # 接続時に以下のような逆引きDNS失敗メッセージが出ることがある Sep 02 12:34:56 server1 sshd[12345]: reverse mapping checking getaddrinfo for client.example.com [192.0.2.50] failed - POSSIBLE BREAK-IN ATTEMPT!
2. sshd_configにUseDNS noを設定する
# サーバー側で作業する $ sudo vi /etc/ssh/sshd_config # 以下の行を追加または変更する(コメントアウトされている場合はコメントを外す) UseDNS no
3. 設定の反映と確認
【重要】sshdの設定変更はリロードで反映する。restart は既存の全セッションを強制切断するため、本番サーバーでは要注意だ。# 設定構文チェック(先にやっておくと安心) $ sudo sshd -t # エラーが出なければ OK # sshdの設定をリロード(既存セッションは切れない) $ sudo systemctl reload sshd # 設定が反映されているか確認 $ sudo sshd -T | grep usedns usedns no
ssh -v で接続してみて、Connection established. から Authenticating to までがすぐに進むようになれば成功だ。なお、逆引きDNSの仕組みや
/etc/resolv.conf の設定については Linux DNS 設定の基本 で詳しく解説している。原因2: GSSAPIAuthenticationによるKerberos認証待ち
GSSAPIAuthentication はKerberosベースの認証機構だ。sshdはデフォルトで有効になっており、Kerberos環境でなくても認証を試みてタイムアウトするまで待ってしまう。ssh -v の出力で Next authentication method: gssapi-with-mic の後にしばらく止まり、Unspecified GSS failure. と出てから次の認証方式に進むパターンがこれだ。1. クライアント側での確認と無効化(即効)
まずクライアントPCから接続オプションで無効化して確認する。# GSSAPIAuthenticationを無効化して接続(速くなれば原因確定) $ ssh -o GSSAPIAuthentication=no user@192.0.2.10 # 速くなった場合は ~/.ssh/config に永続化する $ vi ~/.ssh/config
# ~/.ssh/config の記述例 Host * GSSAPIAuthentication no # 特定のサーバーだけに適用する場合 Host 192.0.2.10 GSSAPIAuthentication no
Host * は全サーバーへの接続に適用される。Kerberos環境と非Kerberos環境が混在している場合は Host で絞り込む。2. サーバー側での恒久設定
自分が管理するサーバー全体で一括無効化する場合は、sshd_configで設定する。$ sudo vi /etc/ssh/sshd_config # 以下を追加または変更 GSSAPIAuthentication no GSSAPICleanupCredentials no $ sudo sshd -t && sudo systemctl reload sshd # 確認 $ sudo sshd -T | grep -i gssapi gssapiauthentication no gssapicleanupcredentials no
Linux無料マニュアルを受け取る >>
ControlMasterでSSHセッションを多重化して接続を高速化する
UseDNSとGSSAPIの対処で初回接続の遅延は解消できる。ここからは「同じサーバーへ何度も接続する」運用での高速化テクニックを紹介する。ControlMaster は、既存のSSHセッションを「マスターコネクション」として再利用する機能だ。2回目以降の接続は新たにTCPハンドシェイクや認証フェーズを行わず、既存のソケットを使うため、接続時間が0.2秒以下に短縮される。スクリプトから複数回sshを呼ぶ処理や、scpとsshを組み合わせた運用で特に効果が大きい。1. ~/.ssh/configの設定
$ vi ~/.ssh/config Host * ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p ControlPersist 60s
・ControlPath: 多重化用ソケットファイルのパス。%r=ユーザー名、%h=ホスト名、%p=ポート番号
・ControlPersist: 最後の接続終了から指定時間マスターセッションを維持する。長くすると利便性が上がるがリソースを消費する
2. ソケットディレクトリの準備と動作確認
# ソケット保存用ディレクトリを作成(パーミッションは700が必須) $ mkdir -p ~/.ssh/sockets $ chmod 700 ~/.ssh/sockets # 通常通り接続するとマスターセッションが確立される $ ssh user@192.0.2.10 Last login: Mon Sep 2 12:30:00 2026 from 192.168.1.50 # 別ターミナルから再接続してみる(-v で動作確認) $ ssh -v user@192.0.2.10 debug1: auto-mux: Trying existing master # → 認証フェーズをスキップしてすぐに接続される
# マスターセッションの状態確認 $ ssh -O check user@192.0.2.10 Master running (pid=23456) # マスターセッションを明示的に停止する $ ssh -O stop user@192.0.2.10 Stop sent to master.
chmod 700 で保護したディレクトリに置くこと。他のユーザーが読み書きできる場所に置くと、そのソケットを経由した不正な接続リスクが生じる。それでも解決しない場合のチェックポイント
UseDNSとGSSAPIを無効化しても遅延が残る場合は、以下を順に確認する。1. pingでRTTを確認する
$ ping -c 4 192.0.2.10 PING 192.0.2.10 (192.0.2.10) 56(84) bytes of data. 64 bytes from 192.0.2.10: icmp_seq=1 ttl=64 time=0.412 ms 64 bytes from 192.0.2.10: icmp_seq=2 ttl=64 time=0.389 ms 64 bytes from 192.0.2.10: icmp_seq=3 ttl=64 time=0.401 ms 64 bytes from 192.0.2.10: icmp_seq=4 ttl=64 time=0.395 ms --- 192.0.2.10 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss rtt min/avg/max/mdev = 0.389/0.399/0.412/0.009 ms
2. TCP Wrappers(/etc/hosts.allow)の影響を調べる
旧来のRHEL 7系やCentOS 7では/etc/hosts.allow / /etc/hosts.deny による TCP Wrappers が有効だった。hosts.allowの照合処理でホスト名解決が発生すると遅延の原因になることがある。# TCP Wrappers が有効かどうかを確認(RHEL 9では通常不要) $ ls /etc/hosts.allow /etc/hosts.deny 2>/dev/null /etc/hosts.allow /etc/hosts.deny # sshdが対象になっているか確認する $ cat /etc/hosts.allow
3. PAM認証モジュールの遅延を確認する
/etc/pam.d/sshd に組み込まれているモジュールが遅延の原因になることがある。sshdのデバッグモードで確認できる。# sshdをデバッグモードで別ポートに起動して調査する(本番sshdには影響しない) $ sudo /usr/sbin/sshd -d -p 2222 # 別ターミナルから接続してサーバー側のログを確認する $ ssh -p 2222 user@localhost
-d)は1接続ごとに起動し、処理の各ステップとタイミングを標準出力に出力する。PAMモジュールの処理時間もここで確認できる。まとめ — SSH接続遅延の切り分けフロー
SSH接続が遅い場合は、ssh -vの出力でフェーズを特定してから対処する。| 症状(-v出力での見分け方) | 原因 | 対処 |
|---|---|---|
| Connection established.からAuthenticating toまで遅い | UseDNSによる逆引き待ち | sshd_configにUseDNS noを追加してreload |
| gssapi-with-micの後に止まりUnspecified GSS failureが出る | Kerberos認証タイムアウト | ~/.ssh/configにGSSAPIAuthentication noを追加 |
| 2回目以降の接続も毎回遅い(繰り返し接続する運用) | セッション再確立のオーバーヘッド | ControlMaster auto + ControlPersistを設定 |
| pingのRTTも高い | ネットワーク経路の遅延 | WAN回線・ルーティングの調査 |
| 上記すべて試しても改善しない | TCP Wrappers または PAMモジュール | /etc/hosts.allow確認・sshd -dでPAMを追跡 |
ssh -v でフェーズを確認し、ピンポイントで対処することで安全かつ確実に改善できる。Linux無料マニュアルを受け取る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:ssh-agentコマンドで秘密鍵を管理する方法|ssh-addとForwardAgentで多段SSH接続を自動化する設計
- この記事の属するカテゴリ:Linuxtips・Linuxトラブルシューティングへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます