Linux で PPP を利用
Linux で PPP サーバーを立ち上げる方法を説明します。
OS は Redhat 6.1を利用
COM1(ttyS0) に外付けモデムを接続
mgetty を利用(uugetty ではありません)
PPP の認証には PAP を用い、パスワードは通常の UNIX パスワードを利用
コネクションが成立した時間、解放された時間のログをとる
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 というスクリプトを用意しておくことで、それぞれ接続された時、回線が切断された時に実行されます。