Linuxユーザの立場から、役立つ情報や困ったときの解決方法を分かりやすく、かつ簡潔に記事にまとめています。主に、Ubuntu 8.04(→9.04)やCentOS 5.2(→5.3)で確認したことですが、他のディストリビューションでも応用できると思います。内容は(1)設定ファイルの書き方(2)役立つソフトウェア紹介やインストール方法(3)便利なコマンドの使い方や活用例(4)困ったときの解決方法です。このページの末尾にキーワード別で記事を分類してあります。また、真上の「ブログ検索」フォームからブログ内の記事を検索できます。

2009年7月3日金曜日

多段SSH接続(2段) このエントリーを含むはてなブックマーク

本記事では、いくつかのサーバを経由して、目的のサーバに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 コメント:

キーワード

キーワード別に記事を分類してあります。クリックすると各キーワードに該当する記事たちが表示されます。

筆者について

自分の写真
趣味はコンピュータ、音楽、写真などです。