7. tredir

tredir は TERM のもっとも強力なユーティリティのうちの一つで、もっとも重要な ネットワークサービスを TERM リンク上で動作させることを可能にします。tredir を どうやって使うかを説明する前に、ネットワークサービスについての裏側を少し説明 しておく必要があるでしょう。以前にもネットワークサービスについて触れました が、それが何であるかにははっきりとは触れませんでした。サービスというのはつま り−ネットワークによって提供されるサービスのことです。サービスの例としてはマ シン間でのログインを提供する telnet や、マシン間でファイルを転送する File Transfer Protocol, ftp や 電子メールを送る時に使う the Simple Mail Transfer Protocol, smtp などがあります。それぞれのネットワークサービスにはそ れに付随したポート番号があります。サービスに対するポート番号の割り当ては、イ ンターネットにつながったマシンの中のファイルによって与えられています。

サービスはどのようにして呼び出されるのでしょうか?それぞれのネットワークに つながったマシンには inetd というデーモンが走っていて、ネットワークポートへの 接続の試みを見張っています。これらのリクエストはネットワークからも、ローカル マシンからも来ることがあります。ネットワークサービスは、適切な inetd ポートに 接続することによって得られます。ネットワークリクエストが出されると、inetd は リクエストが出されたポート番号によってどのサービスを呼び出すかを知っています。 inetd がそのように設定されていれば、接続要求に対して適切なサービスを提供しま す。inetd の設定は、ファイル '/etc/inetd.conf' によって与えられ、それには inetd が提供するサービスのリストが載っています。さらに情報を得るには、inetd と inetd.conf のマニュアルページを見て下さい。

telnet (termtelnet でないことに注意)を使ってネットワークサービスと直接通信 することができます。例えば、マシン machine_name 上の sendmail (または smtp) デーモンと会話するには、telnet machine_name smtp とするか、 telnet machine_name 25 (25 は '/etc/services' で smtp に割り当て得られた番号 です)とすることができます。リモートマシンのデーモンから丁寧な挨拶を受けること でしょう。これはネットワークの問題や tredir によってリダイレクトされたポート の確認(以下参照)のために大変有効なトリックです。

tredir は inetd と大変似た働きをします。デーモンとしてバックグラウンドで実 行され、ネットワークポートを見張ってリクエストを待ちます。サービスに対するリ クエストが出ると、inetd がするように、サービスを提供する代わりにそのリクエス トを TERM リンクを通じてリモート TERM に転送し、リモートの TERM はネットワー クを通じてリクエストを出し、ローカルのクライアントに対してリンクを通じて結果 を返します。tredir はネットワーク上のどのマシンにもリクエストを転送できます が、デフォルトでは TERM リンクの相手側のマシンに送ります。tredir は TCP (Transmission Control Protocol)ネットワークサービスを TERM リンクを通じてリダ イレクトします。

tredir の一般的なコマンドの形式は:

    tredir [this_computer:]port [that_computer:]port

例をあげるとはっきりするでしょう。ローカルポートをリモートマシンの telnet ポートにリダイレクトしてみましょう。このためには、

    tredir 2023 23

とします。これで、ローカルマシンのポート 2023 につないだ人はリモートマシンの ポート 23 (telnet) にリダイレクトされます。これがセッションの例です;ローカル マシンを mymachine.modem.home 、リモートマシンを netsun とします。

    $ tredir 2023 23
    Redirecting 2023 to 23
    $ telnet localhost 2023
    Trying 127.0.0.1...
    Connected to mymachine.modem.home
    Escape character is '^]'.


    SunOS UNIX (netsun)
    login:

この例は実際に非常に便利です。代わりに netsun で tredir を実行したとしま す。ネットワークにつながったマシンのリダイレクトされたポートにつなぐ(telnet を使って)だけで mymachine に telnet できることになります−すなわち、 telnet netsun 2023 とするのです。

