2007年3月29日木曜日

ssh でポートフォワード

ssh でポートフォワードする方法についてメモしておきます。
ただし、サーバ側では OpenSSH が Linux 上ですでに動作していることとし、
クライアント側には WindowsXP + cygwin を用いるとします。

最初に cygwin のインストールです。
インストーラ をダウンロードして実行します。
デフォルトのセットアップでかまいませんが、
パッケージ選択画面でいらないものははずせます。
今回は net の openssh しか使わないので、
極端に言えばこれだけ入っていれば多分支障はないでしょう。
cygwin を立ち上げると bash が起動するので
$ whoami
を実行して、自分のユーザ名を確認しておきます。
cygwin をインストールしたディレクトリにある home ディレクトリに
そのユーザ名でディレクトリを作成します。
これがそのユーザのホームディレクトリとなります。
すでに作成されていれば作る必要はありません。

次に鍵を作ります。
ssh はよりセキュアな ver 2 を使うべきで、これには鍵の作成が必須です。
鍵はサーバ側でもクライアント側でもツールさえあれば作成可能ですが、
今回はサーバ上で作成します。
サーバに ssh を利用したいユーザでログインし、以下を実行します。
$ cd ~
$ mkdir .ssh
$ cd .ssh
その後
$ ssh-keygen -t rsa
を実行するといろいろ入力要求されますが、基本的にデフォルトでかまいません。
ただし、パスフレーズ(スペースの許されたパスワード)は任意のものを入力し、
覚えておく必要があります。
ここまでの操作で、秘密鍵 "id_rsa" と公開鍵 "id_rsa.pub" が作成されているはずです。
id_rsa は他の誰にも知られてはならないファイルなので慎重な取り扱いが必要です。
間違ってもメールに添付して送るなどというようなことはしないよう十分ご注意ください。
一人の不注意でサーバが脅威にさらされることになります。

さて、クライアントの設定に戻ります。
先ほど生成した id_rsa をクライアントにコピーします。
本当はFD等の物理メディアを介したほうが安全ですが、
同一LAN内でftpでファイル転送すればほぼ問題ないでしょう。
cygwin で bash を起動し、以下を実行します。
$ mkdir ~/.ssh
$ cd ~/.ssh
$ chmod 700 ~/.ssh
これで自分のホームディレクトリに .ssh ディレクトリができているはずなので、
ここに取得した id_rsa をおきます。
引き続き bash で以下を実行します。
$ cp id_rsa identity
$ chown <ユーザ名> id_rsa
$ chown <ユーザ名> identity
$ chmod 600 id_rsa
$ chmod 600 identity
これで準備完了です。

これで telnet,ftp の代わりに ssh,sftp を使ってセキュアなログインが可能となります。
cygwinのbashを起動し、
$ ssh <ログインユーザ名>@<sshサーバホスト名>
でターミナル接続が、
$ sftp <ログインユーザ名>@<sshサーバホスト名>
でftp接続が確立されます。
ログイン時に接続の確認を求められたり、パスフレーズの入力を求めらますが、
後の操作は telnet や ftp と変わりありません。

これでやっとポートフォワーディングの説明に入れます。
そもそもポートフォワーディングとはTCPの接続をsshに中継させるための技術で、
sshクライアントとsshサーバの間にセキュアなトンネルを作り
暗号化されていないTCP通信の安全な通り道を作ることです。
たとえば、インターネットとイントラネットの間にsshサーバを設置することで、
インターネットからイントラネット内のコンピュータに安全にアクセスできます。
ここで言うコンピュータは、メールサーバやウェブサーバなどTCP接続可能なものすべてをあらわし、
VNCで自分のデスクトップPCを遠隔操作することも含まれます。
以下、いくつか実践的な例を示します。

メール受信は、
$ ssh <sshサーバ名> -N -L 110:<メール受信サーバ名>:110
を実行した上で、
メーラーの受信サーバを "localhost" に変更するだけです。

メール送信は、
$ ssh <sshサーバ名> -N -L 25:<メール送信サーバ名>:25
を実行した上で、
メーラーの送信サーバを "localhost" に変更するだけです。

ウェブサーバへのアクセスは、
$ ssh <sshサーバ名> -N -L 8080:<ウェブサーバ名>:80
を実行した上で、
ウェブブラウザのプロキシサーバを"localhost"、プロキシのポート番号を"8080"、
ローカルアドレスにもプロキシを使用するように変更して、
通常通りアクセスするだけです。

VNCでイントラネット内のPCにリモートログインするには
$ ssh <sshサーバ名> -N -L 5901:<VNCサーバ名>:5900
を実行した上で、
VNCクライアントからの接続先として "localhost:1" を指定するだけです。
なお、VNCのポート番号は5900からのオフセットです。

CVSサーバへのアクセスは、
$ ssh <sshサーバ名> -N -L 2401:<CVSサーバ名>:2401
を実行した上で、
CVSクライアントの接続先サーバ名を "localhost" にするだけです。

ftpサーバの場合は、データ転送用のポートが不定のためポートフォワードに向きません。
sshサーバにsshでログインして、
そこからイントラネット内のftpサーバからファイルをいったんsshサーバ本体に転送し、
その後でsftpで取得するのがよいでしょう。

これらを応用することでかなりいろいろなことができます。
その際たるものとして PPPoSSH で透過的にイントラネットに接続できます。
いわゆる VPN ですね。
ただ、これはサーバ側に準備が必要ですし、
いろいろと操作や管理がやりにくい面があり個人的にはあまりお勧めしません。
それなら PPTP を利用したほうがいいと思います。
ただしこちらもかなりハードルが高いです。
もしどうしても VPN したいのであれば、
素直に商用製品を購入することをお勧めします。

0 件のコメント:

コメントを投稿