Dial-On-Demand mini-HOWTO Rodney van den Oever, Rodney.van.den.Oever@tip.nl Version 1.0, 28 July 1996 伊佐冶 哲, isaji@mxu.meshnet.or.jp 8 Jan 1998 このHOWTOはどのようにしてダイアルオンデマンド(dial-on-demand)ダイアリ ングをするか、またどのようにしてダイアルオンデマンドPPPルータとしてプ ライベートローカルネットワーク接続されたLinuxを使うかについて解説して います。 (訳注:ダイアルオンデマンドネットワークについてはkerneld mini-HOWTO (日本語版)、小川 健太郎さん(k_ogawa@oyna.cc.muroran- it.ac.jp)、藤井 真吾さん(sfujii@super.win.or.jp) 共訳にも書かれている ので参照して下さい。また文書中のPPPの設定が現在あまり適切でないものも あるので「Networking Linux」やまだ あきらさん、はね ひでやさん(アスキ ー出版)を参考にしたほうがよい箇所もあります)。 ______________________________________________________________________ 目次 1. イントロダクション 2. カーネル設定 3. モジュールのインストール 4. PPPインストール 5. シリアルポートとモデムの設定 6. ppp設定 7. ダイアルオンデマンド(Dial-on-Demand) 8. ネットワークの設定 9. マスカレードの設定 10. ワークステーションの設定 11. 免責事項 ______________________________________________________________________ 1. イントロダクション kerneld-mini-HOWTOにはすでに,どのようにしてkerneldがrequest-route ス クリプトを実行するか書かれています。そこでここでは動作設定について詳し く述べたいと思います。もし自宅で小さなネットワークを組んでいる場合につ いて,2台のマシンで (透過的な)インターネットアクセスを行うエレガント な方法があります。 ______________________________ __|__ ___|___ | | ローカル | | ______ プロバイダへのPPP-リンク | PC | ネットワーク | Linux |---|モデム|--------------------------> | | 192.168.1.0 | ルータ| |______| x.x.x.x |_____| |_______| (ダイナミックIP-アドレス) named pppd ここで以下の環境が整っているものとして話しを進めます。 o Kernel 2.0.0 以降 o ppp-2.2.0f.tar.gz 以降 o modules-2.0.0.tar.gz 以降 o ipfwadm-2.3.tar.gz (http://www.xos.nl/linux/ipfwadm) また以下の順番で作業を進めます。 1. Kernel 設定 2. Modules インストール 3. PPP インストール 4. シリアルポートとモデムの設定 5. PPP 設定 6. Dial-On-Demand 7. ネットワークの設定 8. Masquerading 設定 9. Workstation 設定 2. カーネル設定 はじめにkerneld, ppp そして IP-マスカレード(masquerading)をサポートす るようにカーネルをコンパイルします。このセットアップで必要なオプション を書くだけにします。その他のオプション[ファイアウォール(firewall)、ロ グイン(logging)、透過的プロキシ(transparent proxying)] についてはこれ も指定しておきますが必ずしも必要というわけではありません。 ______________________________________________________________________ cd /usr/src/linux make config (or make menuconfig) * Code maturity level options * Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [Y/n/?] * Loadable module support (ロードモジュールのサポート) * Enable loadable module support (CONFIG_MODULES) [Y/n/?] Set version information on all symbols for modules (CONFIG_MODVERSIONS) [N/y/?] Kernel daemon support (e.g. autoload of modules) (CONFIG_KERNELD) [Y/n/?] * Networking support (CONFIG_NET) [Y/n/?] * * Networking options (ネットワークオプション) * Network firewalls (CONFIG_FIREWALL) [Y/n/?] TCP/IP networking (CONFIG_INET) [Y/n/?] IP: forwarding/gatewaying (CONFIG_IP_FORWARD) [Y/n/?] IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?] IP: masquerading (EXPERIMENTAL) (CONFIG_IP_MASQUERADE) [Y/n/?] * * Protocol-specific masquerading support will be built as modules. * (マスカレードプロトコルサポートはモジュールとして作られます) IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?] IP: optimize as router not host (CONFIG_IP_ROUTER) [Y/n/?] * * Network device support (ネットワークデバイスのサポート) * Network device support (CONFIG_NETDEVICES) [Y/n/?] * PPP (point-to-point) support (CONFIG_PPP) [M/n/y/?] * * CCP compressors for PPP are only built as modules. * (CCP PPPコンプレッサはモジュールとしてだけ作られます) Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?] NE2000/NE1000 support (CONFIG_NE2000) [Y/m/n/?] ______________________________________________________________________ 後半のオプションは使っているネットワークカードに依存します! そしてコンパイルします。 make zlilo make modules make modules_install もしLILOを使わないなら/usr/src/linux/arch/i386/boot/zImageを適当な場所 にコピーします。モジュールは/lib/modules/x.x.xにインストールされていま す。ここでx.x.xはカーネルのバージョンを表しています。 3. モジュールのインストール 以下のモジュールユーティリティが必要です: o /sbin/insmode 要求されたモジュールを読み込む o /sbin/rmmod 不必要なモジュールを削除する o /sbin/depmod Makefileライクな依存性(depedencies)ファイルを作る o /sbin/kerneld 自動的にモジュールを読み込むためのカーネルデーモ ン(Kerneld) まだ上記したものをインストールしていなければ,いれておきましょう。 cd /usr/src tar zxf modules-2.0.0.tar.gz make install 起動時にkerneldをロードするために,/etc/rc.d/rc.Sを編集するか rc.Sから 呼ばれる分割スクリプト rc.modulesを作っておきます。以下の行のように変 更するか追加するかして下さい。 /etc/rc.d/rc.modules: ______________________________________________________________________ if [ ! -f /lib/modules/`uname -r`/modules.dep ] ; then echo "Updating module dependencies for Linux `uname -r`:" /sbin/depmod -a fi [ -x /sbin/kerneld ] && /sbin/kerneld ______________________________________________________________________ はじめの箇所ではモジュール依存をチェックして、もしrc.modulesが存在しな い場合はそれをアップデートします。 4. PPPインストール PPPリンクを設定するために以下のプログラム群が必要です。 o /usr/sbin/pppd PPP-デーモン o /usr/sbin/pppstats PPP-状態の表示 o /usr/sbin/chat 実行スクリプト 以下のようにしてインストールします。 cd /usr/src tar zxf ppp-2.2.0f.tar.gz cd ppp-2.2.0f ./configure make kernel 最新のカーネルはPPPコードを含んでいるので'make kernel'は何も置き換えま せん。 (もしこのホストへのダイアルインが不要なら)シャドウパスワードや その他のオプションのREADMEやMakefileをチェックして下さい。そして make make install と実行します。 5. シリアルポートとモデムの設定 このセットアップではモデムが当然必要です。またシリアルポートのセット アップは /etc/rc.d/rc.serialで行います: ______________________________________________________________________ ${SETSERIAL} /dev/cua0 uart 16450 port 0x3F8 irq 4 ${SETSERIAL} /dev/cua1 uart 16550A port 0x2F8 irq 3 spd_vhi ______________________________________________________________________ COM1はマウスに使われていて、COM2は内部28k8(28,800)モデムに使われていま す。 spd_vhiパラメータはスピードテーブルの38400bpsエントリー を11520bpsに置き換えます。一方spd_hiにすれば57600bpsに設定されます(訳 注:モデムによる圧縮が働いて内部的にシリアルデバイス読み書きの速度が上 がります)。 28k8モデムではspd_vhiオプションを使い14k4モデムで はspd_hiオプションを使いますが、安全のために38400でスタートします。さ れています)や他のターミナルプログラムを使って(seyonなど)モデムのセット アップをチェックできますモデムは入力した文字をエコーしなければなりませ ん。Ctrl-A Pで通信パラメータ(訳注:minicomでは"Comm Parameters"と表 示)の変更ができます。もし57600 か 115200 bpsで動作しているようだったら チェックして下さい。 minicomはプロバイダに手動でダイアルする時や、リモートサーバからの応答 や設定前の確認などに使えます。もしプロバイダがpapやchapを使っていない 場合はPPPモードでリンク設定のコマンドを入力したり,ユーザ名/パスワー ドを入力する必要があるかもしれません。 6. ppp設定 pppdは/etc/pppでスクリプトを探します。 /etc/ppp/options: ______________________________________________________________________ /dev/modem 38400 crtscts modem noipdefault defaultroute idle-disconnect 120 ______________________________________________________________________ 意味: o /dev/modem デバイスは/dev/cua1にリンクをはっています。 o 38400 (/etc/rc.d/rc.serialファイルのspd_vhiパラメータ で)115200に置き換えられます。 o crtscts ハードフロー制御(hardware handshake)、rts/cts。 Xon-Xoffフロー制御 は使わないで下さい。 o noipdefault 自動的にIPアドレスをアサインする(PPPネゴシエーション でIPを決定)。 o defaultroute これはリンクが確立したときデフォルトルートをpppイン ターフェースにセットします。 o idle-disconnect 120秒後にアイドルリンクを自動的に切断(PPP-2.2.0f)。 次にスクリプト'default'(通常使うプロバイダISP)を書きます。他の接続 も行う場合は,各サイト用のスクリプトを別々に作ります。 /etc/ppp/default: "" ats11=55dtXXXXXXXX CONNECT "" rname: UUUUU sword: PPPPP > ppp 意味: o ats11=55 ダイアルトーンとダイアルスピードの指定。 o XXXXXXXX プロバイダの電話番号を入力。 o CONNECT chatはモデムから'CONNECT'が返ってくるのを待ちます。 o rname: chatは'rname'を待ち、'UUUUU'を入力します。 o sword: chatは'sword'を待ち、'PPPPP'を入力します。 ここでは 'rname'と'sword'を使います。はじめの文字が欠落したり大文 字/小文字だったり言語によって違うのでこのようにします(訳注:各自の プロバイダに合わせて変更します。'rname'ではなく'ogin:'などの場合も あります)。プロバイダによってユーザー名とパスワードを入力した ら'ppp'入力を必要とするところもあります。そこでルータプロンプ ト('>')のラストキャラクタ待ちにします。 "serial line looped back"や"serial line not 8-bit clean "といったエラーが出たら、ま だPPPモードにはなっていません。 /etc/ppp/ppp: ______________________________________________________________________ #!/bin/sh /usr/sbin/pppd connect '/usr/sbin/chat -v -f /etc/ppp/default' ______________________________________________________________________ このコマンドは短いスクリプトに書ける程度の長さです。これでプロバイダに 接続できます。/etc/ppp/optionsにデバッグパラメータことができます。 /etc/syslog.conf *.debug /var/log/messages syslog.confを編集したらこの変更をsyslogd(syslogデーモン)に認識させま す。 PIDファイルの位置は適当なディレクトリを書いて下さい。 kill -1 `cat /var/run/syslog.pid` あるいは kill -1 `cat /etc/syslog.pid` 接続後'ppp0'インターフェースがあるかを'ifconfig'で、またデフォルトルー トを 'netstat -r'でチェックします(プロバイダに接続しています)。リモー トサーバにpingをしてみます(例えばプロバイダのネームサーバに)。以上で問 題がなければ、ネームサーバを/etc/resolv.confに登録します。 search your.isp.domain nameserver x.x.x.x (訳注:1行目はドメイン名の補完用のアドレスで、2行目はネームサーバ のIPアドレスです)。 7. ダイアルオンデマンド(Dial-on-Demand) KerneldはPPPといったモジュールを必要に応じてロードします。kerneld- HOWTO に書かれている追加機能は,特定のルートが失われたらスクリプトを呼 び出すという機能があるというものです。Kerneldはシェルスクリプ ト/sbin/request-routeを探します。以下のスクリプト はmodules-2.0.0.tar.gzにあったスクリプトのコピーです。 /sbin/request-route: ______________________________________________________________________ #!/bin/sh LOCK=/var/run/request-route.pid export PATH=/usr/sbin:$PATH # for ppp-2.2* # This script will be called from kerneld with the requested route as $1 # $1として要求されるルートで、このスクリプトがkerneldから呼び出されます。 chatfile=/etc/ppp/$1 # If no chatscript exists use a default value (symlink to preferred script): # chatスクリプトがなければデフォルト値を使います # (参照されるスクリプトへのシンボリックリンク): [ ! -f $chatfile ] && chatfile=/etc/ppp/default # Check if we're already running: # 実行されているかどうかチェックする: if [ ! -f $LOCK ] ; then pppd connect "chat -f $chatfile" & # Timer to be killed by ip-up, tunable! Check kerneld delay as well # ip-upによってkillされるタイマ。変更できます!kerneldもチェック。 sleep 60 & sleepid=$! echo $sleepid > $LOCK wait $sleepid rm -f $LOCK exit 0 fi exit 1 ______________________________________________________________________ Kerneldは引数として無くなったルートを使ったこのスクリプトを実行しま す。 /sbin/request-route x.x.x.x スクリプトは'request-route'-要求(instances)の重複を防ぐためにロック ファイル (lock-file)を使います(訳注:ロックファイルがあるデバイスは他 から使用できないようになります)。最初はネームサーバへの参照があった時 にスクリプトが起動されるようにしていました。しかし、ローカル(=自分のマ シン)で(キャッシュ用に)ネームサーバを走らせようとすると、(最初の)参照 がキャッシュされるため、2 度目(以降)の参照では(外部へアクセスが無いた め)接続が確立しません。 異なるリンク用のチャットスクリプト(chat-scripts)を複数つくるかデフォル トのチャットスクリプトでISP(プロバイダ)に接続するようにします。 リンクが確立されたらpppdは/etc/ppp/ip-upスクリプトを実行します。これは ロックファイルを削除するものです。sendmailのキュー実行(queue-run)のよ うに、リンクが確立される時はいつでも実行したいコマンドを追加します。 ______________________________________________________________________ #!/bin/ash LOCK=/var/run/request-route.pid [ -f $LOCK ] && kill `cat $LOCK` # Execute these commands after connecting: # 接続後実行するコマンド: #/usr/sbin/sendmail -q ______________________________________________________________________ PPPを切断するときは'ppp-off'スクリプトを実行します。 /usr/sbin/ppp-off: ______________________________________________________________________ #!/bin/sh LOCK=/var/run/request-route.pid DEVICE=ppp0 rm -f $LOCK # # If the ppp0 pid file is present then the program is running. Stop it. # ppp0 PIDファイルがあればkillする。 if [ -r /var/run/$DEVICE.pid ]; then kill -INT `cat /var/run/$DEVICE.pid` # # If unsuccessful, ensure that the pid file is removed. # 不成功なら、PIDファイルが削除されていることを確認。 if [ ! "$?" = "0" ]; then echo "removing stale $DEVICE pid file." rm -f /var/run/$DEVICE.pid exit 1 fi # # Success. Terminate with proper status. # 成功。適当な状態で終りました。 echo "$DEVICE link terminated" exit 0 fi # # The link is not active # リンクがアクティブではない。 echo "$DEVICE link is not active" exit 1 ______________________________________________________________________ 8. ネットワークの設定 もしLinuxボックスが他にネットワークインターフェース(イーサネットカー ドや PLIP接続)を装備していない場合は,ルータとしての機能するように設 定できます。これは著者のネットワークの設定です。IPアドレス は/etc/hostsに全て書いているので一つのファイルを管理するだけで済みま す。 /etc/hosts: 127.0.0.1 localhost 10.0.0.1 your.domain.com host 10.0.0.2 some.other.machine /etc/networks: loopback 127.0.0.0 localnet 10.0.0.0 /etc/rc.d/inet1: # Loopback interface: ループバックインターフェース: ifconfig lo localhost route add -net loopback # Local interface: ローカルインターフェース: ifconfig eth0 host route add -net localnet eth0 最後のルールはルートをローカルネットワークに追加したということです。こ こでデフォルトゲートウェイを入力する必要はありません。というのも PPP接 続が確立するまでゲートウェイはないからです。 9. マスカレードの設定 複数のマシンに接続する必要があるけれど一つのIPアドレスしかない場合は、 Linuxマスカレードを使うことができます。IPマスカレードを使って、IPアド レスをPPPインターフェースに変換する内部ネットワーク番号(できればプライ ベート IPアドレス)の設定ができます。以下のネットワーク番号を使うことが できます。 o Class A: 10.0.0.0 o Class B: 172.16.0.0 - 172.31.0.0 o Class C: 192.168.0.0 - 192.168.254.0 /etc/rc.d/rc.inet1に追加します。 ___________________________________________________________________ FW=/sbin/ipfwadm ${FW} -F -f ${FW} -F -a m -P tcp -S localnet/8 -D default/0 ${FW} -F -a m -P udp -S localnet/8 -D default/0 # Masquerading timeout-values (tcp tcpfin udp), defaults: ${FW} -M -s 3600 0 0 # Load module for special protocols: /sbin/modprobe ip_masq_ftp /sbin/modprobe ip_masq_raudio /sbin/modprobe ip_masq_irc ___________________________________________________________________ 上の2つのマスカレードルール(訳注:"${FW} -F.."の行) はUDPとTCPトラ フィックをIPアドレスに変換するというものです (訳注:UDPとTCPはトランス ポート層にあるプロトコルです。詳しくはアブストラクトで紹介した「Net- working Linux」を参照して下さい)。 IPアドレスはデフォルトゲートウェ イ(PPPインターフェース)として使われています。 ICMPプロトコルを使 うpingは他のホストからはエラーになります。ルータからのpingだけが動作し ます。著者はサブネットマスク 255.0.0.0 あるいは CIDR記法の'/8'で ネッ トワーク 10.0.0.0 を使っています。つぎのルール(訳注:"${FW} -M.."の行) は"TCPタイムアウト値"(TCP-timeout value)を増やすことで FTP-DATA接 続(FTP-DATA connections)を表示しています。ファイアウォールからこれらの プロトコルを使いたいなら、モジュールだけが必要です。例えば、ファイア ウォールを通したftpをしたいならip_masq_ftp モジュールを読み込む必要が あります。 10. ワークステーションの設定 ローカルネットワーク番号について他のマシンを設定して、デフォルトゲート ウェイとしてLinuxマシンを使うようにセットアップします。 11. 免責事項 このドキュメントは著者が行った設定について解説しました。各自の責任にお いて使って下さい。もし大切なことが抜けていたり,具合の悪いところがある 場合はぜひ著者まで連絡して下さい。あと追加できることはローカルネームサ ーバの設定方法です。 [(日本語訳) 伊佐治 哲, isaji@mxu.meshnet.or.jp (校正) 藤原 輝嘉さん, fujiwara@cim.pe.u-tokyo.ac.jp ]