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. はじめに 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.c を drivers/net にコピーし、ppp.h は include/linux にコピーします。 2. config.in の CONFIG_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.c や upap.c、chap.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 に設定ファイルを読みこませます。 そうすると、以下のようなメッセージが表示されるはずです。 o "pppd[NNN]: Connected..." "connect" スクリプトが正しく終了しました。 o "pppd[NNN]: sent [LCP ConfReq"... pppd はリモート側とネゴシエーションを開始しました。 o "pppd[NNN]: recv [LCP ConfReq"... pppd はリモート側からネゴシエーション用のフレームを受信しました。 o "pppd[NNN]: ipcp up" IP トラフィックを通すための接続が確立したと pppd は解釈しました もし "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 チャンネルにバグレ ポートを送ってください。可能な限り多くの情報が入っていることが肝要で す。必要な情報の例として、 o 使っているカーネルのバージョン o 使っている Linux PPP のバージョン o PPP セッションを開始するのに使っているコマンド o syslog.conf ファイルに local2.*, kern.* を指定して得られた 'debug' 出力 o 接続先の PPP の種類(例えば Xyzzy Corp のターミナルサーバー、モーニ ングスター製の PPP ソフト、などなど) o 接続形態(モデム、専用線、などなど) 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 バージョンに追加されたオプションのいくつかは名 前が変更されています。 o defroute は defaultroute に o kerndebug は kdebug に o dropdtr は modem に、 それぞれ変更されました。 加えて、ローカルの 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)