PPP for Linux

Michael Callahan, callahan@maths.ox.ac.uk
Al Longyera, longyear@netcom.com

v1.0.1, June 1994

こじまみつひろ

v1.0.1j, May 18, 1995
ppp-2.1.2 に付属の README の和訳

注意: この文書はかなり以前に書かれたものなので、 いまどきの Linux 環境にはあてはまらない箇所があります。 (JF Project)

1. はじめに

2. インストール

3. ネットワークの概説

4. PPP サーバーとの接続

5. テストとトラブルシューティング

6. 追加設定

7. LINUX PPP 0.1.x からの変更点

8. 結論


1. はじめに

1.1 イントロダクション

これは Linux 用の PPP ドライバです。多くの人が使っており、きわめて安定 しているように見えます。このドライバは 'クライアント' -- 例えば Linux マシンを使ってインターネットプロバイダと接続する -- としても使えるし、' サーバー' -- モデムとインターネットにつながったイーサネットを持ってい る Linux マシンを使ってダイアル・イン PPP 接続をする -- としても使えま す。(実際のところ、PPP のプロトコルにはクライアントとサーバーの区別は ありませんが、このように説明した方がわかりやすいでしょう)

PPP プロトコルは 2 つの部分からできています。一つはデータをフレーム化 しパケットに包む部分。もう一つは LCP, IPCP, UPAP, CHAP と呼ばれるプロ トコルの部分で、接続時のオプションをやりとりしたり認証をしたりします。 このパッケージも同様に 2 つの部分から出来ています。一つは PPP の低レベ ルのフレーミングプロトコルを行うカーネルモジュール、もう一つは pppd と 呼ばれるユーザーレベルのプログラムで、 PPP の接続を行うプロトコルを実 装しています。

カーネルモジュールは PPP のフレームを合成/分解し、エラーを検出し、シリ アルポートとカーネルのネットワークコード、あるいはユーザーレベルのプロ グラムである pppd との間でパケットのやり取りを行います。IP パケットは 直接カーネルのネットワークコードに送られますので、pppd はいったん接続 を完成すれば、接続を終了するまで完全な休眠状態に入ります。接続を終了す る時に再度 pppd は目覚めて、接続を正しく終了させます。

1.2 著作権表示

私(MJC)がオリジナルのカーネルドライバを 0 から書きあげました。 Laurence Culhane tol Fred van Kempen の slip.c が貴重なモデルになりま した(私の書いたプログラムを熟読すれば slip.c を真似ている所が多々ある ことがわかるでしょう)。しかしながら、私は pppd に必要な機能を RFC1331 をガイドにして実装しました。Linux 用のドライバは大部分 386BSD や SunOS 用と同じインターフェースを使っています。異なる点は、Linux は非同期 I/O をサポートしていないところです。だから、私は ioctl をハックして、パケッ トが来たら PPP をサポートするカーネルモジュールがシグナルを出すように して、pppd が代りにこのシグナルを使うようにしました。

Al Longyear が pppd のバージョン 2.0.4 を (ppp-2.0.4 のフリーなパッケー ジから)移植しました。彼はまた、カーネルドライバと pppd の OS から独立 している部分について、いくつかの機能強化を行いました。Linux の PPP に 対する彼の貢献はきわめて大なので、このリリースは私たちの連名で行なって います。

pppd プログラムは Paul Mackerras がメンテナンスしている Sun と 386BSD 用のフリーな PPP プログラムから作りました。このパッケージには、以下の 人々への「感謝」が述べられています。

Brad Parker, Greg Christy, Drew D. Perkins, Rick Adams and Chris Torek.

1.3 将来の予定

欠けている主要な機能は、リモートホストへのパケットが生成された時に自動 的に PPP の接続を実行する機能です("デマンド・ダイリング")。この件に関 しては現在も作業中ですが、いくつか瑣末なデザイン上の問題が残っています。

2. インストール

このバージョンの PPP は 1.0.x (x=0..9) と 1.1.x (x=0..14) カーネルでテス トしています。ルーティング回りのコードが変更されているため、これ以前の カーネルではうまく動かないでしょう。もし、古いバージョンのカーネルを使っ ているなら、アップグレードしてください。

