Linux で PPP を利用

Linux で PPP サーバーを立ち上げる方法を説明します。


Linux の環境

PPP を利用するには、Kernel が PPP を利用できるように設定されていなければなりません。また、PPPパッケージもインストールしておく必要があります。

利用するモデムにも注意してください。最近の Windows プリインストールモデルPCに内蔵のモデムカードは、Windowsでしか利用できないものがほとんどです。モデムドライバのファイルの拡張子が .vxd の場合には、 Windows でしか利用できないものが多いそうです。できれば、外付けモデムをシリアルポートに接続する方法が好ましいでしょう。

モデムを COM1 に接続した場合、Linux からは ttyS0 としてアクセス可能になります。COM2 ならば ttyS1 。

モデムの設定

シリアルポートの速度設定が必要なら setserial コマンドで tty デバイスの設定を行う。もし、システムデフォルトと異なる設定を使用したい場合、OS 起動時に自動的に実行されるように /etc/rc.d/rc.local に追記しておくとよい。

    # setserial /dev/ttyS0 spd_vhi     115kbps を利用する(現在未対応?)
    # setserial /dev/ttyS0         設定内容確認
    /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4, Flags: spd_vhi
    #
  

モデムの設定は、モデムによっていくつか設定が異なるのでモデムのマニュアルと格闘してください。

    # cu -l ttyS0 -s 38400
    Connected.
    at
    OK
    at&f                  工場出荷時の設定に戻す
    OK
    at\q3                  RTS/CTS によるフロー制御に設定
    OK
    ats0=2                 自動着信の設定(2回の呼出し音で着信)
    OK
    ate                   ローカルエコーの禁止
    OK
    at&w                  設定内容を記録(ノーエコーにしているので表示されない)
    OK
    ~.                   cu コマンドの終了
    Disconnected.
    #

Linux 側で着信を受け付ける準備

シリアル回線からの着信を受け付けるには、mgetty(modem getty) を利用します。必要なら mgettyパッケージをインストールしてください。mgetty を利用して、シリアルからのリクエストを常に監視します。Redhat Linux のパッケージに含まれる mgetty は PPP での接続を受け付けるようにコンパイルされているようなのだが、うまく動作しなかったので、mgetty のソース(mgetty1.1.21-Jul24.tar.gz) を持ってきてコンパイルしてしまいました。

極力、 Redhat にデフォルトで入っている mgetty の設定に近づけるために Makefile や policy.h を変更します。

    --- Makefile sample ---
    CFLAGS=-O2 -Wall -pipe -DAUTO_PPP
    prefix=/usr
    CONFDIR=/etc/mgetty+sendfax
    -----------------------
    
    --- policy.h sample ---
    #define FAX_MODEM_TTYS        "ttyS0:ttyS1"
    #define DEVICE_OWNER          "root"
    #define DEVICE_GROUP          "uucp"
    #define MGETTY_PID_FILE       "/var/run/mgetty.%s"
    #define MAILER                "/usr/sbin/sendmail"
    #define LOG_PATH              "/var/log/mgetty.%s"
    ...
    ...
    #define MODEM_CHECK_TIME      -1
    #define MAIL_TO               "root"
    -----------------------
    # tar xzf mgetty1.1.21-Jul24.tar.gz
    # <edit> Makefile
    # cp policy.h-dist policy.h
    # <edit> policy.h
    # make
    # make install

mgetty は、設定ファイル /etc/mgetty+sendfax/login.config にしたがって動作します。 このファイルの /AutoPPP/ で始まる行のコメントをはずします。(/AutoPPP/ の行以外はすべてコメントにして良い)

    /AutoPPP/ -     -       /usr/sbin/pppd -detach auth -chap +pap login kdebug 7 debug
上記のように設定すると、 UNIX のパスワードを利用して PAP 認証を行い、通 信の内容の詳しいログが残ります。 kdebug 7 debug は、syslog を経由して通 信の内容の詳しいログをとることができます。試験が終わりログをとる必要がなくなれば kdebug 7 debug は削除してもかまいません。
mgetty の起動を init プロセスから行なうため、/etc/inittab に次の一行を追加します。
    s0:2345:respawn:/usr/sbin/mgetty ttyS0

ISDN 回線などを利用する場合、-n オプションで RING設定すると便利です。

    s0:2345:respawn:/usr/sbin/mgetty -n1 ttyS0
    s1:2345:respawn:/usr/sbin/mgetty -n3 ttyS1

設定した /etc/inittab を有効にするため init に q オプションを指定し、実行します。

    # init q
これで、mgetty が起動され着信の準備が整いました。/var/log/mgetty.ttyS0 にログが残るで、不具合があった場合は参照してください。

カーネルの設定

まず、PPP サーバーになるためには、カーネルが IP Forwarding に対応している必要があります。対応していない場合、カーネルを再構築してください。

【2.0.* の場合】
カーネル設定時に Networking Options の IP: forwarding/gatewaying を有効にする。

【2.2.* の場合】
カーネル設定時に Networking Options の IP: advanced router を有効にする。 さらに、/proc filesystem と Sysctl support も有効にしておく。

