いつのまにかncコマンドの機能がsshにとりこまれて~/.ssh/configにこう書くだけでよくなっていた。
(以前の記事はこっち)
Host REMOTE HostName REMOTE.test.jp User YOURNAMEonREMOTE ProxyCommand ssh YOURNAMEonGW@GW.test.jp -W %h:%p
コードを斜め読みした感じだとちゃんとTCP_NODELAYオプションも有効になってるみたいだ。
いつのまにかncコマンドの機能がsshにとりこまれて~/.ssh/configにこう書くだけでよくなっていた。
(以前の記事はこっち)
Host REMOTE HostName REMOTE.test.jp User YOURNAMEonREMOTE ProxyCommand ssh YOURNAMEonGW@GW.test.jp -W %h:%p
コードを斜め読みした感じだとちゃんとTCP_NODELAYオプションも有効になってるみたいだ。
単純にsshをカスケードした場合の図:
% ssh gateway ssh target command args [localhost] [gateway] [target] command args _________________________________|______ ssh target sshd ________________________________________ | stdin/out stdin/out _|_______________________|_____________ ssh gateway sshd _______________________________________
gatewayからtargetにログインするのに、targetにprivate keyを置くかAgentForwardingをつかってlocalhostの鍵でtargetの認証を行うか二通りある。
ncでトンネルをつくって接続した場合の図:
% ssh -o 'ProxyCommand ssh gateway nc %h %p' target command args [localhost] [gateway] [target] command args stdin/out | _|______________ _________________________________|______ . . . . . . . . . . . ssh target nc %h %p : . . . . . . . . . . sshd : : ____________: :_ __________: :___________________________ | : : | : : stdin/out : : stdin/out : : _|__________: :__________|________: :___ : : . . . . . . . . . : : : . . . . . . . . . . . : ssh gateway sshd ________________________________________
localhostの鍵でgatewayとtargetの両方にログインする。
#sshd_enable="YES" inetd_enable="YES"
ssh stream tcp nowait/0/6 root /usr/sbin/sshd sshd -i -4"nowait/0/6"の意味は、「接続がきたらどんどんデーモンを立ち上げる」/「同時接続数の制限はしない」/「同じIPアドレスからの接続は1分間あたり6接続に制限する」。 "sshd -4"はIPv6はつかってないのでIPv4のみでlisten、"sshd -i"はinetd経由でつかうのでstdin/stdoutをつかえという指示。 sshdのmanpageによるとinetd経由だとserver keyを生成する時間だけクライアントが待たされるよと書いてあるが、 試してみるとそんなに時間はかからない。
/etc/rc.d/sshd onestop /etc/rc.d/inetd restartこれで連続して7回つなぎにいくと、7回目でエラーになるはず。
% ssh server date Wed Aug 25 12:55:50 JST 2010 % ssh server date Wed Aug 25 12:55:51 JST 2010 % ssh server date Wed Aug 25 12:55:52 JST 2010 % ssh server date Wed Aug 25 12:55:52 JST 2010 % ssh server date Wed Aug 25 12:55:53 JST 2010 % ssh server date Wed Aug 25 12:55:54 JST 2010 % ssh server date ssh_exchange_identification: Connection closed by remote host %/var/log/messagesには次のようなメッセージが残る
Aug 25 12:55:55 server inetd[1204]: ssh from xxx.xxx.xxx.xxx exceeded counts/min (limit 6/min)
VirtualBox/FreeBSDでブリッジネットワークがうまく動かなかったのでネットワークアダプタをNAT接続にしたが、コンソール画面でいじるとコピペが自由にできないのでリモートログインする方法を考えた。
(step1) ゲストOSからホストOSにログインしてポートフォワーディングを設定する。この端末は放置する。
guest% ssh -R 2222:localhost:22 HOSTNAME
(step2) ホストOSからフォワーディングのポートをつかってゲストOSにログインする。
host% ssh -p 2222 localhost