  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 ス
  クリプトを実行するか書かれています。そこでここでは動作設定について詳し
  く述べたいと思います。もし自宅で小さなネットワークを組んでいる場合につ
  いて，２台のマシンで (透過的な)インターネットアクセスを行うエレガント
  な方法があります。

   ______________________________
   __|__                  ___|___
  |     | ローカル        |       |    ______  プロバイダへの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

  (訳注：１行目はドメイン名の補完用のアドレスで、２行目はネームサーバ
  の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
     ___________________________________________________________________

  上の２つのマスカレードルール(訳注："${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 ]

