500 MB の RAM を搭載したローカル Centos 6.3 VM に接続する際に問題が発生します。
ssh -vvv localhost
以下は接続の出力です。
OpenSSH_6.3, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /usr/local/etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Connecting to localhost [127.0.0.1] port 22.
^^^^^^^^^^ Loading this statement takes more than a minute
debug1: Connection established.
...
debug1: Next authentication method: password
root@localhost's password:
^^^^^^^^^^ This step takes a minute too
debug3: packet_send2: adding 64 (len 50 padlen 14 extra_pad 64)
debug2: we sent a password packet, wait for reply
debug1: Authentication succeeded (password).
Authenticated to localhost ([127.0.0.1]:22).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug2: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: packet_set_tos: set IP_TOS 0x10
debug2: client_session2_setup: id 0
debug2: channel 0: request pty-req confirm 1
debug2: channel 0: request shell confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel_input_status_confirm: type 99 id 0
debug2: PTY allocation request accepted on channel 0
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: shell request accepted on channel 0
Last login: Wed Oct 9 13:27:02 2013 from 10.0.0.2
この遅延を解消する方法を教えてください。
答え1
私の推測では、問題は DNS 要求のタイムアウトです。ホスト名ではなく IP アドレスで接続し、UseDNS
接続先のサーバーのオプションをオフにしてみてください。それ以外:
ssh localhost
VM ホストから接続していると仮定すると、ゲスト VM ではなくホストに接続することになります。もちろん、興味深いネットワーク設定がない限りは。最初の遅延については、これを実行して
strace
、クライアントがどのシステム コールssh
でハングしているかを確認することをお勧めします。2 回目の遅延については、
top
VM で実行して、接続中に何が起こっているかを確認します。同時に、別のポートで SSH デーモンをデバッグ モードで実行し、そのインスタンスに接続することをお勧めします。どこで待機しているかがわかります。次のコマンドを (root として) 実行するだけです。sshd -ddd -p 2222 -o UsePrivilegeSeparation=no
これにより、ポート 2222 で SSH デーモンが起動し、大量の情報がログに記録され (
-ddd
)、ログイン中に権限分離が使用されなくなります (権限分離を無効にすると、1 つのプロセスのみが使用されるため、strace で何が起こっているかを確認しやすくなります)。-o UseDNS=no
上記のオプションを無効にするには、 を追加することもできます。
答え2
VM の場合は、エントロピー不足が原因である可能性があります。接続試行の前または接続試行中に利用可能なエントロピーを監視するには、次の行を使用します。
while true; do sleep 5; cat /proc/sys/kernel/random/entropy_avail; done
すでにかなり低い場合、または接続試行中に大幅に低下する場合は、それが原因である可能性が非常に高くなります。
編集:これを行うと、新しいプロセスを開始するとエントロピーが消費されるため、利用可能なエントロピー自体に影響します。https://blog.flameeyes.eu/2011/03/entropy-broken
利用可能なエントロピーを増やすには、より多くのエントロピーを収集しようとするデーモン (rng-tools
またはclrngd
) をインストールするか、仮想化ソリューションに応じて VM に適切なエントロピー デバイスが割り当てられていることを確認します。