2.1 linux-activists の PPP チャンネルへの招待:

これはイントールには直接関係ありませんが、もし Linux PPP をよく使うよ うなら、PPP のメーリングリストへ参加してください。参加するためには、

X-Mn-Admin: join PPP 

と書いたメールを linux-activists-request@niksula.hut.fi に送ります。 メーリングリストへ投稿するには、 linux-activists@niksula.hut.fi へ、本 文の最初に

X-Mn-Key: PPP

と書いて送ります。

このメーリングリストに参加すると、PPP に関するアップグレードやパッチに ついての情報が得られますし、多くの PPP のベテランの経験を聞くことも可 能でしょう。もし問題が起きれば、私自身が診断することもできますが、たい ていの問題は誰かが既に解決済みです。

注意して欲しいのですが、私は Usenet の linux 関連のニュースグループを 定期的に読んでいるわけではないので、必ずしもそこで為される PPP に関す る議論にはついていけません。もし PPP について特に議論したい場合、ぜひ linux-activists の PPP チャンネルに参加してください。

PPP のメーリングリストから抜けるには :-( 、メールの本文に

X-Mn-Admin: leave PPP 

と書いて linux-axtivists-request まで送ってください。

投稿するためには、参加した時のアドレスと正確に同じアドレスを使ってくだ さい。すなわち、アカウント名、ホスト名、システム名が同じでなければなり ません。

2.2 カーネルドライバのインストール:

これは、使っているカーネルのバージョンに依存します。

1.1.14 からは、PPP のサポートは Linux のカーネルに組みこまれました。 PPP を使うかどうかは "make config" の際に Y か N で答えます。

決して、決して、このパッケージのファイルをカーネルのものと入れかえては いけません。カーネルは常にこのパッケージに含まれているファイルよりも新 しいものを使っています。

1.1.13 でも PPP に関するコードはありましたが、confing.in の PPP に関する項目はコメントアウトされていました。もし 1.1.13 を使って いるなら、アップグレードした方がいいでしょう。

1.1.13 以前のカーネルでは (全ての 1.0.x のカーネルも含めて)、長い間、 PPP に関するコードはサポートされていましたが、カーネルの設定の際には隠 してありました。PPP のカーネルドライバを組みこむことは簡単です:

  1. このパッケージに含まれている ppp.cdrivers/net にコピー し、ppp.hinclude/linux にコピーします。
  2. config.inCONFIG_PPP の行のコメントを外します。
  3. もし 1.1.3 以前(1.0.x も含めて)のカーネルを使っているなら: ppp.c/* #define NET02D で始まる行の "/*" を削除して、コメントアウトを外します。
  4. カーネルソースのトップディレクトリ (たいていは /usr/src/linux) から、
    make config
    make dep
    make
    
    を実行します。

新しいカーネルでリブートしてください。起動時に以下のようなメッセージが 出力されるはずです:

PPP: version 0.2.7 (4 channels) NEW_TTY_DRIVERS OPTIMIZE_FLAGS
TCP compression code copyright 1989 Regents of the University of California
PPP line discipline registered.

最初の行の大文字の部分が多少異なっていても気にする必要はありません。

もし 4 チャンネル以上 PPP で使いたい場合、後述する PPP チャンネルを増やしたいを参照してください。

次に、/proc/net/dev の中身を見てみましょう。 こんな風になっているはずです。

Inter-|   Receive                  |  Transmit
 face |packets errs drop fifo frame|packets errs drop fifo colls carrier
    lo:      0    0    0    0    0        0    0    0    0     0    0
  ppp0:      0    0    0    0    0        0    0    0    0     0    0
  ppp1:      0    0    0    0    0        0    0    0    0     0    0
  ppp2:      0    0    0    0    0        0    0    0    0     0    0
  ppp3:      0    0    0    0    0        0    0    0    0     0    0

こうなっていれば、ドライバは正しくインストールされています。

(もちろん、もし何かうまくいかなくても、PPP を使わなければカーネル自体 には問題はありません)

2.3 pppd のインストール:

もし pppd を再コンパイルしたいなら、pppd サブディレクトリへ移動して、

ln -s Makefile.linux Makefile 
make 

とします。lcp.cupap.cchap.c をコンパイル する際にいくつかワーニングメッセージが出るかも知れませんが大丈夫です。

chat も再コンパイルしたい時は、chat のディレクトリにある README.linux をチェックしてください。

インストールするには、chat と pppd それぞれのディレクトリで 'make install' します。こうすれば chat と pppd のバイナリが /usr/etc にインストールされ、pppd.8 のマニュアルは /usr/man/man8 にインストールされます。

pppd はルートの権限で実行しなければいけません。ルートに setuid するか、 ルートになって実行してください。'make install' すれば、 自動的にルートに setuid するようになっています。ユーザーが一人しか いないマシンでは setuid するのが便利ですが、複数のユーザーが使う マシンにインストールする際にはセキュリティ上の問題を十分にチェック してください。

3. ネットワークの概説

多くの人が PPP で初めて Linux のネットワーク回りのコードを使うことにな るので、このセクションではネットワークを利用するために必要なことの概略 を説明します。原理的には、この章で説明することは PPP 独自のものではあ りません。より詳細については、関係する Linux の各種 HOWTO を参照してく ださい。もしネットワーク回りの設定を十分理解しているなら、この章は飛ば して結構です。

まず最初にチェックすべきファイルは、起動時にネットワーク回りの設定を行 なう rc スクリプトです。このファイルは使っている Linux の ディストリビューションによって多少名前は異なっていますが、 /etc/rc.net/etc/rc.d/rc.net.{1,2} のような名前に なっています。このファイルで、ループバックインターフェース lo を 'ifconfig' して、そのインターフェースに 対する経路を設定します。その行はこんな風になっているはずです。

$CONFIG lo 127.0.0.1
$ROUTE add loopback

あるいは

/sbin/ifconfig lo 127.0.0.1
/sbin/route add 127.0.0.1

しかしながら、イーサネットカードやインストールされている他のどんな経路 (route)も設定しては *いけません* (もし実際にイーサネットカードを持って いるのでない限り。もしイーサネットカードを持っているなら、どうすべきか 御存知のことと思います)。多くのディストリビューションがイーサネットを 持っている場合の設定を提供しています。

また、外部からの telnet/ftp/finger を許すかどうかも決めないといけませ ん。もし許すなら、rc の起動スクリプトの中で 'inetd' デーモンを動かします。

次に、/etc/hosts を修正して、次の 2 行を加えます。最初のものは ループバック、すなわち自分自身のローカルホストとしてのアドレスで、 2 つめのものは実際に PPP 接続の際に使うホストネームと IP アドレスです。 例えば、

127.0.0.1  loopback localhost   # useful aliases
192.1.1.17  billpc.whitehouse.gov bill  # my hostname

のようにします。この例では、私の使う IP アドレスは 192.1.1.17 で、私の ホストの名前は billpc.whitehouse.gov となります(もちろん冗談ですよ)。 もしお使いの PPP サーバーが動的な IP アドレスの割り当てに対応している なら、実際に割り当てられる IP アドレスは接続時に決定されることになりま す(後述の " 動的アドレス割り当て" をご覧 ください)。

最後に、/etc/resolv.conf を適切に定義してドメインネーム システムを設定します。/etc/resolv.conf はこんな形になります。

domain whitehouse.gov
nameserver 192.1.2.1
nameserver 192.1.2.10

ネームサーバーを 192.1.2.1 と 192.1.2.10 と仮定すると、PPP で接続した 場合、正式なホスト名は 'hillarypc.whitehouse.gov' や ' chelseapc.whitehouse.gov'といったホストを 'hillarypc' や 'chelseapc' と言う名でアクセスすることができます。適切なドメイン名や使うネームサー バーの IP ナンバーなどは PPP の接続先に問いあわせてください。

4. PPP サーバーとの接続

PPP を使う際には、pppd プログラムを適切なオプションをつけて起動します。 知るべきことすべては pppd(8) のマニュアルページにあります。しかし、い くつかの例を見ておくことは有益でしょう。

4.1 例 1:簡単なダイアルアップ接続

モデムを経由して PPP サーバーに接続する場合、このようなコマンドを使い ます。

pppd connect 'chat -v "" ATDT5551212 CONNECT "" ogin: ppp word: whitewater' \
      /dev/cua1 38400 -detach debug crtscts modem defaultroute 192.1.1.17:

pppd のオプションを順に見てみましょう。

connect 'chat etc...'

このコマンドで PPP サーバーと接続を開始します。 ここで使っている 'chat' というプログラムでリモートのコンピュータに電話 をかけます。'connect' コマンドに一つの引数しかあたえられないため、コマ ンド全体をシングルクォート(')で括る必要があります。'chat' 自身のオプショ ンは、

-v 冗長モード: syslog に記録が残されます
""           : プロンプトを待たずに、、
ATDT 5551212 : モデムにダイアルコマンドを送り、
CONNECT      : 返事を待って、
""           : リターンコードを送り(長さ 0 の文字列と
                通常のリターンコード)、
ogin: ppp word: whitewater ログインします。

/dev/cua1

これはシリアルポートの cua1 を使うことを指示します。

38400

これはボーレートの指定。

-detach

通常、pppd はフォークして自分自身をバックグラウンドで実行しま すが、このオプションをつけるとそうしなくなります。

debug

各種の記録を syslog に残します。

crtscts

コンピュータとモデムの間をハードウェアフローコントロールとしま す (38400 のボーレートではこうしなければいけません)。

modem

モデムデバイスを使うことを指示します;このオプションを指定すると、 pppd は電話の前後で回線をハングアップします。

defaultroute

いったん PPP の接続が確立したら、それをデフォルトの経路 (default route)とします;もし PPP を使って Internet に接続したいとすれ ば、こうすることが目的です。

192.1.1.17:

これは正式なオプションである x.x.x.x:y.y.y.y を省略した形 です。ここで x.x.x.x はローカルか IP アドレスで y.y.y.y が PPP 接続のリモート端の IP アドレスになります。 もしこのオプションが指定されないか、(この例のように)片側だけが 指定されたら、x.x.x.x/etc/hosts にある ローカルマシンのホスト名の IP アドレスを使用し、y.y.y.y の部分はリモートのマシンで決定されます。ですから、ここで述べている 架空のマシン、'billpc' の場合、この指定は実際には冗長なものでした。

pppd はエラーメッセージとデバッグ出力を syslogd デーモンに "local2" と いう名前で出力します(chat を -v オプションで起動した時も同様)。 これらのメッセージはあらかじめコンソールや /usr/adm/messages といったファイルに出力されるようになっているかも知れません; どういう設定になっているかは /etc/syslog.conf ファイルを 見てください。もし pppd と chat のメッセージを全てコンソールに出力 したければ、syslog.conf ファイルに

local2.*                /dev/console

という行を加えます。"local2.*" と "/dev/console" の間に 1 つ以上の TAB コードが必要なことに注意してください。

4.2 例 2:専用線を使って PPP サーバーに接続する場合

これはもう少し複雑な例です。次に示すのが、Morningstar 製の PPP が動い ている Ultrix マシンに直接接続された Gandalf から PPP 接続するために私 が使っているスクリプトです。

pppd connect /etc/ppp/ppp-connect defaultroute noipdefault debug \
      kdebug 2 /dev/cua0 9600

ここで、/etc/ppp/ppp-connect はこんなスクリプトになっています:

#! /bin/sh
/etc/ppp/sendbreak
chat -v -t60 "" \; "service :" blackice ogin: callahan word: PASSWORD \
    black% "stty -echo; ppp" "Starting PPP now"  && sleep 5

まず break 信号を送り、ターミナルサーバーを起動します。次にセミコロン を送って(私の使っているターミナルサーバーではセミコロンでボーレートの 自動選択を行います)、"blackice" というサービスを要求します。 ログインして、"black%" というシェルのプロンプトが出るのを待ち、 PPP を起動します。-t60 という引数はタイムアウトまで 1 分間 かける、という意味です。時々、このシステムはきわめて遅くなることがあるので。

"&& sleep5" でスクリプトは 5 秒間停止しますが、 それでも chat が失敗した場合、即座に終了します。 こうして PPP サーバーに起動する時間を与えて います(とても遅いので)。また、"stty -echo" というオプション は私にとってきわめて重要な意味をもっています;このオプションをつけないと、 リモートの PPP サーバーがエコーをオフにする以前に、手元の pppd がネゴシエー ション用のパケットを送ってしまうことがたまにあるからです。リモートの PPP サーバーがエコーをオフにしていない状態でネゴシエーション・パケット を送ると、パケットはそのまま手元のマシンに帰ってきてしまい、拒否されて しまいます(PPP はループバックを検出できます)。そして、リモートの PPP の準備ができる前に手元の pppd はエラー終了してしまいます。" stty -echo" オプションはこれを防ぎます。この種の問題は、遅い Unix マシンを PPP サー バーにしているごく僅かの人々にしか起らないことでしょうが、原因を究明す るまでに時間もかかったので、あえてここで言及しておきました。

その他の pppd のオプションはよく似たものです。"noipdefault" と "kdebug 2" というオプションが新しいものでしょうか。" noipdefault" オプションを指定すると、pppd は使うべき IP アドレスをリモート側に問いあわせます; 私の場合のように、PPP サーバーに IP アドレスの動的割り当て機能がある場 合、このオプションが必要となります(すなわち、事前にどのアドレスになる かはわからない)。"kdebug 2 "というオプションは、カーネルのデバッグレベ ルを 2 に設定するもので、カーネル内の ppp に関するコードからの出力が多 少詳しくなります。

いずれにせよ、接続がちゃんとできたとすれば、chat がモデムに電話をかけ させ、 pppd からいくつかのメッセージが出力され(syslog.conf の 設定に応じて)、その後、こんなカーネルからのメッセージが出力されるはずです。

ppp: channel ppp0 mtu changed to 1500
ppp: channel ppp0 open
ppp: channel ppp0 going up for IP packets!

(このメッセージは "kdebug 2" オプションを付け、kern.info メッセージが直接スクリーンに出力されるような設定になって いる場合にのみ表示されます) 同時に、pppd は関係するメッセージを /usr/adm/messages (syslong.conf の 設定によっては別のログファイルかも知れません)に出力します。

5. テストとトラブルシューティング

5.1 うまくいったなら、、

うまく接続できたようなら、テストする方法はいっぱいあります。

まず第一に、

/sbin/ifconfig 

とタイプします(もしかすると、使っているシステムによっては ifconfig/sbin 以外の場所にあるかも知れません)。このコマンドは ' UP' の 状態にある全てのネットワークインターフェースを表示します。 ppp0 がその中にある はずで、最初に示された IP アドレスがあなた自身のもの、" POINT-TO-POINT ADDR"で示されているのがサーバーのアドレスです。 私のマシンではこんな風になります。

lo        Link encap Local Loopback  
          inet addr 127.0.0.1  Bcast 127.255.255.255  Mask 255.0.0.0
          UP LOOPBACK RUNNING  MTU 2000  Metric 1
          RX packets 0 errors 0 dropped 0 overrun 0
          TX packets 0 errors 0 dropped 0 overrun 0

ppp0      Link encap Point-Point Protocol
          inet addr 192.76.32.2  P-t-P 129.67.1.165  Mask 255.255.255.0
          UP POINTOPOINT RUNNING  MTU 1500  Metric 1
          RX packets 33 errors 0 dropped 0 overrun 0
          TX packets 42 errors 0 dropped 0 overrun 0

次に

ping z.z.z.z

とします。ここで、z.z.z.z は使っているサーバーのアドレスです。 これは大丈夫なはずです。私の場合、こんな風になりました。

waddington:~$ ping 129.67.1.165
PING 129.67.1.165 (129.67.1.165): 56 data bytes
64 bytes from 129.67.1.165: icmp_seq=0 ttl=255 time=268 ms
64 bytes from 129.67.1.165: icmp_seq=1 ttl=255 time=247 ms
64 bytes from 129.67.1.165: icmp_seq=2 ttl=255 time=266 ms
^C
--- 129.67.1.165 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 247/260/268 ms
waddington:~$

次に

netstat -nr

とします。こうすれば、こんな風に 3 つの経路が示されるはずです。

Kernel routing table
Destination     Gateway         Genmask         Flags Metric Ref Use    Iface
129.67.1.165    0.0.0.0         255.255.255.255 UH    0      0        6 ppp0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         129.67.1.165    0.0.0.0         UG    0      0     6298 ppp0

こういう風になっていても、Destination 欄に 0.0.0.0 という行が見えない 場合(この行が接続時のデフォルトの経路となります)、pppd に ' defaultroute' オプションをつけていない可能性があります。

ここまで確認できれば、telent/ftp/finger 等、何でも好きなものを使ってみ てください。しかし、/etc/resolv.conf を正しく設定していない場合、 (ホスト名やドメイン名ではなく)、相手の指定は数字の IP アドレスを使わなけれ ばならないことに注意してください。

5.2 ダメだったら、、

linux サブディレクトリによくある問題についての短い FAQ を用意しました。

もし接続でいないようなら、pppd からの 'debug' 情報をチェック してください。このためには pppd を 'debug' オプション付きで 起動して、/etc/syslog.conf ファイルに

local2.*                                        /dev/console
local2.*                                        /usr/adm/ppplog

と書いておく必要があります。

こうしておけば、pppd のメッセージが今使っているコンソールと /usr/adm/ppplog の双方に出力されます。左の欄("local2.*") と右の欄 ("/dev/console", "/usr/adm/ppplog") の間には一つ 以上の TAB コードが入っていないといけません。/etc/syslog.conf を 修正したら、syslogd のプロセスナンバーを指定して、'kill -HUP <syslogd の pid>' を実行し、現在動い ている syslogd に設定ファイルを読みこませます。

そうすると、以下のようなメッセージが表示されるはずです。

もし "recv" メッセージが出ない場合、接続そのものに重大な 問題が生じています(例えば 8 ビット全てを正しく通していないとか)。 その場合、あなたのコンピュータとリモート側の PPP サーバーとの間を通過 した全てのデータをデバッグ・ログファイルに書きだしておくのが解決に 役立ちます。こうするためには、syslog.conf ファイルに

local2.*,kern.*                         /dev/console
local2.*,kern.*                         /usr/adm/ppplog

と書き、上と同じように syslog デーモンに HUP シグナルを 送ります。そして、pppd を "kdebug 5" オプションをつけて 起動すれば PPP の接続線上を流れた全てのキャラクターがデバッグ出力 に書きだされます。

時おり、こんなメッセージが出ることもあります。

ppp_toss: tossing frame, reason = 4

このメッセージはシリアル回線のオーバーランのため、PPP コードがリモート サーバーからのパケット("フレーム")を捨てていることを意味します。このメッ セージが出る場合、あなたのコンピュータの CPU は能力不足で、シリアルポー トにキャラクタが届いてから読み出しまでに時間がかかっています;最善の解 決法はシリアルポートに 16550A チップを使うことです。このチップは内部バッ ファを持っており、CPU に読み出すための時間的余裕を与えます。" reason =4" 以外の場合は、起るべきではないシリアル回りのエラーが 起きていることを意味しています。

接続の最初の段階では、"bad fcs" というメッセージが何度か出る かも知れません。これは受けとった PPP フレームのチェックサム・エラーを 意味しています。これが起きるのは、たいてい、接続の開始時にリモート側の システムが何か "テキスト" メッセージ、例えば " hello this is the XYZ company" を 送っている場合です。いったん接続が確立し、経路制御も完了した後に " bad fcs" というメッセージが出るのは正常なことではなく、 伝送時のエラーか電話線のノイズを意味します。

5.3 それでもダメなら、、(バグレポート)

これでもまだ動かなければ、linux-activists の PPP チャンネルにバグレポー トを送ってください。可能な限り多くの情報が入っていることが肝要です。必 要な情報の例として、

6. 追加設定

6.1 動的アドレス割り当て

Linux の PPP は接続するたびに異なる IP アドレスが割り当てられる PPP サー バーとも接続することができます。 IP アドレスを割りあててもらうようにリ モートホストへリクエストを出すには 'noipdefault' オプションを 使います。

Linux のクライアント(例えば "talk" など)を使った場合、" Cannot assign requested address" というエラーメッセージが出る ことがあります。これは /etc/hosts に記述してある自分自身の IP アドレスと PPP インターフェース に割り当てられた IP アドレスが異なるからです。解決法は、 ifconfig ppp0 として使っているインターフェースのアドレスを チェックし、/etc/hosts を修正してそれに合わせることです。

6.2 PPP 接続を受ける側のセットアップ

他のマシンからあなたのマシンを呼びだし PPP 接続をしたい、というわけで すね。これも Linux PPP では可能です。

まず第一に、あなたの Linux マシンがシリアルラインからの呼出しに正しく 答えて、ログイン・プロンプトを出しているか確認してください。確認するため には、あなたのマシンへ電話をかけて、普通のユーザーとしてログインし、シェ ルプロンプトがちゃんと出て、各種コマンドが正しく使えるかチェックしてく ださい。この文書では Linux マシンを、かかってきた電話に答えるようにセッ トアップする方法については扱いません。それらについては、システムに附属 の文書、あるいは Serial HOWTO ( 日本語訳) を参照してください。

次に、PPP サービスを提供できるようにします。一つの方法は、例えば ' ppp' というアカウント名を作り、ログイン時に起動されるシェルを pppd を起動するための短いスクリプトにすることです。この方法を取る場合、 /etc/passwd にこんなエントリを追加することになります。

ppp:(encrypted password):102:50:PPP client login:/tmp:/etc/ppp/ppplogin

起動している /etc/ppp/ppplogin はこんな実行可能な シェルスクリプトです。

#!/bin/sh
exec /usr/etc/pppd passive :192.1.2.23

[訳注:モデム経由で使うなら modem オプションを付けないと正しく hang up しないことがあります。]

この設定では、リモートのマシン(接続してくるマシン)の IP アドレスは 192.1.2.23 で、PPP インターフェースを使うローカルの(ホスト側の) IP アドレスは /etc/hosts に書いてあるマシン名に対応した IP アドレスになります。'passive' オプションをつけると (必須ではないのですが)、pppd は起動 時にネゴシエートしようとして、返事が無い場合はそのまま黙って待ち状態に なります。リモート側のマシンがネゴシエートの準備ができるまでに多少の時 間がかかる場合、このオプションを使うといいでしょう('passive' オプションは ppp-1.3 と ppp-2.0 の間で変更されていることに注意)

2 台のマシンを接続するだけならこのセットアップで十分ですが、もし Linux PPP を使って外部のマシンをネットワークと接続する場合、あるいは 2 つの ネットワークを接続するような場合には、ネットワークから PPP 接続へパケッ トを送る経路情報を設定しなければなりません。ネットワーク間の接続につい ての設定はこの文書の範囲外です;pppd の経路制御に関するオプションにつ いて、マニュアルページを詳しく読んで、routed などに関する記述を見つけ てください。

ここでは最初の場合のみを考えます。イーサネットに接続された Linux マシ ンがあって、それに PPP で外部から接続して、イーサネット上のマシンと通 信する、と仮定しましょう。このためには、リモートのマシンにローカルなイー サネットセグメント上のマシンと同じ IP アドレスを与えて、サーバーとして 使う pppd に 'proxyarp' オプションをつける必要があります。 ここでは、以下のような接続を考えてみます:

 192.1.2.23                        192.1.2.17
+-----------+      PPP link       +----------+
| chelseapc | ------------------- |  billpc  |
+-----------+                     +----------+
                                        |           Ethernet 
                            ----------------------------------- 192.1.2.x

この場合、billpc の PPP インタフェースとイーサネットインタフェースは同 じ IP アドレス 192.1.2.17 を持っています(一台のマシンで一つ、あるいは 複数の PPP インタフェースがイーサネット・インタフェースと同じ IP アド レスを持つことは可能です)。billpc の /etc/passwd ファイルには chelseapc が /etc/ppp/ppplogin スクリプトを起動できるような設定 があります。/etc/ppp/ppplogin スクリプトはこうなっています。

#!/bin/sh
exec /usr/etc/pppd passive proxyarp :192.1.2.23

接続が開始されると、pppd は chelseapc へのエントリを billpc の arp テー ブルに "proxy arp" として追加します。こうすれば、192.1.2.x の イーサネット上のマシンに対して、billpc (192.1.2.17) のイーサネット・ インターフェースが chelseapc (192.1.2.23) でもあるかのようにふるまいます。 こうすることで、chelseapc があたかも直接にイーサネットに接続されたマシン のように通信することが可能になります。

6.3 PPP チャンネルを増したい

デフォルトでは Linux PPP は 4 つのカーネルチャンネルを使うようになって ます。すなわち、同時に最大 4 つの PPP セッションが可能、ということです。 もし、もっと多くのセッションが必要なら(例えば、多くのダイアル回線にサー ビスを提供する、など)、カーネルのソースコードを修正して、新しくチャン ネルを追加することができます。これには 2 つのステップがあります。

第一に、drivers/net/Space.c のファイルを修正します。 配布されている状態では、このような部分があるはずです。

#if defined(CONFIG_PPP)
extern int ppp_init(struct device *);
static struct device ppp3_dev = {
    "ppp3", 0x0, 0x0, 0x0, 0x0, 3, 0, 0, 0, 0, NEXT_DEV,  ppp_init, };
static struct device ppp2_dev = {
    "ppp2", 0x0, 0x0, 0x0, 0x0, 2, 0, 0, 0, 0, &ppp3_dev, ppp_init, };
static struct device ppp1_dev = {
    "ppp1", 0x0, 0x0, 0x0, 0x0, 1, 0, 0, 0, 0, &ppp2_dev, ppp_init, };
static struct device ppp0_dev = {
    "ppp0", 0x0, 0x0, 0x0, 0x0, 0, 0, 0, 0, 0, &ppp1_dev, ppp_init, };
#undef NEXT_DEV
#define NEXT_DEV (&ppp0_dev)
#endif   /* PPP */

パターンは明解ですね。チャンネルを追加するには、" static struct device pppN_dev" 行を追加して、構造体の最初 (ppp[0,1,2]と 11 番目の要素 (&ppp[1,2,3]_dev) を適切に設定します。 PPP デバイスの最後のものの 11 番目の要素が NEXT_DEV になる ことに注意してください。それ以外のデバイスで は、&ppp3_dev&ppp4_dev などに変更します。

例として、2 チャンネル追加してみましょう。

#if defined(CONFIG_PPP)
extern int ppp_init(struct device *);
static struct device ppp5_dev = {
    "ppp5", 0x0, 0x0, 0x0, 0x0, 5, 0, 0, 0, 0, NEXT_DEV,  ppp_init, };
static struct device ppp4_dev = {
    "ppp4", 0x0, 0x0, 0x0, 0x0, 4, 0, 0, 0, 0, &ppp5_dev,  ppp_init, };
static struct device ppp3_dev = {
    "ppp3", 0x0, 0x0, 0x0, 0x0, 3, 0, 0, 0, 0, &ppp4_dev,  ppp_init, };
... etc.

次に (include/linux ディレクトリにある) ppp.h ファイルの以下の行を

#define PPP_NRUNIT     4

追加したチャンネル数にあわせて変更します。今回の例では

#define PPP_NRUNIT     6

となります。

これで、カーネルを再コンパイルしリブートします。起動時のメッセージと /proc/net/dev が変更した数を正しく示していることを 確認してください。

7. LINUX PPP 0.1.x からの変更点

Linux PPP 0.1.x はフリーに配布されている PPP パッケージの PPP-1.3 を元 にしています。一方、Linux PPP 0.2.1 は PPP-2.0.4 を元にしています。両 者の間では pppd のオプションに多少の変更が行なわれ、各種の機能強化がな されています。変更点についての詳細は pppd ディレクトリにある "RELNOTES" を参照してください。

また、PPP-1.3 の Linux バージョンに追加されたオプションのいくつかは名 前が変更されています。

それぞれ変更されました。

加えて、ローカルの IP アドレスをリモートの PPP サーバーからもらう場合 には 'noipdefault' オプションが必要になりました。

8. 結論

Good luck!

Michael

-----------------------------------------------------------------------
小島三弘(kojima@komae.denken.or.jp, isle@st.rim.or.jp)
〒 201 東京都 狛江市 岩戸北 2-11-1
(財)電力中央研究所 ヒューマンファクター研究センター
Tel:(03)-3480-2111(ex.649), FAX:(03)-3430-5779
-----------------------------------------------------------------------

(sgml conversion, y.senda, ysenda@pop01.odn.ne.jp, 2001/09)