tredir の利用の一般的な本質はネットワーク上のマシンに必要とされるサービスを リダイレクトすることです。次の例では、ネットワーク上のニュースサーバから TERM リンクを通してローカルマシンでニュースを読めるようにします。ニュースは nntp サービスで提供され、ポート番号は 119 です。全てのきちんとしたニュースリーダ は、設定ファイルか環境変数でどのポート番号を使うかを設定できるようになってい ます。これをローカルのポート 2119 に決めましょう。では、ニュースサーバを news.domain.org とします。ポート 2119 を news.domain.org のポート 119 にリダ イレクトします;そしてニュースリーダには nntp サーバがローカルホストのポート 2119 にあると設定してやります。利用するニュースリーダにもよるので、ここでは ニュースリーダの代わりに telnet を使ってリンクをテストするだけにしましょう。

    $ tredir 2119 news.domain.org:119
    Redirecting 2119 to news.domain.org:119
    $ telnet localhost 2119
    Trying 127.0.0.1...
    Connected to mymachine.modem.home.
    Escape character is '^]'.
    200 news.domain.org InterNetNews NNTP server INN 1.4 07-Dec-41 ready
    (posting ok).

ここまで来れば、あとやるべきことはニュースリーダを TERM を通して読めるよう に設定することだけです(もしこのようにしてニュースを読むのであれば、投稿する全 ての記事の Reply-To: ヘッダににきちんと届く email アドレスをセットする必要が あります。そうでないと、あなたに連絡をとろうとする人達はニュースリーダのつけ る間違った) From: ヘッダを見てメールを出してしまうでしょう)。

7.1. tredir can bite!

最後の例を読んだ賢明なる読者は、なぜポート 2119 をポート 119 にリダイレクト したのかを不思議に思うでしょう−−ニュースリーダのデフォルトがポート 119 なら ば、なぜ tredir 119 news.domain.org:119 として、ニュースリーダの設定をしない で済まさないのだろうかと。答えは 1024 より小さいポートは「予約ポート」で、 スーパーユーザだけがこれを使うことができます。もしセキュリティ上の危険を冒し て tredir を SUID するか、root として tredir を実行すれば、予約ポートにリダイ レクトして、サービスの変更の混乱を避けられるでしょう。

予約ポートを使うもう一つの問題はすでに inetd がそれらのポートを見張ってい て、また同時には一つのプログラムしかポートを見張ることはできません。そのよう なポートを使うためには、リダイレクトしたいポートを変更しなくてはなりません。 ぶつかっているサービスの行に # をつけてコメントにしてしまうのが簡単です。スー パーユーザはそのあと、inetd に HUP シグナルを送って(kill -1 inetd-pid)、その 設定を読み直させなくてはなりません。

7.2. Stupid tredir tricks

このセクションでは、もっと一般的な tredir の利用を述べます。すでに nntp と telnet サービスをリダイレクトする方法については述べました;ここではもう少し複 雑な例をあげます。

7.2.1. X windows

前のセクションで、txconn を使ってネットワーク上で走っている X のクライアン トに、ホームマシンにウィンドウを開かせる方法について述べました。TERM リンクの リモート側のマシンに、あなたのホームマシンからクライアントを表示するのに同じ テクニックが使えます。しかしリモート側になっていないネットワークマシンに X ク ライアントを表示するにはどうしたらいいでしょう?答えは、我々が議論してきた他 のプログラムと同じように、X が特定のネットワークサービスを使っているというこ とです。X サーバは、ポート = 6000 + ディスプレイ番号という形の番号で与えられ るポートでネットワークリクエストを見張っています。例えば、マシンのスクリーン 0 を使っている X サーバは、ポート 6000 を見張っています。もしスクリーン 2 を 使っているなら、ポート 6002 を見張っているということです。DISPLAY 環境変数を xmachine:n のようにセットすると、X クライアントは xmachine のポート 6000 + n につなごうとします。

