本記事では、いくつかのサーバを経由して、目的のサーバにSSH接続する、いわゆる多段SSH接続に関するいくつかのチップスをまとめる。ちなみに、ここでは、server1を経由してserver2にssh接続する2段接続の場合の説明とする。もっと良い方法・改善点があれば、教えてください。以下の方法はすべて自己責任で行ってください。私はここで説明した方法によるいかなる損害にも責任を持ちません。
以前、socksサーバ経由でSSH接続する方法という記事を書いたので、適宜参照すると良いかもしれない。
まず単純に、2段接続するには、次のコマンドで良い。ホストuser1@server1を経由して、ホストuser2@server2に接続する方法である。
$ ssh -t user1@server1 "ssh user2@server2"
tオプションをつけてあることに注意してほしい。これがないとエラーが出て怒られてしまう(以下)。仮想端末を強制的に割り当てるという意味。リモートマシン上で、screen-basedなプログラムを実行するときに使われるオプションらしい。 From man of ssh
$ ssh user1@server1 "ssh user2@server2" Enter passphrase for key '/home/hoge/.ssh/xxxx': xxxxxxxxxxxxxxxxxxx Pseudo-terminal will not be allocated because stdin is not a terminal. Permission denied (publickey,gssapi-with-mic).
socksを経由してuser1@server1に接続し、さらにuser1@server1を経由してuser2@server2に接続する場合も同様。以下のように.ssh/configにsocksのための設定を記述してあるとせよ。
Host user1.server1.socks HostName server1 User user1 Port 22 ProxyCommand /usr/bin/connect -a none -S socks-proxy.xxx.jp:1080 %h %p
そのとき、次のように実行すれば良い。
$ ssh -t user1.server1.socks "ssh user2@server2"
多段接続する必要性は、例えば、会社の内部ネットワークにあるサーバserver2に接続したいが、内部ネットワークにアクセスするには、ゲートウェイであるserver1を経由しなければならないときである。もちろん、1ステップごとsshでアクセスして、最終的にserver2(より一般にserverN)にアクセスしても良いが、ある一定回数以上、単純作業を繰り替えしていると、耐えられなくなるときがあるらしい。
あるいは、内部ネットワークだけで公開している、Webサイトなどを見たいときは次のようにする(ただし、この方法は、内部ネットワークにあるプロキシサーバにSSH接続できる場合に限られる。なければ、ssh接続できるサーバにプロキシを立てる。)。
SSHポートフォワードを使えばよい。つまり、ローカルマシンの空きポート18080をプロキシサーバserver1 (ユーザ名user1)のプロキシ用ポート8080に転送すれば良い。
$ ssh -N -L 18080:localhost:8080 user1@proxy.server1
そして、ブラウザのプロキシ設定にて、localhostの18080をプロキシとして登録しておけば良い。もちろん、ローカルマシンが別のネットワークにあり、そこを出るためにSocksを経由しなければならないときは、上のようにsocksの設定をして、次のコマンドを打てば良い。
$ ssh -N -L 18080:localhost:8080 user1.server1.socks
抜け道を使っているようで、少し心が咎めるが、もともとSOCKSプロキシを利用できるということは、”そのネットワークにおいて、そういうことを許可しているということなのだ”、と理解する。
また、最初の設定で、user1@server1を経由して、user2@server2のとあるディレクトリに、ローカルマシンのデータをrsyncでバックアップするには、次のような手順で行う。まず、ダイナミック転送の設定を行う。ダイナミック転送は、転送先のポートを指定しなくて良いので楽である(ローカルマシンをsocksサーバとして使用する)。まず、ローカルマシンの空きポート(ここでは10022番)をuser1@server1に転送する。
$ ssh -N -f -D10022 user1@server1
次に、user2@server2へのssh接続の設定を.ssh/configに記述する。
Host user2.server2 HostName server2 User user2 Port 22 ProxyCommand /usr/bin/connect -S localhost:10022 %h %p
最後に、次のようなスクリプトbackup.shを作成する。
#!/bin/sh #年月日入りログファイルに、バックアップログを書き込む。 LOG_NAME="$(date +%Y%m%d)_rsync.log" #バックアップをとってほしくないファイル、ディレクトリのリストを作成して、rsync_exclude.lstに書き込む(フォーマットは、1行に1つ記述) EXCLUDE_FROM_LIST="rsync_exclude.lst" #バックアップ元のディレクトリ(hogeユーザのホームディレクトリ以下をバックアップする場合) SOURCE=/home/hoge #リモートホストuser2@server2のホームディレクトリにbackupというディレクトリにバックアップを保存する。 TARGET="server2:/home/user2/backup/" rsync -avz --delete -e ssh --log-file=$LOG_NAME --exclude-from=$EXCLUDE_FROM_LST $SOURCE $TARGET
もちろん、ローカルマシンがSOCKSサーバを経由しないとインターネットに接続できないときは、上のuser1.server1.socksを使えば良い。以上
0 コメント:
コメントを投稿