FreeBSD QandA 1579

FreeBSD QandA

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


間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。