Ubuntu Weekly Recipe

第53回sshの活用

第40回において、ターミナルを利用したファイルのやりとりとしてssh/scpコマンドを紹介しました。sshはリモートマシンにログインを行ったり、リモートマシン上でコマンドを実行したりするためのプログラムです。今回はsshに関するTipsを紹介します。

公開鍵の登録

ssh-keygenで生成した公開鍵をリモートマシンの~/.ssh/authorized_keysに追加することで、公開鍵を利用した認証が行えるようになることは第40回で紹介しました。公開鍵を登録するためには公開鍵ファイルをscpコマンドなどで転送し、authorized_keysファイルの末尾に書き込む必要がありますが、これを自動で行ってくれるスクリプトがssh-copy-idです。ssh-copy-idはopenssh-clientパッケージに含まれるため、特にインストールを行うことなく使用することができます。

使い方は以下の通りです。

$ ssh-copy-id -i (公開鍵ファイル) (リモートマシンのアドレス)

リモートマシンへログインするためのパスワードが訊かれますので、パスワードを入力してください。ログインが正常に完了すると、リモートマシンに~/.ssh/authorized_keysファイルが作成され(既に存在する場合は既存のファイルの末尾に)公開鍵が追記されます。

複数の鍵を使い分ける

ssh-keygenが生成する鍵ペアは、デフォルトではid_rsaとid_rsa.pubとなっています。sshは接続時に自動的にこの鍵を使用しますが、複数の鍵を使い分けたい場合も多くあるかと思います。そのような場合は、リネームした複数の鍵を配置しておき、sshコマンドに -i オプションを渡すことで鍵を使い分けることができます。

$ ssh -i .ssh/id_rsa.hoge hoge.example.org <- hoge.example.orgに接続する場合は ir_rsa.hoge を鍵として使用
$ ssh -i .ssh/id_rsa.fuga fuga.example.org <- fuga.example.orgに接続する場合は ir_rsa.fuga を鍵として使用

また使用する鍵のリストをあらかじめ定義しておくこともできます。

~/.ssh/configファイルに以下の記述を追加してください。

IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa.hoge
IdentityFile ~/.ssh/id_rsa.fuga

ポート転送

sshには安全な通信路を経由して、ローカルマシンからリモートマシンへポートを転送する機能があります。この機能を利用することで、インターネットから接続可能なsshサーバさえあればファイアウォールに新しくポートを開けなくても、sshを経由してファイアウォールの内側のサービスへ接続することが可能になります。

例として、自宅のLAN内で動いているWebサーバに外部からアクセスすることを考えてみましょう。ネットワークの構成は以下のようになっているとします。

画像

クライアントマシンで以下のコマンドを実行し、sshサーバに対してログインを行います。

$ ssh -L 8080:web.localdomain:80 gw.mydomain.org

接続が完了すると、クライアントマシンのポート8080への接続が、Webサーバ(web.localdomain)のポート80へ転送されることになります。具体的に言うとクライアントマシンのポート8080をsshがlistenし、当該ポートへの接続をリモートへ転送します。⁠1023番以下のポートをlistenするためにはroot権限が必要になるため、本例ではポート8080を指定しています)

sshがコネクションを張っている状態でクライアントマシンのWebブラウザに以下のアドレスを入力することで、Webサーバに接続することができます。

http://localhost:8080

なお転送先ホスト名の解決は接続先サーバにて行われます。すなわち本例ではsshサーバ(gw.mydomain.org)がLAN内のホスト名(web.localdomain)の名前解決を行える必要があります。

なお上記の例ではsshサーバにログインしてシェルが実行されますが、ポート転送のみを行いたいという場合もあるかと思います。そのような場合は -N -fオプションを使用する事で、リモートでのコマンド実行を抑制し、かつバックグラウンドで動作させることができます。

gstm

前述のポート転送機能をGUIから行うフロントエンドがgstmです。gstmはUbuntuのリポジトリに含まれていますので、Synapticや以下のコマンドでインストールを行ってください。

$ sudo apt-get install gstm

gstmを起動すると以下のような画面が表示されます。

画像

まず追加ボタンをクリックして、新しいトンネルを作成します。

基本的な設定としてトンネル名(任意の名前をつけてください⁠⁠、接続するホスト、ログイン名、ポートを入力します。

ポート転送の設定は追加ボタンをクリックし、タイプ、接続ポート、転送先ホスト、転送先ポートを指定します。

以下の画面は前述のWebサーバへ接続する例を設定した画面です。

画像

設定を保存すると、初期の画面に作成したトンネルがリストアップされます。

起動させたいトンネルを選択してStartをクリックすると、バックグラウンドでsshが起動し、ポート転送を行うことができます。

tunnelmanager

gstmよりさらに洗練されたSSHトンネル管理ソフトがtunnelmanagerです。

Ubuntuのリポジトリには入っていませんが、作者のPPAからインストールすることができます。システム -> システム管理 -> ソフトウェアソース に以下のAPT-LINEを追加して、apt-getやSynapticからtunnelmanagerをインストールしてください注1⁠⁠。

deb http://ppa.launchpad.net/opensource-subakutty/ubuntu intrepid main
deb-src http://ppa.launchpad.net/opensource-subakutty/ubuntu intrepid main

tunnelmanagerを起動すると以下の画面が表示されます。

画像

基本的な設定方法はgstmと同様ですので、違和感なく操作できると思います。

ProxyCommand

前述のようなネットワーク構成において、LAN内のホストへsshで接続したい場合があります。その場合はまずインターネットから接続が可能なgw.mydomain.orgにsshでログインし、そこからさらにweb.localdomainに対しsshでログインを行う必要がありますが、ProxyCommandを設定することでgw.mydomain.orgを中継する操作を自動的に行うことができます。

~/.ssh/configに以下の設定を追記します。

Host web.localdomain
ProxyCommand ssh gw.mydomain.org nc %h %p

上記の設定を施した後にクライアントマシンからweb.localdomainに対しssh接続を行うと、自動的にgw.mydomain.orgを経由してweb.localdomainへ接続することができます。⁠gw.mydomain.orgにncコマンドがインストールされている必要があります)

なお%hはssh実行時のホスト名、%pはポート名にそれぞれ変換されます。またHostに指定するホスト名にはワイルドカードが使用できるため、特定のドメインに属するホストに対する設定を一括で行うことができます。

詳しくは man ssh_config を参照してください。

おすすめ記事

記事・ニュース一覧