そして、あとはコンパイル

    # cd /usr/src/linux
    # make mrproper
    # make xconfig (make menuconfig)
    # make dep; make clean
    # make zImage (make bzImage)
    # make modules; make modules_install
    # installkernel 2.2.12-32 arch/i386/boot/zImage System.map

/etc/sysconfig/network の FORWARD_IPV4 の値を true にする。

パケットが転送されているかどうかは、ファイル /proc/sys/net/ipv4/ip_forward の数値を確認する。 値が 1の場合、パケットは正しく転送されます。0 であった場合、以下のコマンドを実行してください。多分、/etc/sysconfig/network の FORWARD_IPV4 の値を true にしているので 1 になっているはず?

    # echo "1" > /proc/sys/net/ipv4/ip_forward

OS 起動時に自動的に実行されるように /etc/rc.d/rc.local に追記しておくとよい。

pppd の設定

pppd のパッケージがインストールされていることを確認してください。必要なら、ソースを取ってきてコンパイル/インストールしてください。コンパイル方法は、非常に簡単なので省略します。

ファイル /etc/pam.d/ppp の内容をチェック

    #%PAM-1.0
    auth       required     pam_nologin.so
    auth       required     pam_pwdb.so shadow nullok
    account    required     pam_pwdb.so
    session    required     pam_pwdb.so

ファイル /etc/mgetty+sendfax/login.config の PPP の記述では足りない pppd に関するオプションなどを ディレクトリー/etc/ppp/ にあるファイルを利用して設定します。

/etc/ppp/options --- mgetty から pppd が起動される時のオプションを指定

    asyncmap 0
    crtscts
    lock
    modem
    ms-dns 192.168.0.1
    netmask 255.255.255.0
    proxyarp
lock 同じ回線を他のプロセスが使用しないようにロックする
-detach バックグラウンドジョブにしない
passive 接続相手からのパケットを受信しなくても切断しない
proxyarp 接続相手を自分のネットワークのサブネットとする
crtscts ハードフローを行う
modem モデムを使用する
defaultroute 接続相手をデフォルトルートにする
nodefaultroute 接続相手をデフォルトルートにしない
idle NNN NNN秒パケットが中断したら切断する
pap-timeout NNN NNN秒で認証が完了しなければ切断する
maxconnect NNN 連続して NNN秒以上は接続させない
ms-dns IPAddress Windowsマシンへの DNSの通知
ms-wins IP Address Windowsマシンへの WINDS サーバーの通知
login システムが使用している認証を使用する

 

/etc/ppp/options.ttyS0 --- ttyS0 のモデムにアクセスしてきたマシンに与えるIP Address を指定

書式は「PPPサーバの IP Adress : 与える IP Address」です。また、サーバーが自分であれば サーバの IP Adress を省略することもできます。

    :192.168.1.10

/etc/hosts に名前を登録してあれば、IP アドレスの代わりにホスト名を使用できる。

    :ppp101

 

/etc/ppp/pap-secrets --- PAP 認証を採用

接続を許可するユーザーとそのパスワードを記述します。 左から順に、ユーザー名、サーバー名、パスワード、IP アドレスとなります。 ただし、パスワードは通常の UNIX パスワードを使用するので、 mgetty から pppd を起動する時に引数 login を指定し、 このファイルのパスワードの項目は "" にしておきます。 また、IP アドレスも別のところで指定するので * にしておく。

    yourname        foobar   ""      * 
    myname          foobar   ""      *

システムに登録されているすべてのアカウントに対して接続可能にするには、以下のようにワイルドカードを利用します。

    *               foobar   ""      * 

ファイル options 関連は、パーミッションを 644 に設定し、ファイル pap-secrets は、パーミッションを 600 に設定してください。オーナーは root で、グループは daemon と設定してください。

 

/etc/ppp/auth-up --- 認証が成功した場合に実行される

    #!/bin/sh
    # Args:
    #  $1 - interface-name
    #  $2 - peer-name
    #  $3 - real-user
    #  $4 - tty
    #  $5 - speed
    echo "up[$PPID]:   " `date +"%Y.%m.%d %X"` $1 $4 $2 >> /var/log/pppauth.log

この設定で、いつ、どのユーザーが、どのポートに接続してきのか、ログファイル /var/log/pppauth.log に記録されます。

/etc/ppp/auth-down --- 回線が切断された後に実行される。

    #!/bin/sh
    # Args:
    #  $1 - interface-name
    #  $2 - peer-name
    #  $3 - real-user
    #  $4 - tty
    #  $5 - speed
    echo "down[$PPID]: " `date +"%Y.%m.%d %X"` $1 $4 $2 >> /var/log/pppauth.log

auth-up が、接続時の記録に対して、切断時の記録を行う。

ファイル auth- 関連は、実行許可パーミッションを与える必要があるので 755 に設定します。

この他にも、ip-up, ip-down というスクリプトを用意しておくことで、それぞれ接続された時、回線が切断された時に実行されます。