Q. ssh(1) の便利な使い方を教えて下さい。
A. 「rsh(1) に比べて安全である」という他にも、以下の利点があります。
1. データの圧縮
オプション : -C
設定ファイル : Compression {yes|no} 圧縮{する|しない}
CompressionLevel {1〜9} 圧縮レベル{低〜高}
% ssh -C remote.hoge.ac.jp
-C オプションを使うと、データが圧縮されて転送されます。slogin(1)
や scp(1) でも有効です。ユーザごとの設定ファイル ~/.ssh/config に
Compression yes
と記述しておけば、毎回 -C オプションを使う必要はありません。
ダイアルアップ接続など、通信路が細い場合には特に有効です。さらに
CompressionLevel 9
などと、圧縮のレベルも設定できます。
2. X プロトコルの転送
ユーザが X Window System を使用していれば (環境変数 DISPLAY が設定
されていれば)、ssh で接続したリモートシェルから実行した X アプリ
ケーションは、自動的にローカルの X サーバに表示されます。このとき
X プロトコルは暗号化された通信路を経由して送られます。また、ユーザは
DISPLAY 環境変数の設定や xauth(1) コマンドの実行を手動で行なう必要は
ありません。
なお、この機能を使用するためには、コマンドライン及び設定ファイルで
有効化されてなければなりません。
リモートホスト側の sshd(8) の設定ファイル:
X11Forwarding {yes|no} X11 の転送を {許可|禁止}
X11DisplayOffset number ディスプレイ番号 (デフォルト:10)
ローカル側の ssh(1) の設定ファイル:
ForwardX11 {yes|no} X11 の転送を {する|しない}
コマンドラインオプション: -x X11 の転送をしない
-X X11 の転送をする
具体的には、ssh で ホスト remote にログインすると、環境変数
DISPLAY が remote:10.0 などと設定されます。ここで xclock などの
X アプリケーションを実行すると、環境変数 DISPLAY が参照され、
ディスプレイ番号 10、つまりポート 6010 (X サーバのポート番号 6000+10) に
接続し、X プロトコルをしゃべります。remote の sshd は ポート 6010 への
データを local の ssh に転送し、ssh がローカルの X サーバに中継します。
local remote
ssh (xxx)<================>(22) sshd (6010)
↓ 暗号化された通信路 ↑
X server (6000) xclock
(環境変数 DISPLAY 参照)
3. TCP ポートフォワーディング
オプション : -L port:host:hostport
-L port/host/hostport (IPv6)
設定ファイル : LocalForward port host:hostport
TCP/IP ポート host:hostport を、リモート側から暗号化された通信路
を経由してローカルの port に転送します。通常 host は ssh の接続先ホ
ストですが、それ以外のホストを指定してもかまいません。この場合、接
続先ホストと host 間の通信は暗号化されませんので、注意してください。
なお、host は接続先ホストから見た名称となります。
オプション : -R port:host:hostport
-R port/host/hostport (IPv6)
設定ファイル : RemoteForward port host:hostport
TCP/IP ポート host:hostport を、ローカル側から暗号化された通信路
を経由してリモートの port に転送します。これを見てピンときた人もい
るでしょうが、これを使えば X11 forwarding をエミュレートできます。
どの指定方法も必要なら複数指定することができます。
4. POP over ssh
例えば、ホスト remote.hoge.ac.jp の POP3 サーバとのデータのやりとりを
telnet(1) で行うと、
% telnet remote.hoge.ac.jp 110
...
USER username (ユーザ認証)
PASS password
....
RETR 1 (メール番号 1番を取得)
.... (メールの内容が送られてくる)
QUIT
となります。これではパスワードやメールの内容が全て平文でネットワーク
上を流れてしまいます。
リモート (remote.hoge.ac.jp) に sshd(8) が上がっている場合は、この代わりに
% ssh -L 8000:remote.hoge.ac.jp:110 remote.hoge.ac.jp
とします。そして、ローカルのポート 8000 にアクセスすると、
% telnet localhost 8000
...
USER username (ユーザ認証)
PASS password
....
RETR 1 (メール番号 1番を取得)
.... (メールの内容が送られてくる)
QUIT
と、remote.hoge.ac.jp:110 の代わりに localhost:8000 に接続して、
同じ POP3 プロトコルをしゃべればメールが取得できるわけです。
ssh(1) が自動的にリモートのポート 110 宛に転送してくれます。
流れるデータは全て暗号化されており、-C で圧縮することもできます。
a) Netscape
Netscape Messenger では、サーバ名を指定する所に
「ホスト名:ポート番号」 (例 localhost:8000)
と記述します。なお、メールを取り込む前に
% ssh -L 8000:remote.hoge.ac.jp:110 remote.hoge.ac.jp
を実行しなくてはいけません。
b) fetchmail(1)
POP over ssh の例は、fetchmail のオンラインマニュアルにも載っています。
以下の ~/.fetchmailrc はその一例です。この例では pophost には直接
ssh で接続できないので、shellhost を経由しなければならないと仮定し
ています。
---[~/.fetchmailrc の例]---
defaults proto apop timeout 120
mda "/usr/local/bin/procmail -d localuser"
username popuser password poppass
postconnect "/usr/sbin/sendmail -q";
poll pophost.domain via localhost port 10110 with proto pop3:
preconnect "ssh -f -L 10110:pophost.domain:110 shellhost.domain
-l popuser sleep 20 </dev/null >/dev/null 2>&1";
---
local shellhost
(10110) ssh (xxx)<================>(22) sshd
↑↓ 暗号化された通信路 ↓↑ LAN
fetchmail (110)
POP3 server
pophost
5. IMAP over ssh
6. SMTP over ssh
a) sendmail(8) + CF
まず、sendmail.cf を作りなおします。CF の .def ファイルを編集して、
未使用のメーラを SMTP over ssh 用に設定します。
ESMTP_MAILER_ARGS='IPC $h 10025'
ESMTP_MAILER_FLAG_BASE="$SMTP_MAILER_FLAG_BASE"
上の例では esmtp メーラを使い、ssh による TCP forwarding にポート番
号 10025 を割り当てます。つぎに配送方法の指定ですが、基本的に全ての
メールを暗号化して送るのなら以下のような指定になるでしょう。
DIRECT_DELIVER_DOMAINS='local.domain'
DIRECT_DELIVER_MAILER=smtp
DEFAULT_RELAY='esmtp:[localhost]'
DELIVERY_MODE='queue'
または、逆に一部のドメイン宛のみ暗号化するのなら、STATIC_ROUTE_FILE
か MAILERTABLE を使用すれば良いでしょう。
[mailertable の例]
myoffice.domain esmtp:[localhost]
% ssh -f -C -L 10025:localhost:25 host.myoffice.domain sleep 60
% sendmail -q
7. NNTP over ssh
a) leafnode(8)
ports から入れたのなら /usr/local/share/doc/leafnode+/config.example
に例があります。
8. rsync(1)
オプション : -e ssh または --rsh=ssh
環境変数 : RSYNC_RSH
% rsync -avz --delete --rsh=ssh . user@remote:dir/
カレントディレクトリ配下のツリー全体を remote の ~user/dir/ ディレ
クトリへ反映させます。その際 remote との接続に ssh を使用します。
なお、ssh 側で既に Compression yes になっている場合は、rsync の -z
オプションは無意味でしょう。
$ export RSYNC_RSH=ssh (sh 系)
% setenv RSYNC_RSH ssh (csh 系)
環境変数を設定しておけば、オプション指定は省くことができます。
9. cvs(1)
環境変数 : CVS_RSH
$ export CVS_RSH=ssh (sh 系)
% setenv CVS_RSH ssh (csh 系)
% cvs -d freefall.FreeBSD.org:/home/ncvs checkout src/sys
CVS リポジトリのあるサーバへの接続に ssh を使います。
10. VPN using ssh
例えば、出先からプロバイダ経由で社内のサーバを利用するような場合、
通信路を暗号化したトンネルを構築すればデータを安全に利用できます。
まず、手元のクライアント及びサーバとなるマシンの /etc/ppp/ppp.conf
に以下の設定を追加します。ssh コマンドはクライアントの root 権限で
動かしますので、ssh -l user officeserver でログインできる事を確認し
てください。また、user が root 以外の場合は、サーバの /etc/group の
network グループに user を登録する事を忘れないで下さい。
---[ppp.conf の例]---
sloop:
set timeout 0
set log phase chat connect lcp ipcp command
set openmode passive
set device "!ssh -l user officeserver exec /usr/sbin/ppp -direct loop-in"
set dial
set login
set ifaddr 127.0.0.2 127.0.0.3
set server /var/tmp/loop "" 0177
loop-in:
set timeout 0
set log phase lcp ipcp command
allow mode direct
---
以下はクライアントでのオペレーション例です。この例では、最初の ppp(8)
でプロバイダへ接続していますが、専用線を使う環境では省くことができ
るでしょうし、ipfw(8) を利用してゲートウェイとして動作させることも
できます。
% su
# ppp -quiet -auto provider
# eval `ssh-agent -c`
# ssh-add
# ppp -background sloop
# suspend
% execute your network application...
% %
# pppctl /var/tmp/loop close
# eval `ssh-agent -k -c`
# pppctl /var/tmp/provider 'close; quit all'
グループ名: ssh