Linux PPP HOWTO <author>Robert Hart, <tt/hartr@hedland.edu.au/ <date>v2.2, 25 August 1996 <trans>こじまみつひろ <tt>isle@st.rim.or.jp</tt> (1997/01/30) <abstract> この文書では Linux PC を PPP サーバに接続する方法、2 つのネットワーク を PPP でつなぐ方法、あなたの Linux マシンを PPP サーバにする方法につ いて説明します。 </abstract> <!-- Table of contents --> <toc> <p> <bf>Copyright</bf> <p> The copyright of this document is retained by the author. Permission is granted to distribute the document by electronic means and on CDs provided that it is kept entirely in its original format. Permission is also granted to print a copy of this document for personal use. <p> The republishing of this document in part or in whole without the permission of the copyright holder by any means other than as noted above is prohibited. この文書の著作権は著者が保持しています。この著作権表示がそのまま残され る限り、どのような電気的な方法でも、あるいは CD を用いた再配布も許可し ます。また、個人な使用ならばこの文書をプリントアウトすることも認めます。 <p> 上記以外の方法によるこの文書の一部、あるいは全体の再配布は、著者が許可 しない限り禁止します。 <p> <bf>配布</bf> <p> この文書はバージョンが新しくなるごとにcomp.os.linux.answersに投稿され ます。また、以下のURLからHTML版も入手可能です。 <itemize> <item><url url="http://sunsite.unc.edu/mdw/linux.html#howto" name="Linux Howto Index"> </itemize> <p> その他のフォーマット(SGML、ASCII、postscript、DVI)も <url url="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/other-formats" name="Howtos - other formats">から入手できます。 <p> sunsite.unc.edu はつねに高負荷状態になっていますのでお近くのミラーサイ ト(例えばftp.hitachi.co.jp)をご利用ください。 <p> <bf>謝辞</bf> <p> この文書を準備するために多くの人々が助けてくれました。特に PPP そのも のについて教えてくれた Al Longyear(もちろん、この文書に間違いがあれば、 それは私の責任です)、Linux Howto のメンテナンス担当の Greg Hankins、 linuxdoc-sgml パッケージの設定を助けてくれた Daniel Berinson(締切に 3 日しかなかった時に)、文書のスタイルや内容、順序、論理、説明の明確さに ついて多くの助言を与えてくれた Debi Tackett(MaximumAccess.com)に感謝し ます。 <p> 私に e-mail でさまざまなコメントをくださった多くの方々にも感謝します。 他の HOWTO の著者同様、この文書が手助けとなった人々から感謝されること が我々の唯一の報酬であり、それで十分なのです。この文書を書くことで、私 を含めた全ての Linux ユーザーが負っている、私たちの大好きな OS を作り、 メンテナンスしてくれている人々に対する借りを少しでも返すことができれば、 と思っています。 <sect>イントロダクション <p> PPP(Point to Point Protocol)はシリアル接続上に IP(Internet Protocol)や その他のネットワークプロトコルを構築し、稼働させるための仕組みです。 PPP はヌルモデム経由の直結したシリアル接続や telnet 上、あるいはモデム と電話回線を経由した接続の上でも張ることが可能です。PPP を使えばあなた の Linux PC を PPP サーバに接続し、そのサーバが接続しているネットワー ク資源にあたかも(ほとんど)直接そのネットワークに接続しているかのように 使うことが可能になります。 <p> また、あなたの Linux PC を PPP サーバとして設定すれば、他のコンピュー タから電話回線経由で接続し、あなたの Linux PC と/あるいは、ネットワー クにアクセスすることが可能です。 <p> PPP は一対一の通信方式ですが、PPP を使って 2 台の Linux PC をつないで、 2 つのネットワークを接続すること(あるいはローカルネットワークをインター ネットに接続すること)も可能です。 <p> PPP とイーサネット接続の大きな違いの一つはスピードです。標準的なイーサ ネット接続の理論的な最大転送速度は 10Mbps(一秒あたり百万ビット)ですが、 PPP の場合、最速のモデムでも 33.6kbps(1 秒あたり 1000 ビット)です。ま た、PPP 接続の形態によっては使えるアプリケーションやサービスに制限 が生じることもあります。 <sect1>クライアントと使えるサービス <p> PPP は厳密な一対一のプロトコルです;すなわち、(技術的には)電話をかける 側のマシンと受ける側のマシンに違いはありません。しかしながら、話を分り やすくするために<bf>サーバ</bf>と<bf>クライアント</bf>という区別を付け て使うことにします。 <p> 電話をかけて PPP 接続を確立する側のサイトを<bf>クライアント</bf>と呼び、 接続先のマシンを<bf>サーバ</bf>と呼ぶことにします。 <p> 電話を受けて PPP 接続を用意する側の Linux マシンを設定する場合、PPP <bf>サーバ</bf>を設定しているわけです。 <p> 全ての Linux PC は PPP のサーバにもクライアントにもなれます。複数のシ リアルポート(と必要ならばモデム)があれば、一台のマシンがサーバとクライ アントに同時になることも可能です。上述のように、PPP 接続が成立してしま えばクライアントとサーバの間には何の違いもありません。 <p> この文書では電話をかける側のマシンを<bf>クライアント</bf>とし、電話を 受けて、(ユーザー ID やパスワード、あるいはその他の仕組みで)ユーザー認 証をする側のマシンを<bf>クライアント</bf>と呼ぶことにします。 <p> ほとんどの人は、PPP をクライアント側で使い、インターネットに接続してい るマシンに接続することに興味をお持ちでしょう。その場合、彼らは PC をク ライアントとして使っているわけです。 <p> この文書に説明している手順に従えば、インターネットに自動的に接続するこ とも可能になります。 <p> 加えて、Linux PC を PPP<bf>サーバ</bf>として設定する方法について解説し、 PPP を使って 2 つの LAN を(完全なルーティングで)接続する方法についても 説明します(これは WAN - Wide Area Network - 接続でよく見られる方法です)。 <sect1> ディストリビューションごとの違い <p> 世の中にはさまざまな Linux のディストリビューションがあり、それぞれに 独自の方法を持っています。 <p> Linux(Unix) マシンを起動する際の設定方法と各種のインターフェイスの設定 方法には、大きく 2 つの方法があります。 <p> 一つは<bf>BSD スタイルの起動方法</bf>であり、もう一つは<bf>System V ス タイルの起動方法</bf>です。いくつかの Unix に関したニュースグループを ご覧になった方ならば、両者の間に時として起こる聖戦を見聞きしたこともあ るでしょう。その種の議論に興味があれば参加してみることも面白いかも知れ ません。 <p> 多分 Linux でもっとも広く使われているディストリビューションのうち、 <itemize> <item>Slackware<newline> は BSD スタイルの起動方法を採用しており、 <item>Red Hat (とそれに由来する Caldera)<newline> は SysV スタイルの起動方法を採用しています。 </itemize> <p> BSD スタイルの起動方法では、起動用のファイルは <tt>/etc/...</tt> にあ り、以下のようなファイルになっています。 <code> /etc/rc /etc/rc.local /etc/rc.serial </code> <p> System V スタイルの起動方法では、起動用のファイルは <tt>/etc/rc.d/...</tt> にあり、多くのサブディレクトリが用意されていま す。 <code> drwxr-xr-x 2 root root 1024 Jul 6 15:12 init.d -rwxr-xr-x 1 root root 1776 Feb 9 05:01 rc -rwxr-xr-x 1 root root 820 Jan 2 1996 rc.local -rwxr-xr-x 1 root root 2567 Jul 5 20:30 rc.sysinit drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc0.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc1.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc2.d drwxr-xr-x 2 root root 1024 Jul 18 18:07 rc3.d drwxr-xr-x 2 root root 1024 May 27 1995 rc4.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc5.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc6.d </code> <p> イーサネットインターフェイスやそれに関連するネットワークの経路制御がど のように設定されているかを調べるには、これらのファイルをチェックして、 実際にそれらを行なっているコマンドを見付ける必要があります。 <p> いくつかの例では(例えば Red Hat と Caldera) X ウィンドウベースの PPP 設定ツールが付属している場合があります。しかしながら、この HOWTO では、 そのような特定のディストリビューションに依存したツールの説明はしません。 それらのツールで問題が生じた場合は、ディストリビューションの作成元に直 接尋ねてください。 <sect> IP 番号 <p> インターネットに接続する全てのデバイスは独自の IP 番号を持っていなけれ ばなりません。IP 番号を管理するための組織は各国ごとに設置されています。 <p> LAN を経由してインターネットに接続する場合、あらかじめその LAN 用に割 り当てられた IP 番号の中から、LAN に接続している全てのコンピュータとデ バイスの IP アドレスを設定しなければ<bf>いけません</bf>。勝手に捏造し た IP 番号を使って LAN (インターネットは言うまでもなく)に接続しては <bf>いけません</bf>。最悪の場合、単に動かないだけでなく、あなたの「盗 んだ」 IP 番号が、既にその番号を使っているコンピュータの通信と干渉して 大混乱をもたらす可能性すらあります。 <p> この文書の中で使う IP 番号は(いくつかの例外を除いて)、インターネットに 接続しないネットワーク用にあらかじめ用意されている番号の中から選んでい ることに注意してください。 <p> インターネットに接続していない LAN 用に用意された IP 番号は以下の通り です。 <itemize> <item> Class A のアドレス 1 つ<newline> 10.0.0.0 - 10.255.255.255 <item>Class B のアドレス 16 <newline> 172.16.0.0 - 172.31.255.255 <item>Class C のアドレス 256 <newline> 192.168.0.0 - 192.168.255.255 </itemize> <p> あなたの国の IP 番号の管理組織から IP 番号を<bf>割当ててもらっていない </bf> (閉じた)LAN には、上の IP 番号の中から一連の番号を割りあてて使っ てください。 <p> これらの IP 番号はインターネットに接続しているデバイスには<bf>決して </bf>使ってはいけません。しかしながら、インターネットに接続しているマ シンのローカルなイーサネットインターフェイスに割当てることは可能です。 なぜなら、IP 番号というのは実際にはネットワークインターフェイスに付け るものであり、コンピュータに付けるものではないからです。ですから、イー サネットインターフェイスが (例えば)10.0.0.1 であっても、PPP を使ってイ ンターネットに接続する場合、PPP インターフェイスに別の(有効な) IP 番号 をサーバから割り当ててもらえば、PPP 経由でインターネットに接続すること は可能です。この場合、あなたのマシンからはインターネットに接続できます が、LAN に接続した他のコンピュータからは接続できません。 <p> しかしながら、Linux と ipfwadm ソフトの IP masquerade 機能を使えば、 LAN に接続した他のマシンからもインターネットに接続することが可能になり ます(使えるサービスに多少の制限はありますが)。 <p> masquerade 機能の詳細については IP Masquerade mini-HOWTO(<url url="http://sunsite.unc.edu/mdw/HOWTO/mini/IP-Masquerade" name="Linux IP Masquerade mini HOWTO"> をご覧ください。 <p> 「一台のマシンを PPP を使ってプロバイダ経由でインターネットに接続した い」というほとんどの一般ユーザーにとっては、IP 番号(より正確にはネット ワーク番号)を公式に割りあててもらう必要はありません。 <p> 小規模の LAN をインターネットに接続したい場合、多くのインターネット接 続サービスプロバイダ(ISP)が、あらかじめ用意してある IP 番号の中から専 用のサブネット(IP 番号の特定の組)を割り当てるサービスを用意しています。 <p> 一台の PC を ISP 経由でインターネットに接続したいユーザに対して、ほと んどの ISP は<bf>動的な</bf> IP 番号の割り当てを行なっています。すなわ ち、接続した際に ISP から、その接続の際にのみ有効な IP 番号をあなたの PPP インターフェイスに割り当てる、という仕組みです。 <p> <!-- With dynamic IP numbers, you are <bf/not/ given the same IP number each time you connect. This has implications for server type applications on your Linux machine such as sendmail, ftpd, httpd and so forth. The limitations of service due to dynamic IP number assignment (and ways to work around these, where possible) are discussed later in the document. --> 動的な IP 番号の割り当て機能の場合、割り当てられる IP 番号は接続するた びに<bf>異なり</bf>ます。この場合、サーバタイプのアプリケーション、す なわち sendmail や ftpd、httpd などはうまく使えません。動的な IP 番号 の割り当てによる制限について(と可能な範囲でその制限をくぐりぬける方法 について)は後述します。 <sect> この文書の目的 <sect1> PPP クライアントを設定する <p> この文書では Linux と PPP を使って PPP サーバに接続し、PPP を使った IP 接続を張りたい人向けに解説をします。以下ではカーネルの再構築時に PPP ドライバがコンパイルされ、あなたの Linux マシンに PPP ドライバがインス トールされているものとします(ただし、PPP ドライバを使うためのカーネル の設定/コンパイルの方法についても簡単に説明します) <sect2> DIP は使わずに CHAT を使う <p> DIP(SLIP 接続を張るための基本的な方法です)を使って PPP 接続をすること も可能ですが、DIP スクリプトは概してきわめて複雑なので、この文書の中で は DIP を使って PPP 接続を張る方法については説明しません。 <p> その代り、この文書では Linux PPP が採用している一般的な chat/pppd を使 う方法を説明します。 <sect1> PPP サーバの設定 <p> この文書はあなたの Linux マシンを PPP サーバ(他の人があなたの Linux マ シンに電話をかけてきて PPP 接続を張ることを許可する場合)として設定する 方法についても説明します。 <p> Linux マシンを PPP サーバとして設定する方法は何通りもあります。この文 書では(今のところ)そのうちの一つの方法のみを説明します。この方法は著者 が複数の小規模な PPP サーバを設定するために使ったものです(それぞれ 16 のモデムをつなぎました) <p> この方法はうまく行くはずですが、必ずしも最善の方法ではありません。もし 誰かもっと簡単明瞭な PPP サーバの設定方法を御存知でしたら、ぜひこの文 書の著者に e-mail で教えてください。 <sect1> 2 つの LAN、あるいは LAN とインターネットを PPP で接続する方法 <p> この文書では PPP を使って 2 つの LAN を接続したり、LAN をインターネッ トに接続する方法について、基本的な情報を提供します。 <sect1>この文書が扱わない問題、、 <p> <itemize> <item>モデムを Linux マシンに接続し設定する方法(の詳細)<newline> Serial-HOWTOを御覧ください。 <item>DIP を使って PPP 接続を張る方法<newline> 代りに chat を使います。 <item> socks や IP masquerade の使い方<newline> これらについてはとてもよい文書が既に用意されています。 </itemize> <sect>この文書で扱うソフトウェアのバージョン <p> この HOWTO では Linux 1.2.x と PPP 2.1.2 の組み合わせ、あるいは Linux 1.3.x/2.0 と PPP 2.2 の組み合わせを前提にしています。 <p> PPP 2.2.0 を 1.2.13 カーネルと組み合わせることも可能ですが、そのために はカーネルにパッチをあてる必要があります。この文書はこのような組み合わ せについては<bf>説明しません</bf>。 <p> また、Linux 2.0.X シリーズのカーネルで PPP 2.1.2 を使うことはできない ことに注意してください。 <p> この文書は 2.0.x の新機能である実行時ロード可能モジュールに関わる問題 については<bf>説明しません</bf>。詳細については kerneld mini-HOWTO と 2.0.x に付属のカーネルモジュールに関する文書を読んでください(Linux 2.0.x の ソースツリーでは <tt>/usr/src/linux/Documentation/..</tt>以下 のディレクトリに関連文書がまとめられています)。 <p> <bf>この文書は新しいユーザを助けることも意図して書いていますので、安定し ていることがよく知られている適切なバージョンの Linux と PPP を使うこと を強くお薦めします。</bf> <sect>その他の有用/重要な文書 <p> 以下の文書にも目を通されることをお勧めします。 <itemize> <item>PPP 付属のドキュメント<newline> (<tt>/usr/doc.. 以下のディレクトリをご欄ください)</tt> <item>pppd と chat のマニュアルページ<newline> (<tt>man chat</tt>、<tt>man pppd</tt> すれば表示されます) <item> Linux Network Administration Guide (NAG) <newline> on line 版は<url url="http://sunsite.unc.edu/mdw/LDP-books/nag-1.0/nag.html" name="The Network Administrators' Guide">から入手できます。 <item> NET-2/3 HOWTO<newline> <url url="http://sunsite.unc.edu/mdw/HOWTO/NET-2-HOWTO.html" name="Linux NET-2/3-HOWTO"> <item> /usr/src/linux/Documentation 以下にあるカーネルに関する文書類 <item> O'Reilly から出版されている Unix/Linux に関する優れた書籍。 (<url url="http://www.ora.com/" name="オンラインのカタログ">)もありま す。Unix/Linux について初心者ならば、近くの書店まで<bf>走っていって </bf>(歩いてはダメ)何冊かを入手してください。 </itemize> <p> Linux の文書類については、<url url="http://sunsite.unc.edu/mdw/" name="The Linux Documentation Project Home Page">から初めるのがいいで しょう。[日本語に翻訳された文書は<url url="http://jf.gee.kyoto-u.ac.jp/JF/" name="JFの部屋">から辿れます。] <p> この文書だけでも PPP 接続を使うことは可能なはずですが、上記の文書に目 を通せば実際に中で何が行なわれているかをより詳しく理解することができま す。また、何が問題になっているかを知るのにも役立つでしょう(少なくとも comp.os.linux... 以下のニュースグループでずっと賢く質問できるはずです)。 <p> 上記の文書では(関連 RFC なども含め)この HOWTO では不可能な、より詳しい 情報が紹介され、詳細な解説がなされています。 <p> PPP を使って LAN をインターネットに接続する場合、TCP/IP ネットワークに ついての知識も必要になります。上記の文書の他に、O'Reilly の <tt>&dquot;</tt>TCP/IP Network Administration<tt>&dquot;</tt>や <tt>&dquot;</tt>Building Internet Firewalls<tt>&dquot;</tt>が役に立つ でしょう。 <sect1> 有用な Linux 関連のメーリングリスト <p> Linux に関する情報交換のためのメーリングリストはさまざまのレベルのもの があります。これらには興味深い問題も議論され、講読すれば経験が深まるこ とでしょう。 <p> 賢者への一言:いくつかのメーリングリストは上級者向けや特定の話題向けに なっています。それらのメーリングリストに入っても、ROM しているうちは誰 も文句を言いませんが、不適切なメーリングリストに「初心者の」質問をする と、かなり手厳しいコメント(フレームには至らなくても)を受けることでしょ う。といっても guru level のユーザが「初心者の」質問を嫌っているわけで はなく、それらのメーリングリストの目的が特定の話題を一定のレベル以上の 人の間で議論するためのものだからです。 <p> とにかく公開されているメーリングリストに入ってみましょう。でも、そのメー リングリストのテーマをお忘れなく。 <p> Linux のメーリングリストについては、 <url url="http://summer.snu.ac.kr/~djshin/linux/mail-list/index.shtml" name="Linux Mailing List Directory">に詳しく紹介されています。 <sect>Linux カーネルの設定 <p> PPP を使うためには Linux カーネルに PPP 機能を組みこまなければなりませ ん。まだカーネルのソースコードを入手していなければ、ソースコードを手に 入れて Linux の標準的なソースコードのディレクトリである <tt>/usr/src/linux</tt> に置きましょう。 <p> 多くのディストリビューションが、自動的に<tt>/usr/src/linux</tt>ディレ クトリにソースツリー(ファイルやサブディレクトリ)をインストールするので、 まずこのディレクトリをチェックしてソースコードがインストールされていな いかチェックしましょう。 <p> Linux のカーネルソースは <tt>sunsite.unc.edu</tt> やそのミラーサイトか ら入手することが可能です。 <sect>Linux カーネルソースのインストール <p> 以下にLinux カーネルのソースコードを入手してインストールするための手順 を簡単に示します。詳細な手順は<url url="http://sunsite.unc.edu/mdw/HOWTO/Kernel-HOWTO.html" name="The Linux Kernel HOWTO">をごらんください。 <p> Linuxカーネルをインストールしてコンパイルするにはルート権限が必要です。 <enum> <item> <tt>/usr/src</tt> ディレクトリへ移動<newline> <tt>cd /usr/src</tt> <item> <tt>/usr/src/linux</tt> 以下にソースがインストールされていない か確認 <item>ソースコードが無ければ<url url="ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0" name="Linux kernel source directory">から入手します<newline> [国内では<url url="ftp://ftp.tut.ac.jp/pub/Linux/kernel/v2.0" name="豊橋技術科学大学">から最新のカーネルが入手できます。] (1.2.X などの)古いカーネルを探している場合、<url url="ftp://sunsite.unc.edu/pub/Linux/kernel/old" name="古いカーネルアーカイブ">を探してください。 <item>適当なカーネルを選ぶ - 通常、2.0.xシリーズの最新のカーネルを選び ましょう。それをダウンロードしてtar ファイルを <tt>/usr/src</tt> に置 きます。<newline> 注意:Linux のカーネルソースには多数のファイルがさまざまなディレクトリ に格納されているので、'tar' ファイルはそれら複数のファイルをまとめたファ イルになっており、通常圧縮されて(拡張子 .gz)います。tar ファイルはちょ うど DOS の zip ファイルのようなものです。 <item>すでにソースコードがインストールされていて新しいものに更新したい 場合、まず古いソースコードを削除してください。以下のコマンドを実行しま す。<newline> <tt>rm -rf /usr/src/linux</tt> <item> 次に以下のコマンドでソースコードを展開します<newline> <tt>tar xzf linux-2.0.6.tar.gz</tt> <item>次に <tt>cd /usr/src/linux</tt>して README ファイルを読んでくだ さい。このファイルにはどのようにカーネルの機能を設定してコンパイルする かが詳しく解説されていますので、まずこのファイルを読むことをお勧めしま す(プリントアウトして手元に置いておくのもいいでしょう。カーネルをコン パイルする際にはかなり時間がかかるので、その間に README をじっくり読ん でみましょう) </enum> <sect>ハードウェアについて <p> カーネルを再コンパイルするためには、あなたの PC に組みこまれているカー ドやデバイスについて知っている必要があります。いくつかのデバイス(例え ばサウンドカード)ではより詳しい設定(IRQ や I/O アドレスなど)を知ってお く必要もあります。 <sect> カーネルのコンパイル - Linux 1.2.13 の場合 <p> 設定プロセスを始める際には、インストールを正しく行うために README ファ イルの指示に従ってください。カーネルの設定は <tscreen><verb>make config</verb></tscreen> で始めます。 <p> PPP を使うためには PPP 機能をカーネルに組みこむように設定します(PPP は pppd とカーネルに組みこまれた PPP ドライバの双方が必要です)。 <code> PPP (point-to-point) support (CONFIG_PPP) [n] y </code> <p> その他の設定は、あなたの PC に組みこまれたハードウェアや使いたい Linux の機能に合せて選択してください。次に、README に従ってコンパイルし、新 しいカーネルをインストールします。 <p> 1.2.13 カーネルでは 4 つの PPP デバイスしか作りません。マルチポートシ リアルカードを使う場合、カーネルの PPP ドライバのソースを修正して、よ り多くのポートが使えるようにしてください(必要な修正の詳細については PPP-2.1.2 付属の README.linux に説明してあります)。 <p> 注意:1.2.13 の <tt>make config</tt> の設定は後には戻りません。ですか ら、間違えた場合は CTRL C を押して終了し、再度始めから設定してください。 <sect1>カーネルのコンパイル - Linux 1.3.x と 2.0.x の場合 <p> 2.0.x でも 1.2.13 と同様の手順になります。この場合も、ソースを正し くインストールするには README ファイルの指示に従ってください。カーネル の設定は <tscreen><verb>make config</verb></tscreen> で始めます。 <p> 2.0.x では <tscreen> <verb> make menuconfig </verb> </tscreen> も使えます。 <p> <tt>make menuconfig</tt> はメニューベースの設定システムで、オンライン ヘルプも用意され、好きなところから設定することが可能です。 <p> X ウィンドウベースの設定システムである <tscreen> <verb> make xconfig </verb> </tscreen> を使うことも可能です。 <p> PPP 機能は直接カーネルに組みこむこともできますし、実行時ロードモジュー ルとしてコンパイルすることも可能です。PPP を使うのはごく限られた時間だ け、という場合は PPP 機能はモジュールとしてコンパイルした方がいいでしょ う。'kerneld' を使えば PPP 接続を開始しようとした際に自動的に PPP 接続 に必要なモジュールを組みこむことができます。こうしておけばメモリ空間を 節約できます:カーネル本体がメモリからスワップアウトすることはありませ んが、'kerneld' が組みこんだ実行時ロードモジュールは、必要が無くなれば 自動的に取りはずされます。 <p> kerneld を使うためには、動的ロードモジュールを使用可能にします。 <code> Enable loadable module support (CONFIG_MODULES) [Y/n/?] y </code> PPP 機能をカーネルに組みこむ場合、以下の設定をします。 <code> PPP (point-to-point) support (CONFIG_PPP) [M/n/y/?] </code> <p> PPP をモジュールにする場合は<bf>M</bf>と答えます。カーネルに組みこみた い場合は<bf>Y</bf>と答えてください。 <p> 1.2.13 とは異なり、2.0.x のカーネルでは PPP デバイスは必要に応じて動的 に作成されるので、PPP デバイスの制限数に関する修正を行う必要はありません。 <sect1> PPP-2.2 と /proc/net/dev について <p> PPP-2.2 を使っている場合、デバイスが動的に作成される機能の副作用として、 pppd を起動するまでは <tt>/proc/net</tt> を見ても PPP デバイスは見つか りません <code> [hartr@archenland hartr]$ cat /proc/net/dev Inter-| Receive | Transmit face |packets errs drop fifo frame|packets errs drop fifo colls carrier lo: 92792 0 0 0 0 92792 0 0 0 0 0 eth0: 621737 13 13 0 23 501621 0 0 0 1309 0 </code> <p> しかしながら、いったん PPP サービスを開始すれば、必要なデバイスは以下 のように見えるようになります(私の運用している ppp サーバの例です) <code> [root@kepler contrib]# cat /proc/net/dev Inter-| Receive | Transmit face |packets errs drop fifo frame|packets errs drop fifo colls carrier lo: 428021 0 0 0 0 428021 0 0 0 0 0 eth0:4788257 648 648 319 650 1423836 0 0 0 4623 5 ppp0: 2103 3 3 0 0 2017 0 0 0 0 0 ppp1: 10008 0 0 0 0 8782 0 0 0 0 0 ppp2: 305 0 0 0 0 297 0 0 0 0 0 ppp3: 6720 7 7 0 0 7498 0 0 0 0 0 ppp4: 118231 725 725 0 0 117791 0 0 0 0 0 ppp5: 38915 5 5 0 0 28309 0 0 0 0 0 </code> <sect1>カーネル設定のその他の設定について <p> あなたの Linux マシンを PPP サーバとして設定する場合、IP フォーワード 機能も組みこんでおく必要があります。IP フォーワード機能は、複数の LAN を接続する場合や LAN をインターネットに接続する場合も必要です。 <p> LAN をインターネットに接続する場合(あるいは 2 つの LAN を接続する場合)、 セキュリティについて注意しなければなりません。カーネルに IP ファイアー ウォールの機能を組みこむことも必須です。 <p> 以前に述べたように、閉じたネットワーク用の IP 番号を使っているネットワー クをインターネットに接続する場合、IP masquerade の機能が必要になります。 <p> コンパイルしたカーネルをインストールして再起動すれば、PPP 接続の設定と テストが可能になります。 <sect>PPP 接続をするために必要な情報 <p> サーバと PPP 接続する際には以下の情報が必要になります(PPP サーバ のシステム管理者か ISP のユーザサポート窓口に問い合わせてください) <itemize> <item>PPP サービスをやっている電話番号<newline> 会社などの構内回線から接続する場合、外部へ接続するための内線番号も必要 です。これはたいてい 0 か 9 になっているでしょう。 <item>サーバが動的な IP 番号の割り当てを行なっているかあらかじめ決められた IP 番号を使っているか<newline> PPP 接続にあらかじめ決まった IP アドレスを使うようになっている場合、 PPP の接続の際に使う IP 番号も必要になります。 ほとんどの ISP では動的な割り当てを行なっているはずです。上述のように、 動的な割り当ての場合、利用可能なサービスにいくつかの制限が生じます。 <item>あらかじめ決まった IP 番号を使う場合、ネットワークマスクも必要に なるので ISP に問い合わせておいてください。 <item>ISP のネームサーバ(Domain Name Servers)のIP 番号は?<newline> ネームサーバのアドレスが最低 1 つは必要です。 <item>サーバは PAP/CHAP 認証を使っていますか?<newline> そのような場合、接続には認証に必要な ID や鍵(secret)が必要となります (通常はあなたのユーザー名とパスワードが使われます) <item>接続すればサーバが自動的に PPP 接続を開始するのか、一旦 login し てから PPP を起動するためのコマンドが必要になるのか?<newline> PPP を起動するためのコマンドが必要ならば、そのコマンド名は? </itemize> <p> これらの情報をきちんとメモしてから先に進みましょう。 <sect1>モデムを経由した外部への接続テスト <p> モデムが正しく設定されており、どのシリアルポートにつながっているかを確 認してください。 <p> <bf>たいてい以下のようになります</bf> <itemize> <item>DOS com1: = Linux /dev/cua0 (と /dev/ttyS0) <item>DOS com2: = Linux /dev/cua1 (と /dev/ttyS1)<newline> 等々 </itemize> <p> 一度、通信ソフト(minicom のような)を使って、PPP サーバの電話番号に正し くアクセスできるか確認してみましょう。 <p> (注意:この段階ではまだ PPP 接続を試しては<bf>いけません</bf> - 電話番 号が正しいか、PPP 接続を始めるためにサーバが接続時にどのようなメッセー ジを送っているかを<bf>正確</bf>に知ることが重要です) <p> この段階では、通信ソフトのログ機能を使って接続過程をファイルに落すか、 注意深く(きわめて注意深く)、サーバからどのようなプロンプトが送られてき て、どの段階でユーザ名とパスワードを入力しなければいけないかを(PPP 接 続を行なうために必要なコマンドも)正確に書き写してください <p> 少なくとも 2 回は電話をかけておいた方がいいでしょう。サーバによっては 接続の際にプロンプトが変わる場合も(例えば時間を表示するなど)あります。 あなたの Linux マシンが絶対知っておかなければならない 2 つの重要なプロ ンプトは <itemize> <item>ユーザ名を入れるためのプロンプト; <item>パスワードを入れるためのプロンプト; </itemize> の 2 つです。 <p> サーバで PPP を起動するために何らかのコマンドが必要な場合、接続してか らそのコマンドを実行する際のプロンプトも知っておかねばなりません。 <p> 接続先のサーバが自動的に PPP 接続を開始する場合、その電話番号にログイ ンすると画面に意味不明な文字列が表示されるはずです。これらは PPP サー バがあなたのマシンに PPP 接続を開始して各種の接続を行うために送ってい る情報です。 <p> この文字列は以下のような形式になっています。 <tscreen><verb>~y}#.!}!}!} }8}!}$}%U}"}&} } } } }%}& ...}'}"}(}"} .~~y}</verb></tscreen> <p> (そしてずっと来続けます!) <p> この段階でモデムの接続を切りましょう(通常、+++ を素早く入力し、ATHO コ マンドを送れば、モデムは回線を切断して OK を返すはずです) <p> いくつかのシステムではサーバにログインしてから PPP を明示的に起動する 必要があります。通常、 PPP でも通常のシェル環境でも同じユーザ名とパス ワードで接続できるようになっている場合にこのような設定がされているはず です。このような場合、一旦ログインしてから必要なコマンドを実行してみま す。すると、サーバが送ってくる意味不明の PPP 接続起動のための文字列が 画面に表示されるはずです。確認したら回線を切断しましょう。 <p> サーバが PPP 接続を開始しても、画面にその種の文字列が表示されない場合、 多分(絶対ではありませんが)あなたが何か間違っているはずです。 <p> もしかすると、接続先の PPP サーバがパッシブモード(受信)で設定されてい るのかも知れません。パッシブモードで設定されているサーバはクライアント (あなたのコンピュータ)の側から PPP 接続を開始しないと何も反応を返しま せん。 <p> しかしながら、ほとんどのサーバはアクティブモード(送信)で設定されており、 接続すれば意味不明の文字列が表示されるはずです。 <p> モデムが正しく動かない場合、まずモデムに付属のマニュアルを読みましょう。 次に、使っている通信ソフトのマニュアルや Serial HOWTO に目を通します。 その後、上記の過程を再度試してみてください。 <sect>シリアルポートとそのスピードについてのメモ <p> 高速な(外付け)モデム(14,400 Baud 以上)を使っている場合、シリアルポート もモデム以上の転送速度でデータをやりとりする必要があります。特にモデム がデータ圧縮機能を使っている場合、シリアルポートに速度が要求されます。 <p> そのためのシリアルポートには、16550(A) といった新しい UART(Universal Asynchronous Reveiver Transmitter)を使う必要があります。古いマシン(あ るいは古いシリアルカード)を使っている場合、UART は 8250 になっているこ とが多いはずです。8250 UART では高速なモデムを使おうとすると問題を引き おこすことになります。 <p> 確認するには <tscreen><verb>setserial -a /dev/ttySx</verb></tscreen> してみてください。 <p> こうすると、使っている UART の種類が表示されます。16550A タイプの UART を使っていない場合、新しいシリアルカードを購入した方がいいでしょう ($50 以下で入手できるはずです) <p> 注意:初期バージョンの 16550 UART チップにはバグがあります。これは早期 に発見され、改良版の 16550A UART チップがリリースされました。しかし、 問題のあるチップがごく少数ですが市場に出まわっているようです。多分この チップに遭遇することは無いと思いますが、特に年代モノのシリアルカードの 場合、setserial が 16550A を使っていることを示すか確認してください。 <sect>モデムの設定 <p> PPP からモデムを使えるように設定する必要があります。このためには <bf> モデムに付属のマニュアルを読んでください</bf>。ほとんどのモデムは<bf> 工場出荷時の設定</bf> のままでも PPP から使えるはずです。最小限必要な 設定は、 <itemize> <item> ハードウェアフローコントロール(RTS/CTS) (Hayes 系のコマンドを採用して いる多くのモデムでは <tt>&</tt>K3です) </itemize> です。 <p> その他、チェックした方がいい設定は(標準的な Hayes コマンドで示します) <itemize> <item>E1 コマンドで Echo を ON に(chat に必要) <item>Q0 コマンドでリザルトコードを返すように(chat に必要) <item>S0=0 で自動応答を OFF に(モデムが電話に答える場合は不要) <item><tt>&</tt>C1 で接続後にキヤリアデテクトが ON になるように <item><tt>&</tt>S0 で DSR が常に ON になるように <item>(機種によって違いますが) DTR も ON になるように </itemize> <p> コンピュータとモデムを接続する部分のモデムのシリアルインターフェイスが どうなっているかをチェックしておくのも有益です。たいていの新しいモデム ではシリアルインターフェイスの速度は固定になっており、電話回線の転送速 度は回線の状態によって自動的に接続可能な最高速にを選ぶようになっている はずです。 <p> この方法は split speed operation と呼ばれ、お使いのモデムがこの機能を 持っている場合、モデムのシリアルインターフェイスは最高速度に固定して使 うのがいいでしょう(通常 115,200 baud ですが、14,400 baud モデムでは 38,400 までの場合があります) <p> 通信ソフト(例えば minicom)を使って、モデムの設定を確認し、PPP に必要な 設定を行なってください。多くのモデムが AT<tt>&</tt>V で現在の設定 状態を返すようになっていますが、正確なところはモデムのマニュアルを参照 してください。設定がゴチャゴチャになってしまった場合、 たいてい AT<tt>&</tt>F で工場出荷時の設定に戻ります(私が試した新し いモデムでは工場出荷時の設定のままで PPP が使えましたが、チェックして みることをお勧めします)。 <p> 不揮発性の RAM に設定を保存します(通常、AT <tt>&</tt>W で設定を保 存しますが、詳細はモデムのマニュアルを御覧ください) <p> 正しい設定を保存しておけば、モデムをリセットすればその設定が利用される ようになります。こうしておけば PPP 接続を張る際の chat スクリプトがずっ と簡単になるでしょう。 <sect1> シリアルポートのフロー制御について <p> データがシリアル回線を通過する際、コンピュータの処理速度よりも速くデー タが届く場合があります(コンピュータが別の重い仕事をしている場合など。 Linux はマルチユーザー、マルチタスク OS です)。そのような場合でも データを失わない(入力バッファからデータが溢れなければ無くなりません)よ うにするにはデータのフロー制御が必要になります。 <p> シリアル回線のフロー制御には 2 つの方法があります。 <itemize> <item>ハードウェアフロー制御(データ転送の際に Send/Request をクリアする - CTS/RTS) <item>ソフトウェアフロー制御(control S と control Q を使う) </itemize> <p> 通常のテキスト表示用のターミナルならば後者の方法でも構いませんが、PPP 接続の上を流れるデータは 8 ビット全てを使っているので cntl-S や cntl-Q がデータのどこかに現われる可能性はかなり高くなります。ですから、モデムがソ フトウェアフロー制御を使っている場合、すぐに制御不可能になります。 <p> 8 ビット全てを使う PPP 接続ではハードウェアフロー制御が必須です。 <sect>PPP とルート権限 <p> PPP ではカーネルのルーティングテーブルの変更といったネットワークデバイ スを設定する必要があるため、ルート権限が必要になります。 <p> ルート以外のユーザが PPP 接続を設定する場合、pppd プログラムはルートに setuid しておく必要があります。 <tscreen><verb>-r-sr-xr-x 1 root root 95225 Jul 11 00:27 /usr/sbin/pppd</verb></tscreen> <p> /usr/sbin/pppd がこのような設定になっていない場合、<bf>ルートになって </bf><tscreen><verb>chmod u+s /usr/sbin/pppd</verb></tscreen>とします。 <p> こうしておけば、ルート以外の一般ユーザが pppd のバイナリを実行しても、 pppd はルート権限で動くようにになり、一般ユーザでもネットワークインター フェイスやカーネルのルーティングテーブルを設定するために必要な権限で pppd を実行することが可能になります。 <p> ルートに setuid されたプログラムは潜在的なセキュリティホールになりがち なので、ルートに setuid する場合は特に注意してください。pppd を含めた ルートに setuid することが必須のプログラムはセキュリティには十分注意を 払って書かれているので、pppd を使う場合、setuid の問題はまず大丈夫でしょ う(しかし保証はありません) <p> 誰でも PPP 接続を開始できるようにするか否かといったシステムの使い方に 合わせて、ppp-on/off スクリプトの読み出しや実行の許可属性を設定してく ださい。あなた一人しかその PC を使わない場合、a+rx でいいでしょう。 <p> しかし、PPP 接続を開始できる人を制限したい場合(例えば、あなたの子供も あなたの Linux マシンにアカウントを持っているけれど、彼らにはインター ネットへ接続させたくない場合)、PPP 接続用のグループを作って(/etc/group を修正して) <itemize> <item>ppp-on/off スクリプトをルートと PPP グループの所有にし、 <item>ppp-on/off スクリプトの読み出し許可と実行許可を PPP グループにのみ与え ます。 <tscreen><verb> -rwxr-x--- 1 root PPP 587 Mar 14 1995 /usr/sbin/ppp-on -rwxr-x--- 1 root PPP 631 Mar 14 1995 /usr/sbin/ppp-off </verb></tscreen> <item>それ以外の許可属性は落しておきます。 <item>PPP を実行できるユーザのみを /etc/group を修正して PPP グループに登録 します。 </itemize> <p> このように設定しても、一般ユーザはソフトウェア的には PPP 接続を切れま せん。<tt>ppp-off</tt> スクリプトにはルート権限が必要です。しかしなが ら、モデムの電源は誰でも切れます! <p> 私が家で使っているマシンでは pppd を root に setuid して<bf>いません </bf>。 PPP を開始するために、私だけが知っているパスワードを使ってルー トになって実行しています。こうしておけば息子たちがインターネットに勝手 に接続することはできません。 <sect>PPP 接続用設定ファイル <p> PPP を誰でも使えるように設定している場合でも、ここから先はルートで login してください。PPP 接続に必要なディレクトリを作り、設定ファイルを 修正します。 <p> PPP は ppp 接続を設定するためにいくつかの設定ファイルを利用します。こ れらのファイルの場所や名前は PPP 2.1.2 と 2.2 ので多少異なっています。 <p> PPP 2.1.2 の場合、必要なファイルは <code> /usr/sbin/pppd # pppd のバイナリ /usr/sbin/ppp-on # ダイアル/接続用スクリプト /usr/sbin/ppp-off # 接続終了用スクリプト /etc/ppp/options # pppd が全ての接続の際に使うオプション /etc/ppp/options.ttyXX # ポートごとに使うオプション </code> でした。 <p> PPP 2.2 の場合、 <code> /usr/sbin/pppd # pppd のバイナリ /etc/ppp/scripts/ppp-on # ダイアル/接続用スクリプト /etc/ppp/scripts/ppp-on-dialer # 実際の chat スクリプト /etc/ppp/scripts/ppp-off # 接続終了用スクリプト /etc/ppp/options # pppd が全ての接続の際に使うオプション /etc/ppp/options.ttyXX # ポートごとに使うオプション </code> になっています。 <p> 御覧のように、/etc ディレクトリに ppp 用のディレクトリがあります。 <tscreen><verb> drwxrwxr-x 2 root root 1024 Oct 9 11:01 ppp </verb></tscreen> <p> もしこのディレクトリが無ければ作ってください。 <p> このディレクトリが存在していれば、<bf>options.tpl</bf> と呼ばれるオプ ション設定ファイルのヒナ型ファイルがあるはずです。ただし、このファイル を含んでいないディストリビューションも多いようなので、このファイルはこ の文書中に含めておきます。 <p> このファイルには PPP の全てオプションの説明が書かれているので、打ち出 しておきましょう(pppd のマニュアルを合せて読めばより有益です)。このファ イルを <tt>/etc/ppp/options</tt> ファイルの元として使うこともできます が、多分コメントアウトされている部分を削除した新しいファイルを作成する 方がいいでしょう。そうした方がずっと短くなって、読みやすく、メンテナン スもしやすくなります。 <p> 複数のシリアル回線やモデムを使う場合(PPP サーバによくある場合)、全体の 設定ファイルである <tt>/etc/ppp/oprions</tt> には全ての電話を受けるシ リアルポートに必要なオプションを指定します。PPP 接続のために個別の設定 の必要なシリアル回線には別途個別設定用のファイルがあります。 <p> 個別設定用のファイルは <tt>options.ttyx1</tt> や <tt>options.ttyx2</tt> といった名称になっています(x はお使いのシリアル ポートの名称です) <p> PPP 接続を一つしか使わない場合、全てを <tt>/etc/ppp/options</tt> ファ イルで設定しても構いません。また、全てのオプションを pppd を起動する際 のオプションとして指定することも可能です。 <p> この方が <tt>/etc/ppp/options.ttySx</tt> に指定するよりも簡単です。PPP で複数の異なるサイトに接続する場合、サイトごとの設定ファイル <tt>/etc/ppp/options.site</tt> を用意し、接続の際に必要なパラメータを 設定ファイルに指定することも可能です。 <sect1> options.tbl ファイル <p> PPP のディストリビューションによっては options.tpl ファイルが無い場合 もありますので、以下に完全なファイルを付けておきます。このファイルを直 接修正して <tt>/etc/ppp/options</tt> ファイルなどを作らず、新しいファ イルにコピーしてから修正することをお勧めします。そうしておけば設定がこ んがらがってもオリジナルのファイルに戻って再出発できます。 <code> # /etc/ppp/options -*- sh -*- general options for pppd # created 13-Jul-1995 jmk # autodate: 01-Aug-1995 # autotime: 19:45 # 実行可能なプログラムかシェルスクリプトを使ってシリアル回線を設定します。 # このスクリプトでは "chat" を使ってモデムからダイヤルし、接続先の PPP # セッションを起動しています。 # #connect "echo You need to install a connect command." # pppd が接続を切った後に実行するプログラムかシェルスクリプトを指定しま # す。例えば、モデムがハードウェア制御信号で回線断しない場合などに、回線 # を接続するためのコマンドを実行することができます。 # #disconnect "chat -- \d+++\d\c OK ath0 OK" # 32-bit hex での async キャラクタマップの指定。32 ビットの各ビットが # pppd が受信の際にそのキャラクタをエスケープするかどうかを指定します。 # 0x00000001 は \x01, 0x800000000 は \x1f を示します。 #asyncmap 0 # ネットワーク用のパケットをやりとりする前に接続先に認証を求めます。 # #auth # シリアルポートのフロー制御にハードウェアフロー制御を使います。 # #crtscts # XON/XOFF といったソフトウェアフロー制御を使います。 # #xonxoff # IPCP のネゴーシエションがうまくいった場合、接続先をゲートウェイにする # ような経路制御(default route)をシステムの経路制御表に加えます。この経 # 路は PPP 接続が終了した段階で削除されます。 # #defaultroute # 伝送時に特定のキャラクタをエスケープします(接続先がそのキャラクタを # async control character map で指定しているか否かにかかわらず)。エスケー # プするキャラクタはコンマで区切った 16 進表記で指定します。asyncmap オ # プションではコントロールコードしかエスケープできないのに対し escape オ # プションではあらゆるキャラクタがエスケープできることに注意してください。 # エスケープできないかも知れないキャラクタは 0x20 -0x3f と 0x5e です。 # #escape 11,13,ff # モデムの制御線を使いません。 # #local # pppd が UUCP スタイルのロックファイルを作って、他のプログラムがシリア # ルデバイスをアクセスしないようにします。 # #lock # モデムの制御線を操作します。Ultrix ではこのオプションは crtscts オプショ # ンと同じハードウェアフロー制御も含みます(このオプションは完全に実装さ # れているわけではありません) # #modem # 接続相手にMRU[Maximum Receive Unit]の値を <n> にするように相談します。 # この指定により接続先に <n> バイト以下のパケットは送らないように指定し # ます。MRU の最小値は 128 で、デフォルト値は 1500 です。遅い回線では # 296 を推奨します(TCP/IP のヘッダに 40 バイト + データに 256 バイト) # #mru 542 # インターフェイスのネットマスクを <n> に指定します。指定は 32 ビットを # ドットで区切った 10 進表記です(例:255.255.255.0) # #netmask 255.255.255.0 # 自分の側の IP アドレスを指定しなかった場合、デフォルトではホスト名から # IP アドレスを決定しますが、このオプションを指定すれば自分の側で IP ア # ドレスを決定せず、接続先から IPCP のネゴシエーションの際に送られてくる # IP アドレスをローカルの IP アドレスにします(コマンドラインやオプション # ファイルで明示的にローカルの IP アドレスを指定することも可能です) # #noipdefault # LCP 時の "passive" オプションを可能にします。このオプションを指定すれ # ば、pppd は自動的に接続を開始しようとします。このオプションを指定しな # いと接続先からの返答がなかった場合 pppd は終了しますが、このオプション # を指定すれば受動的に有効な LCP パケットが届くまで待つことになります。 # #passive # このオプションを指定すれば、接続先から正しい LCP パケットが届くまで # pppd は接続を開始するための LCP パケットを発信しません(古いバージョン # の pppd は "passive" オプションがこの動作を指定しました) # #silent # LCP と IPCP に特別のオプションを使いません(デフォルトのもののみを使い # ます) # #-all # Address/Control 圧縮に関するネゴシエーションをしません(デフォルト、す # なわち、address/contro フィールドは使わない設定になります) # #-ac # asyncmap のネゴシエーションをしません(デフォルトの asyncmap, すなわち # 全てのコントロールキャラクタをエスケープする設定になります) # #-am # fork してバックグラウンドプロセスになりません(このオプションを指定しな # いと、シリアルデバイスを指定してから pppd はバックグラウンドに入ります) # #-detach # IP アドレスのネゴシエーションをしません(このオプションを指定する場合、 # 接続先の IP アドレスはコマンドラインかオプションファイルで指定しなけれ # ばいけません) # #-ip # マジックナンバーのネゴシエーションをしません。このオプションを指定する # と、pppd は回線がループバック状態になっていても検出できません。 # #-mn # MRU[Maximum Receive Unit]のネゴシエーションをしません(デフォルト値であ # る 1500 を使います) # #-mru # プロトコルフィールドを圧縮するかどうかのネゴシエーションをしません(デ # フォルトではプロトコルフィールドは圧縮しません) # #-pc # 接続相手に PAP 認証を使うように指定します。 # #+pap # PAP 認証を使うことに同意しません。 # #-pap # 接続相手に CHAP[Cryptographic Handshake Authentication Protocol]を使う # ように要求します。 # #+chap # CHAP を使うことに同意しません。 # #-chap # Van Jacobson 式の IP ヘッダの圧縮についてのネゴシエーションをしません # (デフォルトでは圧縮しない設定になっています) # #-vj # デバッグレベルを上げます(-d と同じ)このオプションが指定されると、pppd # は送受信した全ての制御用パケットの内容を人間に読める形で記録します。こ # の情報はファイルにリダイレクトしたり、/etc/syslog.conf で明示的にどの # ファイルに送るかを指定します(詳細は syslog.conf(5))(pppd がより詳細な # デバッグができるようにコンパイル時に設定されている場合、情報は daemon # ではなく local2 の機能を使って記録されます。 # #debug # 認証のためのローカルのホスト名を <d> というドメイン名にします。 # gethostname() が porsche というホスト名を返すが、実際のドメイン名は # porsche.Quotron.COM の場合、Quotron.COM を指定するためにこのオプション # を指定します。 # #domain <d> # カーネルに組みこまれた PPP ドライバのデバッグレベルを <n> にします。n # は以下の値を足しあわせた結果になります:1 一般的なデバッグメッセージ、 # 2: 受けとったパケットの中身のうちプリント可能なものを記録、4: 送信した # パケットのうち、中身のプリントアウトが可能なものを記録。 # #kdebug n # MTUの値を <n> にします。接続先から MRU の値としてより小さな値が指定さ # れない限り、この値以下のパケットは PPP ネットワークのインターフェイス # へ送らないよう、カーネル内部のネットワークコードに指定します。 # #mtu <n> # 認証用に自分のシステムの名前を <n> にします。 # #name <n> # PAP で認証する接続先用に、手元のマシンを使っているユーザーの名前を <u> # にします。 # #user <u> # 認証用にローカルシステムの名称をホスト名にします(name オプションを無効 # にします) # #usehostname # 認証用にリモートのシステム名を <n> にします。 # #remotename <n> # ローカルシステムの ARP[Address Resolution Protocol]テーブルに接続先の # IP アドレスとこのシステムのイーサネットアドレスを追加します。 # #proxyarp # PAP の認証用にシステムのパスワードデータベースを使います。 # #login # 毎 n 秒ごとに、接続先に LCP echo-request のフレームを送ります。Linux # の場合、接続先から n 秒間パケットが届かない場合に echo-request を送り # ます。通常、接続先は echo-request が届けば echo-reply を返します。この # オプションと lcp-echo-failure オプションを組みあわせて、接続が切れてい # ることを確認できます。 # #lcp-echo-interval <n> # LCP echo-request を n 個送っても返答が無かった場合、接続が切れているも # のと見なして pppd が接続を終了します。このオプションを使う場合、 # lcp-echo-interval に 0 以外の値を指定しておく必要があります。このオプ # ションを使えば、モデムの制御線を調べられない場合でも物理的な接続が切れ # ると(モデムがハングアップすると) PPP 接続を終了させることができます。 # #lcp-echo-failure <n> # LCP の再送間隔を n 秒にします(デフォルトは 3 秒です) # #lcp-restart <n> # LCP terminate-request を最大 n 個送るようにします(デフォルトでは 3) # #lcp-max-terminate <n> # LCP configure-request を最大 n 個送るようにします(デフォルトでは 10) # #lcp-max-configure <n> # LCP configure-NAK を n 個受けとると configure-Reject を送るようにしま # す(デフォルトでは 10) # #lcp-max-failure <n> # IPCP の再送間隔を n 秒にします(デフォルトでは 3) # #ipcp-restart <n> # IPCP teriminate-request を最大 n 個送るようにします(デフォルトでは 3) # #ipcp-max-terminate <n> # IPCP configure-request を最大 n 個送るようにします(デフォルトでは 10) # #ipcp-max-configure <n> # IPCP configure-NAK を n 個まで受けとると configure-Rejects を送るよう # にします(デフォルトでは 10)。 # #ipcp-max-failure <n> # PAP 認証を再開するまでの時間を n 秒にします(デフォルトでは 3)。 # #pap-restart <n> # PAP autenticate-request 送出数を最大 n 個にします(デフォルトでは 10) # #pap-max-authreq <n> # CHAP 認証を再開するまでの時間を n 秒にします(デフォルトでは 3) # #chap-restart <n> # CHAP 認証を最大 n 回試みます(デフォルトでは 10)。 # #chap-max-challenge # このオプションを指定した場合、接続先と n 秒ごとに CHAP 認証を繰り返 # します。 # #chap-interval <n> # このオプションを指定すると、ローカルの IP アドレスをオプション指定して # いても接続先が提案した IP アドレスをローカルの IP アドレスにします。 # #ipcp-accept-local # このオプションを指定すると、リモートの IP アドレスをオプション指定して # いても接続先が指定した IP アドレスをリモートの IP アドレスにします。 3 #ipcp-accept-remote </code> <sect1>どのオプションを指定すべき? <p> うーん、それは状況によります。 <p> 以下に示すものは、一般的な例のほとんどをカバーできる 2 つの基本的な バージョンのオプションファイルです。 <p> しかしながら、動かなかった場合、ヒナ型ファイル (<tt>/etc/ppp/options.tpl</tt>) <bf>と</bf> pppd のマニュアルを読みま しょう。合わせて、接続先のサーバを管理しているシステム管理者やユーザサ ポート係に問い合わせてみるのもいいでしょう。 <sect2> /etc/ppp/options(PAP/CHAP を使わない場合) <p> 以下の設定は PAP/CHAP 認証を必要としない場合用です。 <code> # /etc/ppp/options (NO PAP/CHAP) # # pppd がバックグランドに入らないようにします -detach # もし IP アドレスが固定ならば 0.0.0.0 を正しい IP アドレスに書きかえて # ください。 0.0.0.0: # モデムの制御線を使います。 modem # シリアルデバイスを複数のプロセスが使わないようにロックする際に uucp # スタイルのロックを使います。 lock # ハードウェアフローコントロールを使います。 crtscts # PPP 接続をデフォルトの経路にします。 defaultroute # コントロールキャラクタを一切エスケープしません。 asyncmap 0 # 送出するパケットの大きさを最大 552 バイトにします。 mtu 552 # 受けとるパケットの大きさを最大 552 バイトにします。 mru 552 # #-------END OF SAMPLE /etc/ppp/options (no PAP/CHAP) </code> <sect2>/etc/ppp/options (PAP/CHAPを使う場合) <p> サーバが PAP や CHAP 認証を求める場合、上記のオプションファイルに以下 の行を付け加えてください。 <code> # # 認証の際に ISP でのユーザー名をホスト名として使います。 name <your ISP username> # この行は忘れず変更すること # PAP や CHAP 認証を強制的に行う必要がある場合、以下の適切な行のコメント # を外すこと #+chap #+pap # # /etc/ppp/pap-secrets ファイルが暗号化されている場合、以下の行のコメン # トを外す #+papcrypt </code> <sect>/etc/resolv.conf ファイルの設定 <p> 人間は名前を付けるのが好きですが、コンピュータは数字の方が得意です。 TCP/IP ネットワーク(すなわちインターネットの世界)では、私たちはマシン をその名称で指定し、全てのマシンは特定の&dquot;ドメイン&dquot;に属して います。例えば、私が使っている Linux ワークステーションは <bf>archenland</bf> という名前で、<bf>hedland.edu.au</bf> ドメインに属 しています。このマシンの人間向きのアドレスは archenland.hedland.edu.au です。一方、他のインターネットに接続されたマシンからこのマシンを見つけ るためには IP 番号を使います。 <p> このように、マシン(とドメイン)の名称を IP 番号に変換(解決)するためにイ ンターネット上に用意されているのが Domain Name Service(DNS)です。 <p> PPP 接続の場合、手元の Linux マシンに、どこでホスト名と IP 番号の変換 (アドレスの解決)が可能になるかを指定して、<bf>あなた</bf>がマシン名を 使っても、<bf>コンピュータ</bf>は必要な IP 番号に変換できるようにして おく必要があります。 <p> 一つの方法は接続する全てのホスト名を <tt>/etc/hosts</tt> ファイルに書 きこむことです(インターネットに接続する場合、現実的には不可能です);名 前ではなく、それぞれのマシンの IP アドレスを直接使うのも一つの方法です (ごく小さな LAN 以外ではとても記憶できないでしょう) <p> 最善の方法は、どこでホスト名と IP 番号の変換が自動的に行えるかを教える ことです。Domain Name Server がこのサービスを行なっているので、必要な ことは DNS の IP 番号を /etc/resolv.conf ファイルに指定することです。 <p> PPP サーバのシステム管理者/ユーザサポートは通常 2 つの DNS の IP 番号 を教えてくれるはずです(最低 1 つあれば十分ですが、何かのトラブルに備え てたいてい 2 の DNS を設定しています) <p> その場合、<tt>/etc/resolv.conf</tt> は以下のようになるでしょう。 <code> domain your.isp.domain.name nameserver 10.25.0.1 nameserver 10.25.1.2 </code> <p> <tt>/etc/resolv.conf</tt> を修正して(必要ならば作成して)、接続先の ISP の情報を反映させます。このファイルのパーミッションはこのようにすべきで す。 <tscreen><verb> -rw-r--r-- 1 root root 73 Feb 19 01:46 /etc/resolv.conf </verb></tscreen> <p> LAN に接続していて、既に /etc/resolv.conf がある場合は PPP 接続の DNS サーバのアドレスを付けくわえるだけでかまいません。 <sect>PAP/CHAP の認証ファイル <p> pap や chap を用いた認証方法を使う場合、そのための認証ファイル(secrets file)が必要です。それらは、 <code> /etc/ppp/pap-secrets /etc/ppp/chap-secrets </code> です。 <p> 最初に注意しておきますが、PAP や CHAP は本来<bf>ユーザ</bf>ではなく <bf>コンピュータシステム</bf>を認証するようにデザインされていることを 記憶しておいてください。 <p> というと、「どこが違うの?」という疑問が聞こえそうですね。 <p> 簡単に言ってしまうと、いったんあなたのコンピュータがサーバと PPP 接続 を張ると、あなただけでなく、あなたのコンピュータシステムの<bf>どんなユー ザでも</bf>その接続を使うことができるわけです。だからこそ、PPP を使っ て 2 つの LAN(Local Area Network)を結びつけ WAN(Wide Area Network)を仕 立てることができるわけです。 <p> 接続先の ISP からは、ISP に接続してインターネットを使うためのユーザ名 とパスワードを貰っているはずです。ISP にとって、あなたのコンピュータの 名前はどうでもいいので、コンピュータの名前として ISP に登録しているあ なたのユーザ名を使うことになります。 <p> この名前は pppd の <tt>name username</tt> オプションで指定します。です から、ISP から貰ったユーザ名を使う場合、<tt>/etc/ppp/options</tt> ファ イルに以下の一行を加えます。 <code> name your_username_at_your_ISP </code> <p> <p> 技術的に厳密に言うと、PAP の場合は <tt>user our_username_at_your_ISP</tt> オプションを使うべきですが、pppd はPAP を使う場合、自動的に <tt>name</tt> を <tt>user</tt> と解釈します。 <tt>name</tt> オプションを使う利点は、このオプションは CHAP にも有効な ことです。 <p> PAP/CHAP は<bf>コンピュータ</bf>を認証するための方式ですから、技術的に はリモート端のコンピュータ名も指定してやる必要があります。しかし、たい ていの人は一つの ISP しか使わないため、設定ファイルのリモートホスト欄 にはワイルドカード(*)の指定をしておけば十分です。 <p> 多くの ISP では、一つの電話番号に複数のモデムを接続し、それぞれ異なる 名前のターミナルサーバに接続しています。このような場合もリモートのコン ピュータの名前を接続前に決定することは不可能なので、設定ファイルのリモー トホスト欄にはワイルドカードの指定をしておくべきです。 <sect1>PAP の認証ファイル <p> <tt>/etc/ppp/pap-secrets</tt> ファイルはこのような形式をしています。 <code> # Secrets for authentication using PAP # client server secret acceptable local IP addresses </code> <p> 4 つの欄がスペースキャラクタで区切られています。 <p> ISP から貰ったユーザ名を <tt>fred</tt>、パスワードを <tt>flintstone</tt> とします。その場合、 <tt>/etc/ppp/options.ttySx</tt> ファイルに<tt>name fred</tt> オプショ ンを設定し、<tt>/etc/ppp/pap-secrets</tt> ファイルには <code> # Secrets for authentication using PAP # client server secret acceptable local IP addresses fred * flintstone </code> のように設定します。 <p> この設定は、ローカルマシンの名前を <tt>fred</tt>に(実際のローカルなマ シンの名前とは違っても pppd がその名前を使います)して、<bf>全ての</bf> サーバに接続する場合に<tt>flintstone</tt>というパスワードを使うことに なります。 <p> あらかじめ静的な IP アドレスをもらっている場合以外、ローカルの IP アド レスを指定する必要はないことに御注意ください。 <p> PAP を使って複数のマシンと接続するような場合、それぞれの接続先ごとに異 なるユーザ名を使うか、接続先のマシン名を調べる必要があります。そして <tt>pap-secrets</tt> ファイルに必要な行を付け加えて、接続先のマシンご とに<tt>name</tt> オプションを正しく設定します。 <sect1>CHAP の認証ファイル <p> 現在のバージョンの pppd では相互認証方式が必要です。すなわち、あなたの マシンを接続先に認証すると<bf>同時に</bf>接続先のマシンをあなたのマシ ンに認証させる必要があります。 <p> あなたのマシンが <tt>fred</tt> でリモートのマシンが <tt>barney</tt> の 場合、あなたのマシンの <tt>/etc/ppp/options.ttySx</tt>には<tt>name fred remotename barney</tt> オプションを、リモートマシンの <tt>/etc/ppp/options.ttySx</tt> ファイルには <tt>name barney remotename fred</tt> オプションをそれぞれ指定してやる必要があります。 <p> fred の<tt>/etc/chap-secrets</tt>ファイルはこのようになります。 <code> # Secrets for authentication using CHAP # client server secret acceptable local IP addresses fred barney flintstone </code> 一方、barney のはこうです。 <p> <code> # Secrets for authentication using CHAP # client server secret acceptable local IP addresses barney fred flintstone </code> <sect> PPP 接続を手動で起動 <p> さて、<tt>/etc/ppp/options</tt> と<tt>/etc/resolv.conf</tt> ファイルを 作成しました(必要ならば <tt>/etc/ppp/pap|chap-secrets</tt>ファイルも)。 これで PPP 接続がうまくいくかどうか手動で試してみましょう(手動でうまく いくことが確認できてから自動的に接続する方法を説明します) <p> 手動接続のためには、モデムをリセットせずに終了できる通信ソフトが必要で す。Minicom ならば ALT Q で可能です(古いバージョンの minicom ならば CTRL A Q です) <p> ルートとしてログインしていることを確認してください。 <p> minicom のような通信ソフトを起動し、普通に PPP サーバに接続します。PPP 接続のために何かコマンドが必要ならば、そのコマンドを実行してください。 以前にチェックしたような <tscreen><verb>~y}#.!}!}!} }8}!}$}%U}"}&} } } } }%}& ...}'}"}(}"} .~~y}</verb></tscreen> といったデータが送られてくるはずです。 <p> pap/chap を使っている場合、サーバマシンに接続するだけで自動的に ppp が 起動され、ログインしなくても上記のようなデータが送られてきます(サーバ の設定によってはそうならない場合もあります) <p> ここでモデムをリセットせずに通信ソフトを終了させ(minicom では ALT Q か CTRL A Q を入力します)、Linux の(ルートの)プロンプトを出し、 <tscreen><verb> pppd -d -detach /dev/cuaX & </verb></tscreen> と入力します。 <p> -d オプションはデバッグ出力の指定で、このオプションを使えば ppp 接続が 始まるとともに「会話」内容がシステムのログファイルに記録されます。トラ ブルの際にはこのファイルを調べましょう。 <p> 実際に入力すべきは <tt>cuaX</tt> では<bf>なく</bf>、通常、 <tt>cua0</tt> か <tt>cua1</tt> といった実際にモデムが接続されているポー ト番号を指定することをお忘れなく。 <p> PPP 接続が確立すればモデムのライトが点滅するはずです。PPP 接続を確立す るには多少の時間がかかります。 <p> ここで <tscreen><verb> ifconfig </verb></tscreen> コマンドを使って PPP インターフェイスの状態を調べます。 <p> イーサネットやループバックデバイス以外に、このような ppp デバイスの表 示が見られるはずです。 <code> ppp0 Link encap:Point-Point Protocol inet addr:10.144.153.104 P-t-P:10.144.153.51 Mask:255.255.255.0 UP POINTOPOINT RUNNING MTU:552 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 TX packets:0 errors:0 dropped:0 overruns:0 </code> <p> ここで、 <itemize> <item>inet addr:10.144.153.104 はあなたの側の IP 番号で、 <item>P-t-P:10.144.153.51 はサーバ側の IP 番号です </itemize> <p> (ifconfig はあなたの PPP サーバで使っている IP 番号以外は報告しないかも 知れません) <p> 注意:ifconfig は接続が UP で RUNNING 状態になっていることも示しています。 <p> もし、このように表示された場合、 <code> ppp0 Link encap:Point-Point Protocol inet addr:0.0.0.0 P-t-P:0.0.0.0 Mask:0.0.0.0 POINTOPOINT MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 TX packets:0 errors:0 dropped:0 overruns:0 </code> <p> PPP 接続がうまく確立されていません。後述するデバッグについての章を御覧 ください。 <p> 同時に、リモートホスト(とその先)への経路が確立しているかチェックしましょ う。そのためには、 <tscreen><verb> route -n </verb></tscreen> コマンドを使います。すると、以下のような出力が見られるはずです。 <p> <code> Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface 10.144.153.3 * 255.255.255.255 UH 1500 0 1 ppp0 127.0.0.0 * 255.0.0.0 U 3584 0 11 lo 10.0.0.0 * 255.0.0.0 U 1500 0 35 eth0 default 10.144.153.3 * UG 1500 0 5 ppp0 </code> <p> ここで ppp インターフェイスに<bf>2 つの</bf>エントリができていることに 特に注意してください。 <p> 最初のものはホストへの経路(H フラグが示しています)で、接続先の IP アドレ スを示しています。しかし、そこから先への経路はありません。 <p> 2 つめのものが<tt>デフォルト</tt>の経路(default route)で、Linux PC は この経路にローカルのイーサネット宛てでは<bf>ない</bf>全てのパケットを 送りつけます。このデフォルトの経路がネットワークへの経路として PPP サー バ自身を指しています。PPP サーバは我々のパケットをインターネットへ送り だし、返答パケットを我々のもとへ送ってこなければなりません。 <p> ルーティングテーブルに 2 つのエントリが見つからない場合、何か間違って います(デバッグについての章を見てください) <p> 次に 'ping' を使って接続をテストします。このためには、ifconfig が表示 した接続先の IP 番号を指定して、 <tscreen><verb> ping 10.144.153.51 </verb></tscreen> とします。すると、このような出力が見られるはずです。 <p> <tscreen><verb> PING 10.144.153.51 (10.144.153.51): 56 data bytes 64 bytes from 10.144.153.51: icmp_seq=0 ttl=255 time=328.3 ms 64 bytes from 10.144.153.51: icmp_seq=1 ttl=255 time=190.5 ms 64 bytes from 10.144.153.51: icmp_seq=2 ttl=255 time=187.5 ms 64 bytes from 10.144.153.51: icmp_seq=3 ttl=255 time=170.7 ms </verb></tscreen> <p> この表示はいつまでも続くので、適当なところで CTRL C を押して終了させま しょう。すると、 <tscreen><verb> --- 10.144.153.51 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 170.7/219.2/328.3 ms </verb></tscreen> といった表示がされるはずです。 <p> 次に、ホスト名で ping のテストをしてみましょう。指定するホスト名は PPP サーバではなく、別のサイトにあるホストで、動いていることが確実なホスト を選びます。例えば、 <tscreen><verb> ping sunsite.unc.edu </verb></tscreen> とします。 <p> 今回は、指定したホスト名を <tt>/etc/resolv.conf</tt> で指定した DNS へ 尋ねて IP 番号へ変換しているために多少時間がかかりますがご心配なく(で もその間もモデムのライトは点滅しているはずです)。少ししてから、以下の ような出力が表示されるはずです。 <tscreen><verb> PING sunsite.unc.edu (152.2.254.81): 56 data bytes 64 bytes from 152.2.254.81: icmp_seq=0 ttl=254 time=190.1 ms 64 bytes from 152.2.254.81: icmp_seq=1 ttl=254 time=180.6 ms 64 bytes from 152.2.254.81: icmp_seq=2 ttl=254 time=169.8 ms 64 bytes from 152.2.254.81: icmp_seq=3 ttl=254 time=170.6 ms 64 bytes from 152.2.254.81: icmp_seq=4 ttl=254 time=170.6 ms </verb></tscreen> <p> これも適当なところで CTRL C を押して停止させ、統計情報を見ましょう。 <tscreen><verb> --- sunsite.unc.edu ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 169.8/176.3/190.1 ms </verb></tscreen> <p> 反応が帰ってこなければこの文書のデバッグに関する章を読んでくだ さい。 <p> すべてがうまく行けば、 <tscreen><verb> ppp-off </verb></tscreen> コマンドで接続を終了させます。 <p> しばらくの後にモデムもハングアップするはずです。 <p> うまくハングアップしない場合、モデムの電源を切るか通信ソフトを立ちあげ て +++ を入力してモデムのコマンドモードに入り、ATH0 コマンドで接続を切 り、モデムから OK プロンプトが帰ることを確認してください。 <p> pppd が作ったロックファイルも消しておきましょう。 <code> rm -f /var/lock/LCK..cuaX </code> <sect> 接続を自動化するには - 接続用スクリプトの作り方 <p> chat を使った接続用のスクリプトを作れば、chat がログインして PPP を起動 するまで自動的に行うので、必要な作業は(ルート、あるいは ppp グループの メンバーになって)接続のためのコマンドを一つ入力するだけになります。 <sect1> ユーザ名とパスワードをつかった認証の場合 <p> 接続先の ISP が PAP/CHAP 認証を必要としない時、以下のスクリプトが使え るでしょう。 <p> ppp パッケージが正しくインストールされていれば 2 つのファイルがあらか じめサンプルとして用意されているはずです。PPP 2.1.2 の場合、そのファイ ルは <tt>/usr/sbin</tt>に、PPP 2.2 の場合は <tt>/etc/ppp/sciripts</tt> ディレクトリに入っています。それらのファイルは <p> PPP-2.1.2 の場合、 <tscreen><verb> ppp-on ppp-off </verb></tscreen> <p> PPP-2.2 の場合 <tscreen><verb> ppp-off ppp-on ppp-on-dialer </verb></tscreen> となっています。 <p> さて、PPP 2.1.2 を使っている場合、上記のサンプルファイルは削除してしま うことを強くお勧めします。これらのサンプルファイルには潜在的な問題があ りました - 「でもちゃんと動くよ」、と言わないで - 私も、それらのファイ ルを長い間使っていましたから(この HOWTO の最初のバージョンでは推薦すら していたのです) <p> PPP 2.1.2 のユーザのために、以下に PPP 2.2 のパッケージから持ってきた よりよいサンプルファイルを紹介します。以下のサンプルファイルをコピーし て、PPP-2.1.2 に付属のスクリプトの<bf>代りに</bf>使うようにお勧めしま す。 <sect1> ppp-on スクリプト <p> これは PPP 接続を開始するための 2 本のスクリプトのうち前半のものです。 <code> #!/bin/sh # # PPP 接続を開始するためのスクリプト。2 つのスクリプトのうちの 1 つめ。 # このコードは 'ps' コマンドで表示されてしまうのであまり安全ではないが、 # 簡単。 # # これらのパラメータは実際の値に変更すること TELEPHONE=555-1212 # 接続のための電話番号 ACCOUNT=george # ログイン・アカウント('George Burns'の例) PASSWORD=gracie # 上記アカウントのパスワード('Gracie Allen') LOCAL_IP=0.0.0.0 # ローカルの IP 番号。動的割りあての場合は 0.0.0.0 REMOTE_IP=0.0.0.0 # 接続先の IP 番号。普通 0.0.0.0。 NETMASK=255.255.255.0 # 必要ならばネットマスクの指定 # # ppp-on-dialer から使えるように変数を export export TELEPHONE ACCOUNT PASSWORD # # 電話をかけてログイン処理をするスクリプトの位置。$PATH 変数は connect # オプションでは使われないので絶対パスを指定すること(ルート権限でそうす # るとセキュリティホールになるので、この件については質問しないこと) # DIALER_SCRIPT=/etc/ppp/ppp-on-dialer # # 接続の開始 # exec /usr/sbin/pppd debug /dev/ttySx 38400 \ $LOCAL_IP:$REMOTE_IP \ connect $DIALER_SCRIPT </code> <p> ppp-on-dialer スクリプトはこのようになります。 <code> #!/bin/sh # # ppp-on スクリプトの後半部。実際の接続プロトコルを送る部分 # chat -v \ TIMEOUT 3 \ ABORT '\nBUSY\r' \ ABORT '\nNO ANSWER\r' \ ABORT '\nRINGING\r\n\r\nRINGING\r' \ '' \rAT \ 'OK-+++\c-OK' ATH0 \ TIMEOUT 30 \ OK ATDT$TELEPHONE \ CONNECT '' \ ogin:--ogin: $ACCOUNT \ assword: $PASSWORD </code> <sect1> PPP 起動スクリプトの修正 <p> 新しいスクリプトは 2 つに分かれているので、順に修正してみましょう。 <sect2> ppp-on スクリプト <p> スクリプトを修正して、ISP から貰ったユーザ名とパスワードを登録します。 ISP の電話番号も忘れずに変更してください。 <p> <tt>TELEPHONE=</tt> 以下の各行は実際にはシェル変数を '=' の右側の値に 設定しているので(もちろんコメントは含みませんが)、各行を修正して、実際 の ISP のものを設定してください。 <p> また、IP 番号の設定が必要な場合、<tt>/etc/ppp/options</tt> ファイルに 設定して <code> $LOCAL_IP:$REMOTE_IP \ </code> の行を削除します。 <p> 同時に DIALER_SCRIPT シェル変数が実際にダイアルするためのスクリプトの 絶対パスを指定していることを確認してください。もしダイアルのためのスク リプトを移動させたり名前を変えた場合は<tt>ppp-on</tt> スクリプトを修正 することもお忘れなく。 <p> <tt>ppp-on</tt> スクリプトを正しく設定し、接続先の PPP サーバがユーザ 名/パスワード形式の認証をしている場合、<tt>ppp-on-dialer</tt> スクリプ トを変更する必要はありません。 <p> 起動時に /etc/rc.serial でシリアルプートの設定は終えているかも知れませ んが、ppp-on スクリプトの中で明示的にシリアルポートを設定するのもいい アイデアです。そうしておけば、モデムを(シリアルポートの設定をリセット するかも知れない)他のプログラムで安心して使うこともできます。 <p> そのためには実際に pppd を開始する行の直前に以下の一行を加えます。 <code> /bin/setserial /dev/cuaX spd_vhi </code> <p> spd_vhi オプションを設定しておけば、38,400 ボーで使おうとした時に、実 際には 115,200 ボーで接続することになります。28.8k(以上の)高速モデムの 場合、このように設定しておくのがいいでしょう。しかしながら、多くの 14,400 ボーのモデムはコンピュータとデータをやりとりするシリアル回線を このようなスピードでは処理できないようです。 <p> モデムのマニュアルをチェックして、モデムのシリアル回線の最高速が 38,400 の場合、以下のように設定します。 <code> /bin/setserial /dev/cuaX spd_normal </code> <sect2>サーバ側での PPP の開始 <p> ppp-on-dialer スクリプトは、ログインすれば pppd を自動的に起動するサー バで有効ですが、ログインしてから明示的に PPP を起動しなければならない サーバもあります。 <p> サーバの PPP を起動するのに何らかのコマンドが必要な場合、ppp-on-dialer スクリプトを修正する必要があります。 <p> スクリプトの最後(パスワードの行より後)に、サーバの PPP を起動するため に <bf>必要な文字列 PPP起動コマンド</bf> の対を追加してください。PPP 起動コマンドを実行する際の文字列はログインプロンプトにします(Bourne シェ ルで特別な意味を持つ文字 - 例えば $や [ ] に注意してください) <p> こうしておけば、chat がシェルのプロンプトを受けとれば、ISP の PPP を起 動するためのコマンドを実行します。 <p> 私の場合、PPP サーバは標準的な Bash のプロンプト <code> [hartr@kepler hartr]$ </code> を送ってくるので、この文字列を受ければ <p> <code> ppp </code> と入力して、サーバの PPP を起動します。 <p> 少々文字がバケても正しく認識できるようにしておいた方がいいので、私の場 合、以下のような<文字列 送信コマンド>の組み合わせを選びました。 <code> hartr--hartr ppp </code> <p> この例では一定の時間内にプロンプトを受けとれなかった場合、キャリッジリ ターンを送って、再度プロンプトを待ちます。 <p> プロンプトを受けとれば、'ppp' という文字列を送ります。 <p> 注意:付け加えた行の前の行の行末に \ を付けて chat スクリプト全体が一 行とみなされるようにしておくことを忘れないように。 <p> 不幸なことに、接続のたびごとに異なるプロンプトを返してくるサーバもいく つかあります。そのような場合、minicom などを使って何度かサーバにログイ ンして、どのような文字列がプロンプトに使われ、そのうちのどの部分が一定 で PPP を起動するための文字列に利用できるかを調べておく必要があります。 <sect2>ppp-on-dialer スクリプト <p> これは ppp 接続を開始するためのスクリプトの後半部です。 <p> 注意:chat スクリプトは通常一行です。行末についているバックスラッシュ (\)は(人間に見やすいように)複数行に分かれている行を一行に見せるた めに使われており、スクリプトの一部ではありません。 <p> このコマンドを詳細に検討すれば実際に何が行われているか(行われるはずか) を理解できるはずです。 <sect1>chat スクリプトの意味するもの <p> chat のスクリプトは &dquot;受けとった文字列 送信する文字列&dquot;の組 み合わせを連ねたものです。すなわち、何か文字列を送信する前には何かの文 字列を受けとらなければなりません。 <p> 文字列を受けとらなくても、こちらから何かを送信するためには、空の文字列 (<tt>&dquot;</tt><tt>&dquot;</tt>)を受けとる文字列に指定する必要があり ます。同様に、何か文字列を受けとってもこちらから送信しない場合は送信す る文字列に空の文字列を指定します。また、文字列が複数の語の場合(例えば NO CARRIER)、文字列をクオートして一つの文字列と見なされるようにしなけ ればなりません。 <p> 今回の例での chat スクリプトは :- <itemize> <item><tt/exec chat -v/<newline> chat を起動します。-v オプションを指定すると、chat の行う全ての入出力 をシステムのログファイル(通常 <tt>/var/log/messages</tt>)に書きこみま す。<newline> chat スクリプトがきちんと動くようにならば -v オプションを外して不要な ログを取らないようにしましょう。 <item><tt/TIMEOUT 3/<newline> 文字列を受けとるまでのタイムアウトの時間を 3 秒にします。遅いモデムを 使っている場合、この時間を 5 秒や 10 秒にのばしてやる必要があるかも知 れません。 <item><tt>ABORT '\nBUSY\r'</tt><newline> BUSY という文字列が来れば処理を中止します。 <item><tt>ABORT '\nNO ANSWER\r'</tt><newline> NO ANSWER という文字列が来れば処理を中止します。 <item><tt>ABORT '\nRINGING\r\n\r\nRINGING\r'</tt><newline> RINGING という文字列を(繰り返し)受けとれば処理を中止します。<newline> これは誰かがモデムに電話をかけてきています! <item><tt>&dquot;&dquot; \rAT</tt> <newline> モデムから文字列が来なくても AT 文字列を送ります。 <item><tt>&dquot;OK-+++\c-OK&dquot;; ATH0</tt><newline> これは chat のエラー復旧機能を使っているので少し複雑です。このコマンド の意味は、、<newline> OK を待っていて、もし OK が来なければ(その場合はきっとモデムがコマンド モードになっていないのでしょう) +++ を送り(標準的な Hayes 互換のモデム でコマンドモードにするための命令)、再度 OK を待ち、OK が来れば ATH0(モ デムハングアップコマンド)を送ります。<newline> こうしておけば、モデムがオンラインになっている状況でもうまくいくはずで す。 <item><tt/TIMEOUT 30/<newline> これ以後のスクリプトでタイムアウトの時間を 30 秒にします。chat スクリ プトがタイムアウトで終了してしまう場合、この時間を 45 秒とかさらに長く してみてください。 <item><tt/OK ATDT$TELEPHONE/<newline> OK を待ち(ATH0 コマンドを受けたモデムは OK を返します)、電話をかけたい 番号をダイアルします。 <item><tt/CONNECT ''/<newline> CONNECT を待ち(手元のモデムが接続先のモデムにつながれば CONNECT を返し ます)ますが、返事は何も送りません。 <item><tt/ogin:--ogin: $ACCOUNT/<newline> ここでも多少のエラー復旧の仕組を入れています。ログイン・プロンプトを待ち ますが(..ogin:)、もしタイムアウト時間内に受けとれなかった場合、リター ンを送って再度ログイン・プロンプトを待ちます。プロンプトを受けとれば、 ユーザ名を送ります(ユーザ名は$ACCOUNTというシェル変数に入ってい ます) <item><tt/assword: $PASSWORD/<newline> パスワードプロンプトを待ち、パスワードを送ります(パスワードもシェル変 数に入っています) </itemize> <p> この chat スクリプトにはそれなりのエラー復旧機能が組みこまれていますが、 chat にはここで説明した以上にもいろいろな機能がありますので、詳細につ いてはマニュアルを御覧ください(<tt>man 8 chat</tt>)。 <sect1>PAP/CHAP 認証を使う場合のスクリプト <p> 接続先の ISP が PAP/CHAP 認証を使う場合、chat スクリプトはずっと簡単に なります。その場合、chat は電話をかけてつながるまで待つだけで、その後 の login 処理は pppd にまかせます。 <code> #!/bin/sh # # ppp-on スクリプトの後半部。 exec chat -v \ TIMEOUT 3 \ ABORT '\nBUSY\r' \ ABORT '\nNO ANSWER\r' \ ABORT '\nRINGING\r\n\r\nRINGING\r' \ '' \rAT \ 'OK-+++\c-OK' ATH0 \ TIMEOUT 30 \ OK ATDT$TELEPHONE \ CONNECT '' </code> <sect1>pppd のデバッグと -f で指定するオプションファイル <p> すでに見たように、pppd に -d オプションを付ければデバッグ情報が出力さ れるようになります。'debug' というオプションは -d と同じです。 <p> 新しいスクリプトで接続のテストをするのですから、今のところ debug オプ ションは付けたままにしておきましょう。(注意:pppd がやりとりする login 情報はあっというまに syslog ファイルを巨大にするので、ディスクの空き領 域が厳しい場合はトラブルを起こすかも知れません。もっとも、そうなるため には接続に失敗してしばらくの間あれこれ pppd をこねくり回す必要があるで しょうが。) <p> すべてがきちんと動いていることが確認できたらデバッグオプションを取りの ぞきましょう。 <p> ppp のオプションファイルを <tt>/etc/ppp/options</tt> や <tt>/etc/ppp/options.ttySx</tt> 以外に置いている場合、pppd の -f オプ ションでファイル名を指定します。 <code> exec /usr/sbin/pppd debug -f options.myserver /dev/ttySx 38400 \ </code> <sect>接続スクリプトのテスト <p> X ウィンドウを使っている場合は新しい Xterm を開く、あるいは新しい仮想 コンソールを開いてルートとしてログインします。 <p> このセッションでは /var/log/messages (か、システムのログファイル)を <tscreen><verb> tail -f /var/log/messages </verb></tscreen> としてメッセージを表示させておきます。 <p> 最初のウィンドウ(あるいは仮想コンソール)で次のコマンドを実行します。 <tscreen><verb> ppp-on & </verb></tscreen> <p> (/usr/sbin/ppp-on の名前を変えていればその名前で実行してください) コマンドの最後に & を付けてバックグラウンドにしなかった場合、(接続 が切れて)ppp が終了するまでターミナルにプロンプトが表示されなくなるの で御注意。 <p> これでもう一つのウィンドウに移ってシステムログの状態を調べます。 <p> (chat に -v オプションを付けて pppd に -d オプションを付けておけば)以 下のようなメッセージが表示されるはずです。前半部は chat スクリプトのメッ セージで、後半部が pppd の起動メッセージになっています。 <code> Oct 21 16:09:58 hwin chat[19868]: abort on (NO CARRIER) Oct 21 16:09:59 hwin chat[19868]: abort on (BUSY) Oct 21 16:09:59 hwin chat[19868]: send (ATZ^M) Oct 21 16:09:59 hwin chat[19868]: expect (OK) Oct 21 16:10:00 hwin chat[19868]: ATZ^M^M Oct 21 16:10:00 hwin chat[19868]: OK -- got it Oct 21 16:10:00 hwin chat[19868]: send (ATDT722298^M) Oct 21 16:10:00 hwin chat[19868]: expect (CONNECT) Oct 21 16:10:00 hwin chat[19868]: ^M Oct 21 16:10:22 hwin chat[19868]: ATDT722298^M^M Oct 21 16:10:22 hwin chat[19868]: CONNECT -- got it Oct 21 16:10:22 hwin chat[19868]: send (^M) Oct 21 16:10:22 hwin chat[19868]: expect (ogin:) Oct 21 16:10:22 hwin chat[19868]: 57600^M Oct 21 16:10:23 hwin chat[19868]: ^[[;H^[[2J^M^M Oct 21 16:10:23 hwin chat[19868]: ^M Oct 21 16:10:23 hwin chat[19868]: ^M Oct 21 16:10:23 hwin chat[19868]: ^I^I This is node kepler.hedland.edu.au^M Oct 21 16:10:23 hwin chat[19868]: ^I^I^I at Hedland Campus^M Oct 21 16:10:23 hwin chat[19868]: ^I^I^I Hedland College^M Oct 21 16:10:23 hwin chat[19868]: ^M Oct 21 16:10:23 hwin chat[19868]: ^I^I Authorised user ONLY are to use this system^M Oct 21 16:10:23 hwin chat[19868]: ^M Oct 21 16:10:23 hwin chat[19868]: ^M Oct 21 16:10:23 hwin chat[19868]: ^I^I For more information, contact ComputerSystems^M Oct 21 16:10:23 hwin chat[19868]: ^I^I^I on +61 (0)91 72 0400^M Oct 21 16:10:23 hwin chat[19868]: ^I^I^I^I or^M Oct 21 16:10:23 hwin chat[19868]: ^I^I email: help@hedunx.hedland.edu.au^M Oct 21 16:10:23 hwin chat[19868]: ^M Oct 21 16:10:23 hwin last message repeated 3 times Oct 21 16:10:23 hwin chat[19868]: kepler login: -- got it Oct 21 16:10:23 hwin chat[19868]: send (hartr^M) Oct 21 16:10:23 hwin chat[19868]: expect (ssword:) Oct 21 16:10:23 hwin chat[19868]: hartr^M Oct 21 16:10:23 hwin chat[19868]: Password: -- got it Oct 21 16:10:23 hwin chat[19868]: send (??????^M) Oct 21 16:10:23 hwin chat[19868]: expect (hartr) Oct 21 16:10:23 hwin chat[19868]: ^M^M Oct 21 16:10:24 hwin chat[19868]: Last login: Sat Oct 21 14:55:53 on ttyC0^M Oct 21 16:10:24 hwin chat[19868]: ^M Oct 21 16:10:24 hwin last message repeated 9 times Oct 21 16:10:24 hwin chat[19868]: ^I^IYou have logged into node kepler.hedland.edu.au^M Oct 21 16:10:24 hwin chat[19868]: ^M Oct 21 16:10:24 hwin chat[19868]: This is a Compaq Prolinea 486DX2/50 running Linux 1.1.54^M Oct 21 16:10:24 hwin chat[19868]: ^M Oct 21 16:10:24 hwin chat[19868]: This computer operates as the main Hedland Campus communications^M Oct 21 16:10:24 hwin chat[19868]: ^I node, providing dial-in terminal and SLIP access,^M Oct 21 16:10:24 hwin chat[19868]: ^I^I Kepler also runs the Hedland end of^M Oct 21 16:10:24 hwin chat[19868]: ^I^I the Hedland/Newman inter-Campus WAN link^M Oct 21 16:10:24 hwin chat[19868]: ^M Oct 21 16:10:24 hwin chat[19868]: ^M Oct 21 16:10:24 hwin chat[19868]: [hartr -- got it Oct 21 16:10:24 hwin chat[19868]: send (ppp^M) Oct 21 16:10:27 hwin pppd[19872]: pppd 2.1.2 started by root, uid 0 Oct 21 16:10:27 hwin pppd[19873]: Using interface ppp0 Oct 21 16:10:27 hwin pppd[19873]: Connect: ppp0 <--> /dev/cua1 Oct 21 16:10:27 hwin pppd[19873]: fsm_sdata(LCP): Sent code 1, id 1. Oct 21 16:10:27 hwin pppd[19873]: LCP: sending Configure-Request, id 1 Oct 21 16:10:27 hwin pppd[19873]: fsm_rconfreq(LCP): Rcvd id 1. Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd MRU Oct 21 16:10:27 hwin pppd[19873]: (1500) Oct 21 16:10:27 hwin pppd[19873]: (ACK) Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd ASYNCMAP Oct 21 16:10:27 hwin pppd[19873]: (0) Oct 21 16:10:27 hwin pppd[19873]: (ACK) Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd MAGICNUMBER Oct 21 16:10:27 hwin pppd[19873]: (a098b898) Oct 21 16:10:27 hwin pppd[19873]: (ACK) Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd PCOMPRESSION Oct 21 16:10:27 hwin pppd[19873]: (ACK) Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd ACCOMPRESSION Oct 21 16:10:27 hwin pppd[19873]: (ACK) Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: returning CONFACK. Oct 21 16:10:27 hwin pppd[19873]: fsm_sdata(LCP): Sent code 2, id 1. Oct 21 16:10:27 hwin pppd[19873]: fsm_rconfack(LCP): Rcvd id 1. Oct 21 16:10:27 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 1, id 1. Oct 21 16:10:27 hwin pppd[19873]: IPCP: sending Configure-Request, id 1 Oct 21 16:10:27 hwin pppd[19873]: fsm_rconfreq(IPCP): Rcvd id 1. Oct 21 16:10:27 hwin pppd[19873]: ipcp: received ADDR Oct 21 16:10:27 hwin pppd[19873]: (10.144.153.51) Oct 21 16:10:27 hwin pppd[19873]: (ACK) Oct 21 16:10:27 hwin pppd[19873]: ipcp: received COMPRESSTYPE Oct 21 16:10:27 hwin pppd[19873]: (45) Oct 21 16:10:27 hwin pppd[19873]: (ACK) Oct 21 16:10:27 hwin pppd[19873]: ipcp: returning Configure-ACK Oct 21 16:10:28 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 2, id 1. Oct 21 16:10:30 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 1, id 1. Oct 21 16:10:30 hwin pppd[19873]: IPCP: sending Configure-Request, id 1 Oct 21 16:10:30 hwin pppd[19873]: fsm_rconfreq(IPCP): Rcvd id 255. Oct 21 16:10:31 hwin pppd[19873]: ipcp: received ADDR Oct 21 16:10:31 hwin pppd[19873]: (10.144.153.51) Oct 21 16:10:31 hwin pppd[19873]: (ACK) Oct 21 16:10:31 hwin pppd[19873]: ipcp: received COMPRESSTYPE Oct 21 16:10:31 hwin pppd[19873]: (45) Oct 21 16:10:31 hwin pppd[19873]: (ACK) Oct 21 16:10:31 hwin pppd[19873]: ipcp: returning Configure-ACK Oct 21 16:10:31 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 2, id 255. Oct 21 16:10:31 hwin pppd[19873]: fsm_rconfack(IPCP): Rcvd id 1. Oct 21 16:10:31 hwin pppd[19873]: ipcp: up Oct 21 16:10:31 hwin pppd[19873]: local IP address 10.144.153.104 Oct 21 16:10:31 hwin pppd[19873]: remote IP address 10.144.153.51 </code> <p> (注意 - この例では静的な IP 番号を使っており、私のマシンからその番号を PPP サーバに送っています。動的な IP 番号の割り当てを使っていれば、その ようなやりとりは起きません) <p> うまく行ったように見えますので、以前のように IP 番号とホスト名を使って ping してみて、接続がきちんと働いているか確認します。 <p> これでつながりました。web のブラウザでも何でも使ってネットサーフしてみ ましょう。 <sect>PPP 接続の終了 <p> PPP 接続を終了させる場合、ppp-off コマンドを使います(このコマンドを実 行するためにはルート権限か PPP グループに属していなければならないこと をお忘れなく) <p> PPP の終了時にはこのようなログが出力されることでしょう。 <code> Oct 21 16:10:45 hwin pppd[19873]: Interrupt received: terminating link Oct 21 16:10:45 hwin pppd[19873]: ipcp: down Oct 21 16:10:45 hwin pppd[19873]: default route ioctl(SIOCDELRT): Bad address Oct 21 16:10:45 hwin pppd[19873]: fsm_sdata(LCP): Sent code 5, id 2. Oct 21 16:10:46 hwin pppd[19873]: fsm_rtermack(LCP). Oct 21 16:10:46 hwin pppd[19873]: Connection terminated. Oct 21 16:10:46 hwin pppd[19873]: Exit. </code> <p> <tt>SIOCDELRT</tt> というメッセージが出ていますが、これは単に pppd が 終了しているということを示しているだけなので 気にする必要はありません。 <sect>デバッグ <p> 接続がうまくいかないことには無数の理由があります - 例えば chat が正し く終了しなかったり、電話回線にノイズが多かったり。問題が起きたら、まず syslog ファイルを調べてみましょう。 <p> もっとも<bf>よくある</bf>間違いはスクリプトの中に何か打ち間違いがある ことです。スクリプトをあらためてじっくりと見直してみましょう - 我々人 間は実際に打ちこまれた文字ではなく、打ったつもりの文字を読んでしまいが ちなことを忘れずに。 <p> もう一つ、よくある間違いはカーネル 1.2.X と PPP-2.2 を使っていたり、 カーネル 1.3.X/2.0.X と PPP-2.1.2 を使っている例です。カーネルのバージョ ンにあった pppd を使ってください。 <p> それでもダメな場合、PPP FAQ に目を通しましょう(PPP FAQ は PPP に関する 質問と答を集めたものです)、この FAQ はさまざまな領域をカバーしており、 たいていの問題に対する解答が用意されています。私自身の(悲しい)経験から 言うと、もしこの FAQ に答が無ければ、問題は ppp に関するものではありま せん。私の場合は ELF 版のカーネルを使いながらカーネルモジュールを適切 なものにバージョンアップしていない、というものでした。私は、完璧な PPP サーバとは何かとボヤきながら 2 日(とほぼ一晩)を過してしまいました。 <sect1> PPP をコンパイルしたのですが、Linux が認識してくれません。 <p> カーネル 1.3.X/2.0.X を使って、カーネルにモジュールサポート機能を組み こんで、PPP 機能をモジュールとしてコンパイルし(してモジュールを組みこ み)ましたよね? <p> kerneld を使って必要なモジュールを自動ロードさせていない場合、PPP を使 う前に明示的に ppp モジュールをロードする必要があります(多分シリアルド ライバモジュールもロードする必要があるでしょう)。 <p> これを手動でやるためには、ルートになって <code> insmod ppp </code> します。 <p> シリアルドライバモジュールをロードする場合は、 <code> insmod slhc </code> します。 <p> しかしながら、カーネルモジュールは自動ロードするようにした方が便利です。 kerneld mini-howto を読んで、自動ロードするように設定しましょう。 <p> もう一つの可能性は、Linux 2.0.x で ppp-2.1.2 を使っている場合です(ある いは 1.2.x のカーネルに必要なパッチをあてずに ppp-2.2 を使っている場合)。 <p> カーネルと ppp のバージョンをもう一度チェックしてください。繰り返しま すが、 <p> <bf>カーネルの 2.0.x は ppp-2.2 を必要とします。</bf> <p> <bf>カーネル 1.2.x は ppp-2.1.2 を使いますが、ppp-2.2 を使うためのパッ チがあります。</bf> <sect1>デフォルトルート(default route)を設定できません。 <p> LAN 用のイーサネット(かその他ネットワーク接続)を使っていて、すでにデフォ ルトルートを設定していませんか。 <p> '2 つのネットワークを PPP を使って接続する方法'の章がこのための正しい 方法を(簡単に)解説しています。 <p> 問題はデフォルトルートは一つしか設定できないことです。デフォルトルート とは、<tt>特定の</tt>経路宛てではないパケットが全て送られる経路です。 通常、デフォルトルートはインターネット宛てになっているはずです。 <p> 不幸なことに、いくつかの Linux のディストリビューションではローカルな イーサネットをデフォルトルートにするように設定しています。イーサネット を初期化しているシステムの設定ファイルを修正して、ルーティング情報を修 正し、ローカルなイーサネットにはデフォルトルートではなく、特定のルーティ ング情報を設定するようにする必要があります。 <p> このためには NET2-Howto と Linux Network Administrator Guide を調べて ください。 <sect>2 つのネットワークを PPP でつなぐには <p> 基本的に一台の Linux PC を PPP サーバに接続する場合も 2 つの LAN を PPP を使って接続する場合も違いはありません。PPP は <tt>一対一</tt>のプ ロトコルであることをお忘れなく。 <p> しかしながら、2 つの LAN を接続する場合、経路制御をどうすべきかを <bf>きちんと</bf>理解しておく必要があります。NET-2 howto と Linux Network Adminitrator Guide(NAG)を読みましょう。また、O'Reilly and Assoc から出ている&dquot;TCP/IP Network Administration(ISBN 0-937175-82-X) も役立つことでしょう。 <p> 2 つの LAN を接続するためには、異なる IP ネットワーク番号を設定し(ある いは同じネットワーク番号でもサブネット化する)静的な IP 番号を使うか、 IP masquerade を使わなければいけません。IP masquerade を使う場合の設定 については IP masquerade mini-howto を御覧ください。 <sect1>IP 番号の設定 <p> 接続先の LAN の管理者と相談し、PPP インターフェイスの両端で使う IP 番 号を決めます。静的な IP 番号を使う場合、特定の電話番号を使う必要もある でしょう。 <p> 次に <tt>/etc/ppp/options[.ttyXX]</tt> ファイルを修正する必要がありま す。LAN 間接続用に決まったモデムとポートを使うようにしておくのがいいで しょう。そのためには <tt>/etc/ppp/options</tt> ファイルも修正しなけれ ばならないかも知れません。合わせて、LAN 間接続以外の接続のためにも適切な options.ttyXX ファイルを作る必要があります。 <p> 静的な IP 番号を使う例で示したように、あなたの側の PPP 端に適切な IP 番号を指定してください。 <sect1>経路の設定 <p> ローカルの LAN から PPP 接続を経由してパケットを流す経路を設定する必要 があります。このためには 2 つの段階が必要です。 <p> まず最初に、PPP 接続をしているマシンから接続先のネットワークへの経路を 設定します。接続先がインターネットの場合、pppd に `defaultroute' オプ ションを付ければこの経路が設定できます。 <p> 2 つの LAN をつなぐために PPP 接続を使う場合は特定のネットワークルート を指定しなければなりません。そのためには/etc/ppp/ip-up スクリプトに route コマンドを加えます。この方法については「接続が完了してから、、」の 章を御覧ください。 <p> 次に、ローカルの LAN に接続されている他のコンピュータへ、あなたの Linux マシンが ppp で接続しているネットワークへの 'gatway' になってい ることを知らせます。 <p> もちろん、接続先のネットワークの管理者も同じことをしなければいけません。 しかしながら、彼(女)があなたのネットワークへパケットを送ってくるにはデ フォルトルートではなく、<bf>特定のネットワークルート</bf>が必要です(接 続先の LAN があなたのマシンを経由してインターネットへ接続している場合 を除いて)。 <sect1>ネットワークセキュリティ <p> LAN を PPP 経由でインターネットにつないだり &dquot;外部の&dquot; LAN と接続すると、セキュリティにも注意を払う必要があります。ファイアウォー ルを設置することを早急に考えるように強くお勧めします。 <sect>接続が確立した後、、 <p> PPP 接続が確立したら、pppd は <tt>/etc/ppp/ip-up</tt> をチェックします。 このスクリプトが存在して実行可能になっていたら PPP デーモンはそのスク リプトを実行します。ですから、このスクリプトに PPP 接続を使う場合に実 行したい特別の経路情報の設定やその他の必要な設定をするためのコマンド を書いておけば、PPP 接続のたびに自動的に実行できます。 <p> <tt>/etc/ppp/ip-up</tt>は普通のシェルスクリプトで構わないので、シェル スクリプトで可能なことは何でもできます(やりたいことは何でもできます)。 <p> 例えば、このシェルスクリプトの中で sendmail を使って mail queue に溜っ ているメールを送りだすようなことも可能です。 <p> 同様に、ip-up に(pop を使って)メールを取りこむようなコマンドを設定し、 ISP に届いているメールを自動的に取りこむことも可能です。 <sect1>特別の経路設定 <p> 2 つの LAN を接続する場合、'外部の' LAN へ向いた特別の経路情報を設定し てやる必要があります。これも <tt>/etc/ppp/ip-up</tt> スクリプトの中で 設定するのが簡単でしょう。問題になるのは、複数の PPP 接続を使う場合で す。 <p> <tt>/etc/ppp/ip-up</tt> は全ての ppp 接続の際に実行されるスクリプトな ので、接続に応じた必要な経路制御に関するコマンドが正しく実行されるよう に注意深く設定してやる必要があります。 <p> このためには pppd がこのスクリプトに渡すパラメータを使って bash の 'case' 文で条件分岐してやるのがいいでしょう。例えば、以下に示すものは、WAN 接 続と私の自宅へのイーサネット接続を使いわけるためのスクリプトです(両者 とも同じ ppp サーバを使っています) <code> #!/bin/bash # pppd で必要に応じてルーティングを設定するためのスクリプト # Newman campus へのリンクにのみルーティングが必要 # # ppp 接続の際、このスクリプトは以下のような引数で呼び出される。 # $1 pppd が使うインターフェイス名(例:ppp3) # $2 tty デバイス名 # $3 tty デバイス速度 # $4 インターフェイスのローカル IP アドレス # $5 リモートの IP アドレス # $6 pppd の ipparam オプションで指定するパラメータ # case "$5" in # Newman Campus のサーバへのルーティングを設定 202.12.126.1) /sbin/route add -net 202.12.126.0 gw 202.12.126.1 # メールキューに溜っているメールを送りだす。 /usr/sbin/sendmail -q & ;; 139.130.177.2) # インターネット接続 # タイムサーバが動いてなければ接続時に起動して、世界の時刻と同期する。 if [ ! -f /var/lock/subsys/xntpd ]; then /etc/rc.d/init.d/xntpd.init start & fi # ニュースサーバの起動(動いてなければ) if [ ! -f /var/lock/subsys/news ]; then /etc/rc.d/init.d/news start & fi ;; 203.18.8.104) # # 自宅のマシンにメールを送りこむ。自宅のイーサネットはIP masqeurade と # proxy arp のルーティングになっているのでルーティングは不要 /usr/sbin/sendmail -q & ;; *) esac exit 0</code> <p> Newman campus へこのスクリプトで接続した場合、以下に示すようなルーティ ングテーブルが設定されます(このマシンは私たちのダイアルアップ PPP サー バ兼インターネット接続マシンです)。それぞれのエントリが何を示すかのコ メントを付けておきました。 <code> [root@kepler /root]# route -n Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface # インターネットゲートウェイへのホストルート 139.130.177.2 * 255.255.255.255 UH 1500 0 134 ppp4 # Newman campus サーバへのホストルート 202.12.126.1 * 255.255.255.255 UH 1500 0 82 ppp5 # 私の自宅のイーサネット LAN へのホストルート 203.18.8.104 * 255.255.255.255 UH 1500 0 74 ppp3 # 公開している 2 つのダイアルアップ PPP 用回線 203.18.8.64 * 255.255.255.255 UH 552 0 0 ppp2 203.18.8.62 * 255.255.255.255 UH 552 0 1 ppp1 # Newman campus LAN へのネットワークルート 202.12.126.0 202.12.126.1 255.255.255.0 UG 1500 0 0 ppp5 # ローカルのイーサネットへのルート(2 つの連続するクラス C のネットワーク # を接続しています) 203.18.8.0 * 255.255.254.0 U 1500 0 1683 eth0 # loop back デバイスへのルート 127.0.0.0 * 255.0.0.0 U 3584 0 483 lo # インターネットへのデフォルトルート default 139.130.177.2 * UG 1500 0 3633 ppp4 </code> <sect1>e-mail の処理 <p> 前節では接続が確立した時に単純にメールキューをフラッシュするという方法 で外へ送り出すメールをどう処理するかを示しました。 <p> WAN 接続の場合、接続先の LAN のネットワーク管理者と相談して同じことを することが可能です。例えば、我々の WAN 接続では Newman Campus 側の <tt>/etc/ppp/ip-up</tt> スクリプトはこのようになっています。 <code> #!/bin/bash # # pppd に必要なルーティング情報の設定 # Hedlan 宛ての接続の場合のみに必要 # # ppp 接続の際、このスクリプトは以下のような引数で呼び出される。 # # $1 pppd が使うインターフェイス名(例:ppp3) # $2 tty デバイス名 # $3 tty デバイス速度 # $4 インターフェイスのローカル IP アドレス # $5 リモートの IP アドレス # $6 pppd の ipparam オプションで指定するパラメータ case "$5" in 203.18.8.4) /usr/sbin/sendmail -q ;; *) esac exit 0 </code> <p> ISP 接続で IP アドレスを動的に割りあてる PPP 接続しか使えない場合でも ISP のマシンにあるあなた宛のメールを取りこみたい場合があるでしょう。こ の場合、一般的には POP(Post Office Protocol)を使います。POP は 'popclient' プログラムで扱え、ip-up スクリプトで設定することで自動化することが可能 です。 <p> 適切な設定で popclient を起動するスクリプトのみを含む <tt>/etc/ppp/ip-up</tt> を用意します。Red Hat Linux の入っているラップトップ機(旅行の必需品で す)では、このようにしています。 <code> popclient -3 -c -u hartr -p <password> kepler.hedland.edu.au |formail -s procmail </code> <p> ニュースについても同様のことが slurp などのプログラムを使うことで可能 です。ip-up スクリプトは単なる bash スクリプトなので PPP 接続が立ちあ がったときに毎回行うべきどんな仕事でもさせることが可能です。 <sect>リンクの終了 <p> ルート権限で使えば、既存の /usr/bin/ppp-off スクリプトで問題なく接続を 終了できるはずです。変更したいところは、sendmail がメールを転送してい る場合はしばらく終了を待つようにするぐらいでしょう。 <p> これは宿題として残しておきましょう。 <p> もう一つ、接続を終了する場合にのみ実行されるスクリプトを作ることもでき ます。このスクリプトは /etc/ppp/ip-down です。このスクリプトで /etc/ppp/ip-up スクリプトが行なった変更を復旧させることが可能です。 <sect>LAN のルーティングに関わる問題 <p> LAN に接続しながら PPP を使いたい場合、(イーサネットインターフェイスを 経由して接続する) LAN へ送るパケットと接続先の PPP サーバからその先へ 送るパケットの経路制御について考慮する必要があります。 <p> このセクションでは経路制御を詳しく紹介するつもりはありません - 単純な (静的)経路制御の例を一つ紹介するに留めます。 <p> 経路制御についてよく知らなければ Linux Network Administrator Guide(NAG)に目を通されるように強くお勧めします。また、O'Reilly から出 ている "TCP/IP ネットワーク管理"もこの問題を分りやすく扱っています。 <p> 静的な経路制御の基本的なルールは、デフォルトルートがほとんどのネットワー クアドレスを指している、というものです。それ以外のネットワークアドレス にはそれぞれにルーティング情報を登録します。 <p> ここで扱う唯一の状況はインターネットに接続していない LAN につながって いる Linux マシンがあって、LAN を使いつつ電話回線経由でインターネット を個人的に利用したい、という例です。 <p> まず、イーサネットへの経路がデフォルトルートではなく、特定のネットワー クアドレスを指定するルーティングになっていることを確認してください。 <p> これは route コマンドでチェックします。route -n とすれば以下のようなコ マンドが表示されます。 <tscreen><verb> [root@hwin /root]# route -n Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface loopback * 255.255.255.0 U 1936 0 50 lo 10.0.0.0 * 255.255.255.0 U 1436 0 565 eth0 </verb></tscreen> <p> もしイーサネットインターフェイス(eth0)がデフォルトの経路になっている場 合(eth0 の行の最初の行が "default" になります)、イーサネットの初期化ス クリプトを修正して、デフォルトの経路ではなく特定のネットワークアドレス を指すように修正します(詳細は Net2 HOWTO と NAG を見てください)。 <p> こうしておけば、pppd の接続をデフォルトの経路にすることが可能です: <tscreen><verb> [root@hwin /root]# route -n Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface 10.144.153.51 * 255.255.255.255 UH 488 0 0 ppp0 127.0.0.0 * 255.255.255.0 U 1936 0 50 lo 10.1.0.0 * 255.255.255.0 U 1436 0 569 eth0 default 10.144.153.51 * UG 488 0 3 ppp0 </verb></tscreen> <p> ご覧のように PPP サーバ(10.144.153.51)へは ppp0 を経由するホストルート が登録され、その PPP サーバをゲートウェイにするようにデフォルトの経路 が定義されています。 <p> もっと複雑な経路制御が必要な場合、先に述べたドキュメントを読み、あなた のサイトのエキスパートに尋ねてください。 <p> 接続している LAN がルータにつながっている場合、そのサイトのより大きな ネットワークへ接続するためのゲートウェイが設定されているはずです。その 場合でも、デフォルトルートを PPP インターフェイスにして、その他の経路 はそれぞれのネットワークへ向けることが可能です。 <sect1>セキュリティについてのメモ <p> 既存の LAN に接続している Linux マシンを PPP 経由でインターネットに接 続する場合、その LAN 全体を潜在的にインターネットへ解放していることに なります - そこにはクラッカーの危険があります。PPP 経由でインターネッ トに接続するまえにはあなたの組織のネットワーク管理者に相談し、セキュリ ティに関する方針を確認するように強くお勧めします。もしあなたの PPP 接 続を経由してあなたのサイトが攻撃されれば、同僚やネットワーク/システム 管理者の非難の的になることでしょう。さらに深刻な問題を引きおこす危険も あります。 <p> LAN をインターネットに接続する前には、動的な IP アドレス用いて接続した り、先に触れた O'Reilly の "Building Internet Firewalls" を読んで、よ り安全な接続方法を考えてください。 <sect>どうしようもないときに。 <p> PPP 接続がうまくいかない場合、この文書を再度読んで、全てをチェックし直 してください。同時に "chat -v..." コマンドの出力や "pppd -d" の出力を システムのログファイルから調べてみましょう。 <p> PPP に関するドキュメントや FAQ など、この文書で紹介している文書にも目 を通してみてください。 <p> それでもうまく行かない場合、comp.os.linux.misc か comp.os.linux.networking のニュースグループに投稿してみましょう。これ らのニュースグループは comp.protocols.ppp 同様、PPP に詳しい人がよく読 んでいます。 <p> 私宛てに e-mail をしてもらっても結構ですが、私にも仕事(と生活)がありま すので、すばやく返事できるかは保証の限りではありません(あるいは全くで きないかもしれません)。それらは仕事の負荷や個人的な生活の状況に依存し ます。 <p> 一言注意しておきますが、<bf>膨大なデバッグ出力をニュースグループに投稿 したり私あてに送ってこないでください。</bf> 前者はネットワークの帯域の 浪費ですし、後者は /dev/null 送りになります(私が特にその出力を見せてほ しいと頼んだ時以外) <sect>接続がうまくいってから起きやすい問題 <p> 問題の一つは、多くのサービスプロバイダが接続用の新しいソフトウェアパッ ケージしかサポートしていないことです。これは(典型的に) Microsoft Windows で見られます :-( 加えて、多くのプロバイダの質問窓口は Unix(Linux)のことを全く知りません。ですから、彼らからの助けはほとんど 無いと覚悟しておいてください。 <p> もちろん、個人的な形で彼らに Linux を教えてやることも可能です(ISP の質 問窓口の担当者はインターネットのことには詳しく、自宅に Linux マシンを 持っている可能性もあります) <sect1>PPP サーバから先へ接続できません。 <p> PPP 接続がつながって、PPP サーバへ IP 番号を指定して ping できるけど (PPP サーバの IP 番号は ifconfig コマンドで ppp0 に "remote" と表示さ れるている IP 番号です)、そこから先へは行けない、という問題ですね。 <p> まず /etc/resolv.conf でネームサーバに指定した IP 番号へ ping してみま す。これがうまく行くようならば、PPP サーバから先へパケットが届いていま す(PPP サーバとネームサーバが同じマシンの場合は除く)。次にサービスプロ バイダのマシンをホスト名(FQDN)で指定して ping してみましょう。例えば、 <tscreen><verb> ping my.provider.net.au </verb></tscreen> <p> これではダメな場合、ホスト名の IP アドレスへの変換がうまくいっていませ ん。多分 /etc/resolv.conf に typo があるのでしょう。/etc/resolv.conf を注意深くチェックして、プロバイダから教えてもらった通りになっているか チェックしてください。間違いが見付からなければ、プロバイダに電話をかけ て、書きうつした IP 番号が正しいか確認してください。 <p> それでもダメなら(プロバイダのネームサーバが正しく働いていることを確認 して)、どこか別のところに問題があるのでしょう。システムの設定が正しい か詳しくチェックしてみることをお勧めします(特にファイルパーミッション に注意)。 <p> それでもプロバイダのネームサーバに IP 番号でも ping できない場合、ネー ムサーバが止まっているか(電話を掛けて確認してみます)、プロバイダ側の経 路制御に問題があるのかも知れません。それらについてプロバイダに再度確認 してみましょう。 <p> 一つの可能性としては、接続先も Linux を使った PPP サーバで IP forwarding オプションがカーネルに組みこまれていないのかも知れません! <p> 一般的なテスト方としては、もっともよく使われている Microsoft Windows 用のソフトウェアを使って試してみることです。同じアカウントで、別の OS ならばうまく接続できるような場合、問題はあなたの Linux にあって、サー ビスプロバイダの側ではありません。 <sect1>e-mail を出せるんですが受けとれません。 <p> 動的な IP アドレスの割り当てを受けている場合、それが普通です。後に触れ る「各種サービスの設定」を御覧ください。 <sect1>なぜ他の人が finger や WWW, gopher、talk で私のマシンに接続できないのでしょう。 <p> 動的な IP アドレスの割り当てを受けている場合、それが普通です。後に触れ る「各種サービスの設定」を御覧ください。 <sect>動的な IP 番号でインターネットの各種サービスを使うには <p> IP 番号を接続の度に動的に割りあててもらっている場合(特別の料金を払わな い限り、多くのサービスプロバイダが動的な IP アドレスの割り当てしかして くれません)、多少の制限があることを覚悟しなければいけません。 <p> その場合でも外へ向けてのリクエストは問題なく動きます。すなわち、 sendmail 経由でメールも送れますし、ftp でファイルを取ってきたり、他の マシンのユーザに finger したり、web を見たりすることなどは可能です。 <p> 接続していない状態で、自分のマシンに取りこんでおいた e-mail に返事を書 くことも可能です。その場合、出したメールは次に ISP に接続するまでメー ルキューに溜っています。 <p> しかし、あなたのマシンは 24 時間インターネットに接続しているわけではな く、接続の度に同じ IP 番号をもらうわけでもありません。ですから、直接あ なたのマシンが e-mail を受けとることは不可能で、web や ftp のサーバを 用意して友達にアクセスしてもらうようなことも困難です。あなたのマシンに はユニークな IP 番号が付いていないため、インターネットの側から見る限り、 あなたのマシンはいつも存在しているものとは見なされません(別のマシンが同 じ IP アドレスを割りあてられていることをお忘れなく) <p> WWW サーバ(やその他のサーバ類)を設定したとしても、あなたのマシンがインター ネットに接続しており、その時点で割りあてられている IP 番号が分からない 限り、誰もあなたのマシンを知ることができません。友人にあなたのマシンが どういう IP 番号で接続しているかを知らせるためには、電話をかけることか ら e-mail、(プロバイダがシェルアカウントを用意してくれる場合)プロバイ ダに置いている ".plan" ファイルで知らせることまで、さまざまな方法があ ります。 <p> ほとんどのユーザにはこれは特に問題にはならないでしょう。普通の人が必要 とするのは e-mail の送受信と(プロバイダのアカウントで可能です)、WWW や ftp といったインターネット上の各種サービスを利用することですから。もし、 あなたのサーバへ接続させる必要がある場合、固定した IP 番号を割りあてて もらう必要があります。あるいは、上で示した方法をヒントにして、自分でや り方を開発してください。 <sect1>e-mail の設定 <p> 動的な IP アドレスの割り当てを使う場合でも正しく設定しておけばローカル に作成した e-mail を自由に出すことは可能です。sendmail の設定はやっか りで面倒な作業です。ですから、この文書では sendmail の設定法については 触れずに、接続先の ISP のメールサーバをあなたのメールのリレーホスト (<tt>sendmail.cf</tt> の <bf>DS</bf> オプション)として使う方法のみ説明 します。(sendmail の設定の詳細については sendmail の文書類と sendmail と共に配布されている m4 の設定集を読んでください。必要な情報は確実にそ の中にあるはずです。) <p> Sendmail については優れた本が何冊も出版されています(O'Reilly and Associates からのバイブルが有名です)が、ほとんどのユーザにとっては詳し すぎるでしょう。 <p> sendmail を設定すれば、外へ送り出すキューに溜ったメールを PPP 接続が成 立するとすぐに送りだすように設定したくなるでしょう。このためには <tt>/etc/ppp/ip-up</tt> スクリプトに <tscreen><verb> sendmail -q & </verb></tscreen> というコマンドを追加します。 <p> 動的 IP 割り当てでは送られてきたメールを受けとる際に問題となります。こ の問題を解決するには、 <itemize> <item>メーラプログラム(MUA)を設定して、返信メールは全て "reply to" ヘッダで 指定した ISP のアドレスに送られるようにする方法。<newline> 可能ならば、FROM 行のアドレスも ISP のアドレスにしておく方が いいでしょう。 <item>こうしておいて、popclient プログラムを使ってサービスプロバイダか らメールを取りこみます。 </itemize> <p> popclient を使ってメールを取りこむコマンドも必要ならば <tt>/etc/ppp/ip-up</tt>スクリプトに組みこんで接続が成立した時に自動的 に行なうことも可能です。 <sect1>ローカルなネームサーバの設定 <p> ネームサーバは接続先の ISP が設定したものを使えば問題はありませんが、 ローカルにキャッシュ機能のみを持った(セカンダリ)ネームサーバを ip-up スクリプトの中で立ちあげることも可能です。ローカルな(キャッシュ機能の みを持った)ネームサーバを立ちあげる利点は、長い接続時間の間に何度も繰 り返し同じサイトにアクセスするような場合に時間(と帯域)の節約になること です。 <p> キャッシュ機能のみを使うネームサーバの DNS の設定はごく単純です (named.boot ファイルの &dquot;forwarders&dquot;行に ISP の DNS を指定 するだけです)。O'Reilly の &dquot;DNS and Bind&dquot;が必要なこと全て を解説しています。 <p> また、DNS-HOWTO も役に立つでしょう。 <p> ネチケットについて一言:キャッシュ機能のみを使うセカンダリのネームセー バを立ちあげる場合には ISP に連絡して許可をもらうようにしてください。 正しく設定されば、ローカルな DNS を上げたところで ISP には何の影響も及 ぼしませんが、間違った場合、トラブルが生じることもあります。 <sect>PPP サーバの設定 <p> 既に述べてきたように、PPP サーバを設定する方法はいくつもあります。ここ で紹介するのは(Cyclades のマルチポートシリアルカードを使って)私が使っ ている方法で、電話回線は一つの番号に複数の回線が接続するロータリーダイ アル式になっています。 <p> ここで紹介した方法がお気に召さなければ、ぜひ自分流の方法でやってみてく ださい。この HOWTO の将来のバージョンではいろいろな設定方法を紹介しよ うと思っているので、コメントや試した方法について教えてください。 <p> ここで説明するのは Linux を PPP サーバとして設定する話のみで、特別なター ミナルサーバについての説明などは(一切)するつもりはありません。 <p> また、私は shadow password を試したことがありません(いつかやってみたい のですが)。ですから、以下に説明する話は shadow password 環境については 一切あてはまりません。 <sect1>カーネルのコンパイル <p> 今までに述べてきたカーネルのコンパイルやカーネルのバージョンと pppd の バージョンの問題全てがあてはまります。この章では今までに述べてきたこと 全てに目を通されたものとして話を進めます。 <p> PPP サーバ用にはカーネルに IP forward機能を組みこむことが<bf>必須 </bf>です。必要ならばその他の機能(例えば IP ファイアウォールや IP アカ ウンティングなど)も組みこんでください。 <p> マルチポートシリアルカードを使う場合、必要なドライバを組みこむのを忘れ ないように。 <sect1>サーバシステムの概要 <p> 電話回線を経由して PPP(と SLIP)で接続してくるユーザ用にユーザアカウン トとシェルアカウントをユーザ名/パスワードのペアを使って提供します。こ うしておけば(我々にとって有利なことに)ユーザが必要になるのは一つのアカ ウントのみで、そのアカウントで全ての接続を行うことになります。 <p> 私たちは教育機関の人間で、スタッフや学生のアクセスに課金しません。です から、接続時間の管理や接続料の請求には煩わされないことにします。 <p> インターネットと私たちのサイトの間にはファイアウォールを設け、ファイア ウォール内部へ電話回線経由でアクセスしてくるユーザが外部へアクセスする のを制限します(実際には内部にもいくつかファイアウォールがあるのですが、 それらについては必要ないので触れません) <p> ユーザが PPP で接続してくる手順としては(もちろん有効なアカウントを持っ たユーザです): <itemize> <item> ロータリー式になっている番号に電話をかける(これは一つの電話番号 に複数のモデムがつながっており、かかってきた電話は最初の空いているモデ ムに接続します) <item>正しいユーザ名とパスワードを使ってログイン。 <item>シェルプロンプトで <tt>ppp</tt> コマンドを使ってサーバの PPP を起動 <item>PC 側の PPP を起動(ユーザ側は Windows でも DOS でも、Linux でも MAC OS でも、何でも構いません) </itemize> <p> サーバはそれぞれの<tt>/etc/ppp/options.ttyXX</tt> ファイルを使って、そ れぞれのポートごとに異なる IP 番号を接続先にセットします(接続する側か らすると動的な IP 割りあてになります)。サーバは接続してくるクライアン トに proxyarp ルーティングを使って経路を作ります(pppd のオプションで指 定します)。こうしておけば routed や gated は不要になります。 <p> ユーザが接続を切った場合、pppd が接続断を認識してモデムに回線を切るよ うに命じ、同時に PPP 接続も終了するようにします。 <sect1>ソフトウェアを集める <p> 以下のようなソフトウェアが必要です。 <itemize> <item>Linux。必要な機能を正しく組みこんでおくこと。 <item>カーネルのバージョンに合った pppd。 <item>モデムとの接続をきちんと処理する 'getty' プログラム。 私たちは getty_ps2.0.7h を使っていますが、mgetty の方がいいように思い ます。聞いたところによると mgetty は pap/chap を使った接続も正しく認識 して(pap は Windows95 で標準になっています) pppd を自動的に起動するそ うなのですが、まだ試したことはありません。 <item>電話回線経由で接続してくるユーザが使える DNS サーバ。<newline> 可能ならば自らの DNS サーバを立ちあげましょう。 </itemize> <sect1>標準的な(シェル経由の)接続。 <p> PPP サーバを設定する前に Linux が正しく電話を受けられることを確認して おいてください。 <p> <bf>この HOWTO ではその部分は扱いません。選んだ getty のドキュメントや serial HOWTO を御覧ください。</bf> <sect1>PPP のオプションファイルの設定 <p> <tt>/etc/ppp/options</tt> には全てのポートに共通するオプションを設定し ます。私たちが使っているオプションは: <code> asyncmap 0 netmask 255.255.254.0 proxyarp lock crtscts modem </code> <p> 注意 - 私たちは(明示的に)経路を指定していません - 加えてデフォルトルート オプションも指定していません。なぜなら、(PPP サーバにとって)必要な機能 は ppp クライアント<bf>から</bf>のパケットを LAN/Internet へ送りだし、 LAN/Internet からのパケットをクライアント<bf>へ</bf>送りだすことだけだか らです。 <p> このために必要なのはクラアントマシンへのホストとしての経路とpppd に与 える 'proxyarp' オプションだけです。 <p> proxyarp オプションを指定すると(驚くべきことに) PPP サーバの arp テー ブルに「PPP クライアント宛てのパケットは全て私に送って」という意味にな るエントリが作成されます。これが一台の PPP クライアントへの経路を作る もっとも簡単な方法です。しかしながら、この方法では 2 つの LAN を結びつ けることはできません。そのためには proxy arp ではなく正しくネットワー クルートを定義してやる必要があります。 <p> 電話回線経由で接続してくるユーザに動的に IP アドレスを割りあてるために は、ポートごとに IP 番号を割りあてておきます。そのためには <tt>/etc/ppp/options.ttyXX</tt> をポートごとに作っておきます。 <p> このファイルにはローカル(サーバ側)の IP 番号とそのポートに割りあてる IP 番号を記述しておきます。例えば: <code> kepler:slip01 </code> このファイルには有効なホスト名を指定できることに注意してください(私の 憶えている IP 番号は本当に核となるマシンとネットワークデバイスのみでし た。ホスト名は数字よりも意味があるので記憶しやすいでしょう)。 <sect1>pppd をユーザが(うまく)動かせるように設定する <p> ppp 接続を開始する際にはカーネルのデバイス(ネットワークインターフェイ ス)を設定し、カーネルのルーティングテーブルを操作しなければいけません ので、ルート権限が必要になります。 <p> 幸いなことに、pppd は uid を root にしても「安全」なようにデザインされ ているので、 <code> chmod u+s /usr/sbin/pppd </code> しておきます。 <p> このファイルを ls -l すると次のように表示されます。 <code> -rwsr-xr-x 1 root root 74224 Apr 28 07:17 /usr/sbin/pppd </code> <p> こうなっていないとユーザが ppp 接続を開始することができません。 <sect1>pppd 用のエイリアスの設定 <p> 接続してくるユーザに分りやすいように、<tt>/etc/bashrc</tt> にエイリアスを 設定して、ログインすれば一つのコマンドだけで ppp を起動できるようにし ておきましょう。 <p> 私たちはこういうエイリアスを作っています。 <code> alias ppp="exec /usr/sbin/pppd -detach" </code> <p> このエイリアスの意味は <itemize> <item>exec : 現在動いているプログラム(この例ではシェル)に替えて、指定したプ ログラムを起動。 <item>pppd -detach : pppd を fork してバックグラウンドに入らないように して起動。こうしておけば pppd が終了した時に(PPP 接続中に起動した)プロ セスも全て終了します。 </itemize> ユーザがログインしてくれば、'w' コマンドで以下のように表示されます。 <code> 6:24pm up 3 days, 7:00, 4 users, load average: 0.05, 0.03, 0.00 User tty login@ idle JCPU PCPU what hartr ttyC0 3:05am 9:14 - </code> <p> これでお終い。初めに言った通り、単純で基本的な PPP サーバシステムが出 来上がりました。 <sect>PPP をヌルモデム(シリアル直結)で使うには <p> これは間にモデムが無い分、ずっと簡単です。 <p> まず、'サーバ'となるマシンを選び、シリアルポートに getty の設定をして、 minicom などの通信ソフトを使ってシリアルポートに'クライアント'が接続で きるかテストします。 <p> 機能することが確認できれば getty は削除してしまって構いません。もっと も、電話回線の場合のように、ユーザ名とパスワードを使って接続を認証する 場合は getty を残しておきます。ただし、シリアルで直結するような場合、 双方のマシンとも目の届く範囲にあるはずなので、普通は特に認証する必要は ないでしょう。 <p> 次に、サーバ側の getty を外すと同時に、双方のマシンのシリアルポートが setserial で正しく設定されているか確認してください。 <p> これで双方のマシンで pppd を起動するだけです。例えば /dev/cua4 に接続 している場合、双方のマシンで以下のコマンドを実行します。 <code> pppd -detach crtscts lock <local IP>:<remote IP> /dev/cua4 38400 & </code> <p> これで接続が成立します - しかし、これだけでは経路情報が設定されていま せん。双方のマシンで ping で接続していることを確認し、大丈夫なようなら 一旦 pppd プロセスを kill して接続を終了させます。 <p> もちろん、必要となる経路情報は何をしたいかによって異なりますが、このよ うな形態の接続をする場合、一般的に片方ののマシンがイーサネット(とその 先)に接続しているはずなので、PPP サーバとクライアントの形の経路情報が 必要になるでしょう。 <p> ですから、イーサネットに接続されたマシンでは pppd をこのように起動しま す。 <code> pppd -detach crtscts lock proxyarp <local IP>:<remote IP> /dev/cua4 38400 & </code> <p> もう一方のマシンでは <code> pppd -detach crtscts lock defaultroute <local IP>:<remote IP> /dev/cua4 38400 & </code> とします。 複数のネットワークを(シリアル接続を使って!)つなぐ場合や、より複雑な経 路制御が必要な場合、既述したように /etc/ppp/ip-up を使って設定してくだ さい。 <p> <p> <bf/Robert Hart/<newline> Port Hedland, Western Australia<newline> August 1996 </article>