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