LinuxでSSH接続が遅い時の調査手順|UseDNS・GSSAPIAuthenticationを切り分けてControlMasterで高速化する方法

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxトラブルシューティング > LinuxでSSH接続が遅い時の調査手順|UseDNS・GSSAPIAuthenticationを切り分けてControlMasterで高速化する方法
「SSHでサーバーに接続するのに10秒以上かかる」
こういう症状は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のセッション多重化が効果大


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

出力は100行以上になるが、見るべき行は絞られている。次項で読み方を解説する。

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 通常ここはすぐ進む
実際の出力例(遅延が発生している環境での ssh -v 抜粋):

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).

「Connection established.」から「Authenticating to」の間が長い → UseDNS待ち。「gssapi-with-mic」の後に止まる → GSSAPI待ち。この2点が確認できたら、次節の対処に進む。

原因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!

「POSSIBLE BREAK-IN ATTEMPT!」のメッセージは攻撃ではなく、逆引きDNSが一致しないだけだ。頻出している場合は UseDNS を無効化する良いサインでもある。

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サーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
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

ControlMaster auto: マスターセッションが無ければ作成し、あれば再利用する
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.

注意: ControlMasterのソケットファイルは必ず 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

RTTが1ms未満(同一LAN)であれば、ネットワーク経路は問題ない。RTTが100ms超の場合はWANリンクやルーティングの問題であり、SSHの設定で解決できるものではない。

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

RHEL 9 / Rocky Linux 9 以降では TCP Wrappers は標準では使われていないため、このチェックはCentOS 7系・RHEL 7系の環境に特に有効だ。

3. PAM認証モジュールの遅延を確認する

/etc/pam.d/sshd に組み込まれているモジュールが遅延の原因になることがある。sshdのデバッグモードで確認できる。

# sshdをデバッグモードで別ポートに起動して調査する(本番sshdには影響しない) $ sudo /usr/sbin/sshd -d -p 2222 # 別ターミナルから接続してサーバー側のログを確認する $ ssh -p 2222 user@localhost

sshdのデバッグモード(-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を追跡
UseDNS noとGSSAPIAuthentication noの2行が特効薬になるケースが大多数だ。まず ssh -v でフェーズを確認し、ピンポイントで対処することで安全かつ確実に改善できる。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。