このことを、ローカルマシンの X クライアントをだましてリモートのディスプレイ にウィンドウを開かせるのに使うことができます。ローカルマシンで走る xterm を、 ネットワークのどこかにある xmachine のディスプレイ 0 に開いてみましょう。最初 に、ローカルのディスプレイ番号、2 を選びます(0 を使ってはいけません。ローカル の X サーバがきっと使っているはずだからです。このディスプレイを xmachine の ディスプレイ 0 に割り当てます。ポート番号で言うと、このことはローカルポート 6002 を リモートポート 6000 にリダイレクトすることになります。こうしてみま しょう。

    $ tredir 6002 xmachine:6000
    $ setenv DISPLAY localhost:2
    $ xterm

これで xmachine 上に xterm が開くはずです。しかし DISPLAY を localhost:2 に セットしたことに注意して下さい。これは、DISPLAY を :2 にセットすると X クライ アントがローカルディスプレイに接続した時にオプションでインターネットドメイン ソケットではなく unix ドメインソケットを使うことがあるからです。localhost:2 は TCP コネクションを使うように指示しています。

xmachine とつながっている限り、X リクエストは TERM リンクのリモート側 (remotemachine)から来ることに注意して下さい。ですから、もしコネクションを認証 したいのであれば、xmachine 上で xhost + remotemachine を実行するか、xmachine からの鍵を使ってディスプレイ番号2についてローカルマシンの '.Xauthority' を更 新するために xauth を使うべきでしょう。

もう一度言いますが、X の接続のスピードをあげるために sxpc というプログラム を使うことができ、そこでリンクを確立するためにどのように tredir を使うか、 xauth を使ってそれをどのように認証するかについての説明がなされています。

7.2.2. TERM とメール

これについて聞きたいですか。電子メールは UNIX システムの中で、きちんと動作 させるのがもっとも難しいものの一つであるという専らの評判です。メールとともに TERM を本当にきちんと動作させるということは、メールがどのように働いているかを 知ることでもあり、それはこの文書の範囲外です。メールについてさらに知りたいの なら、UNIX システム管理の書籍や rtfm.mit.edu:/pub/usenet/comp.mail.misc から anonymous ftp で手に入る comp.mail.misc の FAQ を参考にして下さい。現在 TERM のもとでメールを働かせる手助けになる二つのパッケージが sunsite.unc.edu から anonymous ftp で手に入ります。Byron A. Jeff による term.maierd+smail と Bill C. Riemers による BCRMailHandler です。

メールプログラムには二つのクラスがあります。最初の一つはメールユーザエー ジェント(MUA)です。MUA はメッセージを読み、書き、そして送ることを支援します。 MUA の例は elm, pine, Mail, そして vm です。MUA は全くネットワーキングを行な いません;メッセージを取りまとめるだけです−−メールを送る実際の仕事は二つ目 のクラスのプログラム、メールトランスファーエージェント(MTA)によってなされま す。これらは MUA によって呼び出されます。これらはメッセージを受け取り、アドレ スを見てどこへ送るのかを決定し、実際にネットワークを通じて配送します。

Linux システムにおける最も一般的な MTA は sendmail と smail です。基本的な 要点は、あなたの MTA を、メッセージをどのように処理するかを知っているネット上 のマシンで動作している別の MTA につなぐことです。これは、ネット上のマシンの smtp ポートにローカルポートをリダイレクトすることで実現できます。あなたは MTA を、そのように扱っていいかわからないメッセージを受け取って、それをローカルマ シンのリダイレクトされたポートを通じてリモートマシンの MTA に送り、そしてそれ がメッセージを正しい宛先に送るように設定しなくてはなりません。

smail を使ってどのようにこれを実現できるでしょうか?最初に、ネットワーク上 のメールマシン(mailhost)にポートをリダイレクトします。

    tredir XXXX mailhost:25

ここで、XXXX はローカルホストの smail が接続するポート番号です(これには名前 をつけて '/etc/services' に書いて smail に認識させなければなりません)。Smail には普通 '/usr/local/lib/smail' に置かれるいくつかの設定ファイルがあります。 これからの論議では、すでにローカルメールについては正しく設定されているものと します−−ファイルや、パイプや、そういったものへの配達です。もう一度言います が、まだできていないのであればドキュメントを読んでください。

 ファイル 'config' に、以下のような定義を加えます:

    smart_path=localhost

 localhost は、メッセージをどう扱っていいのかわからないときにつなぐマシン名 です。

 'routers' には、これを入れます。

    smart_host:
    driver=smarthost,
    transport=termsmtp;
    path=localhost

 'transport' にはこれを入れます。

    termsmtp:        driver=tcpsmtp,
          inet,
          return_path,
          remove_header="From",
          append_header="From: YOUR_NET_ADDRESS",
          -received,
          -max_addrs, -max_chars;
          service=YOUR_SMTP_SERVICE,

 上では、header の行が出ていく全てのメールの From ヘッダを YOUR_NET_ADDRESS に書き換えています。これはあなたがメールを送りたいネットワークのアドレスで す。もし複数のユーザが TERM リンクを使うのなら、ローカルユーザのネットワーク アドレスのデータベースを作って From: ヘッダに埋め込むなどの工夫が必要です。

 service の行はネットワークにつながったマシンの smtp ポートにリダイレクトし たローカルのポート番号の名前を入れます。私のバージョンの smail では、これは番 号を設定するだけではだめで、"foo" のような名前を付けてやり、 '/etc/services' の中でリダイレクトされたポートとして定義する必要があります。もし SUID された tredir を使って、smtp ポート(25)をリダイレクトするのであれば、これを定義する 必要はありません。

 これで十分なはずです。もし sendmail を使うことにしたのなら、原理的には同じ ですが細部が異なります。Ronald Florence (ron@mlfarm.com)は標準の Sun の sendmail ではリダイレクトされたポートを通してはキューに入った複数のメッセージ を送ることはできないと教えてくれました;BSD の sendmail 8.6.9 はうまくいきま す。彼は '/etc/sendmail.cf' を TERM とともに使えるように以下のように変更しま した。彼の場合、デフォルトの sendmail ポート(25)はローカルのイーサネットを通 しての smtp トラフィックに利用されていたため、インターネットメールはリダイレ クトされたポートに転送することにしました。

    #
    #Create the termsmtp mailer, which sends mail via a re-directed TCP port
    #
    Mtermsmtp,P=[TCP], F=mDFMuCXe, S=22, R=22, A=TCP $h PORTNUMBER

 ここで、PORTNUMBER はローカルマシンのリダイレクトされたポートの番号です。こ れは 2000 以上の使われていないポートであるべきでしょう。次に、sendmail にどの マシンにつなげばいいのかを伝え、またデフォルトメーラとして termsmtp をセット します。

    #
    # major relay mailer
    #
    DMtermsmtp
    #
    # major relay host: use the $M mailer to send mail to other domains
    #
    DR HOSTNAME
    CR HOSTNAME

n  ここで、HOSTNAME はローカルホストの名前です(localhost で動くでしょうか?)。 最後のエントリはインターネットメールを転送する O ルールに基づくものです。

    # Pass other valid names up the ladder to our forwarder
    R$*<@$*.$+>$*         $#$M    $@$R $:$1<@$2.$3>$4     user@any.domain

 インターネットホストに TERM コネクションが確立されたら、ローカルマシン上で 次のコマンドを実行してください。

    tredir PORTNUMBER internet.host:25
    /usr/lib/sendmail -q

 ここからは電子メールを TERM を使って受け取る方法に移ります。メールは mailhost というネットワークマシンにあるあなたのアカウントに届けられているとします。最も簡単な解決法は単に trsh か termtelnet で mailhost にログインしてそこでメールを読むことです。しかし、あなたのメールをローカルマシンに自動的にダウンロードさせることも可能なのです。これを実現する方法の一つが Post Office Protocol, (POP)です。POP はまさにこの目的のためにデザインされています:間欠的なネットワークコネクションを持つマシンにメールを配送するためです。POP を使うには、mailhost で POP サーバがインストールされていなくてはなりません。そうなっていれば、POP クライアントを使って数分ごとにメールをダウンロードできます。期待通り、これは tredir で行われます。POP サービスは 110 です(古いプロトコル POP-2 があって、これがポート 109 を使うことに注意してください;この文書では POP の最新版である POP-3 について記述します)。いくつかの POP クライアントが入手可能です。一つは、スクリプト言語 perl によって書かれた pop-perl-1.X で、William Perry によって書かれ、私がメンテナンスしています−− sunsite.unc.edu:/pub/Linux/system/Mail で見つかるでしょう。

 POP を使うために、ローカルポートを mailhost のポート 110 にリダイレクトし、 クライアントにはローカルポートを使ってローカルホストからメールを取得するよう に設定します。例では、mailhost で POP サーバが走っていることを仮定します。 ローカルポート 2110 をリダイレクトし、pop-perl クライアントを起動します:

    $ tredir 2110 mailhost:110
    Redirecting 2110 to mailhost:110
    $ pop
    Username: bill
    Password: <enter your password for mailhost>
    Pop Host: name of local
    Pop Port: 2110
    Starting popmail daemon for bill

 POP サーバが利用できない場合、BCRMailHandler パッケージに TERM リンクを通じ てメールをローカルマシンにダウンロードするプログラムが含まれています。私は 使ったことがありませんが、使ったことのある方のコメントを歓迎します。 term.mailerd+smail パッケージもこの目的に使うことができます。残念ながら、 BCRMailHandler も term.mailerd+smail パッケージも TERM バージョン 2.0.0 以上 ではもう動きません。