ダイアルアップ接続への道(FreeBSD編)
pppd 2.0.4版

Office:greg@apt.fxis.fujixerox.co.jp
Home:greg@greg.rim.or.jp
last modified 1995/08/26
現在、工事中です。
御意見/要望などがありましたら上記アドレスまで御連絡下さい。

1 はじめに

 今日、私達を取り巻く環境の中に「インターネット」と言う単語が 多くなって来ています。そんな中、自分も利用/接続してみたいと考 えている人も増えて来ていると思います。

 従来は利用したい/接続したいと考えても限られた人/機関しか 利用できませんでした。しかし、今日ではIIJ等に代表されるインター ネットプロパダイバが登場し、個人でも接続できるようになりました。 これはこれで喜ばしい事ではあるのですが、接続するための敷居と言う物は NIFTYなどに代表されるパソコン通信と違ってなかなか高いようです。しかし、 それは

「接続するためのノウハウが入手しづらい」
「近くに接続経験を持った人がいない」

と言う事が原因のようなきがします。たしかにパソコン通信に比べると、 多少多くの知識を要求されるかも知れません。しかし、一つ一つの事は決して 難しい事ではありません。一つ一つこなしてゆけばいいのです。その先には きっと明るいインターネットへの道が開けているでしょう!


2 接続方法の決定まで

 では、インターネットへ接続するためのお話しにはいりましょう。 まず、インターネットへ接続する回線と方法を決定しなければなり ません。私が考えただけでも以下のようなものが考えられます。


 個人的にインターネットへ接続する事を前提としているので、 専用線を使うようなコストがかかる方法は取れません(お金持ち な人はトライしてください)。ということで、一般電話回線か ISDNを利用する事になります。
 次に、接続するためにどの様な方法を取るかです。私の場合、 以下のような理由でダイアルアップPPP接続を選択しました。

  1. とりあえず、お金がかからない方法である事。
  2. IPでの対外接続をしてみたかった

で、FreeBSD 2.0以降でPPPを使用する場合、

  1. pppd 2.0.4を使用する。
  2. IIJ-PPPを使用する。

の2つの選択肢があります。現在はIIJ-PPPを使用していますが、 昔は pppd 2.0.4を使用していました。また、FreeBSDでの標準はIIJ-PPPへ 移行しているようですから、IIJ-PPPを使用した方が良いでしょう
IIJ-PPPを使用したい人は こっち を見て下さい。

3 どの様なシステムを使うか

 まず、貴方はどのようなシステムでインターネットへ接続しよう としているでしょうか?私の場合、IBM-PCの上でFreeBSD1.1.5.1を 走らせ、ダイアルアップPPPで接続しています。貴方のシステムが 私のシステムと違っているからといって、接続できないなんて 考えないでください。現在ではほとんどのシステムでPPPを 利用できるのです。もし私の場合と違っている場合でも、 同じような点をクリアしてゆけば必ず接続できます。

4 下準備

 接続方法が「一般電話回線を利用したダイアルアップPPP接続」 と決定した所で、一つチェックしなければなりません。 それは、「貴方が接続先を確保しているか?」ということです。 持っているなら、次の章は不要です。 読み飛ばしてください

5 接続先の確保

 まず始めに、接続先の確保です。最近は個人を対象にしたプロパダイバが 簡単に見付かるので、苦労する事は無いと思います。 とりあえず、申し込んで下さい。私が知っている限り、以下のような所が サービスを提供しているようです。


6 準備するソフトウェアについて

 貴方がFreeBSDを使っている場合(NetBSDも同様のはずです)、 特に用意するべき物はありません。強いて言えばカーネルにPPP のコードを入れ忘れない事です。入れていない場合は以下のような行を コンフィグレーションファイルに追加してリコンフィグして下さい。

pseudo-device	ppp	2 

これで、準備はできました。後は実際に接続するだけです。


7 とりあえず、接続

 では、接続を行ってみましょう。接続するには以下の物が確保されて いなければなりません。

どうです?揃っていますか?揃っていない場合、 前の章に戻って揃えて下さい。 つぎに、電話をかけるため/接続先にログインするためのスクリプト を用意します。仮に、このファイルを/etc/ppp/DialUpとします。 内容は以下のようになるでしょう。

#!/bin/sh

TELNUMBER=接続先の番号
LOGINNAME=ログインアカウント
PASSWD=パスワード
chat\
	""\
	"AT"            "OK"\
	"ATZ"           "OK"\
	"ATD$TELNUMBER" "CONNECT"\
	""\
	"ogin:"         "$LOGINNAME"\
	"asswd:"        "$PASSWD"

 スクリプトの「"ogin:"」「"asswd:"」の部分は接続先のシステムによって 違いがあるかも知れませんので、自分で書き換えて下さい。 また、/etc/ppp/optionsに以下のように設定すると接続が楽になります。

/dev/cua01
57600
netmask 255.255.255.0
crtscts
connect /etc/ppp/DialUp
用意できたら、 コマンドラインから以下のように入れます。

% /usr/libexec/pppd

 入力すると、すぐにコマンドラインへ帰って来ると思います。それが 正常な動作です。モデムが電話をかけて相手のホストへ接続できると

pppd 2.0.4 started
Connect: ppp0 <--> /dev/cua01
local  IP address XX.XX.XX.XX
remote IP address YY.YY.YY.YY
と出力されるかも知れません。これが正常な動作です。 実行するユーザによっては出力されないかも知れません。 接続されているかどうか、確認するにはnetstatコマンドを 使用してみるのも良いです。ルーティング情報を確認して、 外への経路が存在する事を確認して下さい。
 次に、本当にリンクが確立されているか確認して下さい。 確認する方法は以下のようにします。

% ping YY.YY.YY.YY

 これは、接続先のホストにICMP ECHOを送ってみて、相手のホストから 応答があるかどうかで接続が確立されているか確認する方法です。
 正常に、接続できていますか?出来たらルーティングの設定を行います。 ルーティングの設定を行うに当たって2つの方針/3つの方法が存在します。

1)上位サイトから流れて来るRIP情報などを利用する
 この方法は、多くの内部のセグメントと外部のセグメントを接続 する場合向いている方法です。
2)デフォルトルートを設定する。
 この方法は、小数のセグメントと外部のセグメントを接続するのに 向いている方法です。
2.1)pppdに設定させる。
 この設定を行うには/etc/ppp/optionsにdefaultrouteと言う 行をいれればOKです。
2.2)routeコマンドで設定させる。
 この設定を行うには

route add default <IP ADDRESS>

と言うコマンドを発行します。

 いずれの方法を採用するにしても1つだけ注意しなければならない 問題があります。それは、「ルーティング情報をアナウンスするか否か」 です。もし、内部のセグメントのアドレスにプライベートアドレスを設定 していた場合、外部にルーティング情報を出してはなりません。
 個人がIPで接続する場合、正式なアドレスを獲得している事はまず無い のでrouted-qをつけて起動しておけば間違いは無いで しょう。となると、選択肢は2しか在り得ないので、デフォルトルートを 設定する事になります。では、どの方法で設定すれば良いのでしょうか? 私のお勧めは、2.1)の方法です。この方法なら接続が切れれば経路情報も 遮断されていますので、袋小路にはまりにくくなります。


8 各種関連事項について

 前の章までの作業で、IP接続そのものは出来ました。しかし、今のままでは 各ホストの情報を/etc/hostsに記述していなければなりません。そこで、 いくつか便利なものを設定しましょう。

8.1 resolverの設定

 リモートホストのIPアドレスを外部に問い合わせるために 設定する物です。必要が無い人は 読み飛ばして下さい。

 それでは、設定しましょう。まず、/etc/resolv.confという ファイルが存在しているかチェックして下さい。ありましたか? あった場合、貴方のマシンは既にresolverを使用している 可能性があります。nslookupと言うコマンドを起動してみて 下さい。プロンプトが帰って来ましたか?帰って来なかった 場合は設定ファイルを破棄して構わないでしょう。無かった 場合と同様の事を行って下さい。
無かった場合、resolv.confを作成します。内容は以下の ようになります。

domain		some.domain.name
nameserver	XX.XX.XX.XX
内容は貴方の接続先似合わせて書き換えて下さい。私の場合、 以下のようなものを使用しています。
domain		greg.rim.or.jp
nameserver	171.32.1.1
ここまでで来たら、nslookupコマンドで動作を確認して 下さい。とりあえず、以下のようにすれば良いでしょう。
% nslookup
Default Server:	foo.bar.some.domain
Address:	XX.XX.XX.XX

> ftp.iij.ad.jp
どうです。IPアドレスが表示されましたか?表示された場合、 DNSを使って外部のホストのIPアドレスを引く事が出来るよう になりました。

8.2 DNSの設定。

 もし、ローカルでBINDを走らせている場合、この項目は 必要無いかも知れません。貴方のサイトの管理者に相談 してみて下さい。その場合ここを 読み飛ばしてもかまいません。
では、独自にBINDを立ち上げる事を前提に説明します。始めに /etc/named.bootを作成します。詳しい設定はUNIXマガジン 等に譲として、私の設定をお見せします。
directory       /usr/Server/named

cache           .                       root.cache

; Zone
secondary       .                        192.244.176.54  backup/root
secondary       jp                       192.244.176.54  backup/jp
secondary       ad.jp                    192.244.176.54  backup/ad.jp
secondary       ac.jp                    192.244.176.54  backup/ac.jp
secondary       co.jp                    192.244.176.54  backup/co.jp
secondary       go.jp                    192.244.176.54  backup/go.jp
secondary       or.jp                    192.244.176.54  backup/or.jp
secondary       rim.or.jp                202.255.181.2   backup/rim.or.jp
primary         greg.rim.or.jp           greg.rim.or.jp.zone

; Reverse
secondary       ARPA                     192.244.176.54  backup/ARPA
secondary       181.255.202.IN-ADDR.ARPA 202.255.181.2   backup/181.255.202.IN-ADDR.ARPA
primary         172.IN-ADDR.ARPA         172.IN-ADDR.ARPA.rev
primary         31.172.IN-ADDR.ARPA      31.172.IN-ADDR.ARPA.rev
primary         1.31.172.IN-ADDR.ARPA    1.31.172.IN-ADDR.ARPA.rev
primary         0.0.127.IN-ADDR.ARPA     localhost.rev
本来、無闇やたらとセカンダリーサーバになるべき物 ではないのですが、ダイアルアップPPPで間欠的に接続 している関係上、無闇やたらとUnauthrized secondary にならなければなりません。理由はnslookupをデバッグ モードで立ち上げて、ローカルホストのIPアドレスを獲得 しようとしてみれば分かります。

まず、fooというホスト名をネームサーバを用いて検索 して見ましょう。

> foobar
;; res_mkquery(0, foo.bar.or.jp, 1, 1)
------------
Got answer:
    HEADER:
        opcode = QUERY, id = 14, rcode = NOERROR
        header flags:  response, auth. answer, want recursion, recursion avail.
        questions = 1,  answers = 1,  authority records = 0,  additional = 0

    QUESTIONS:
        foo.bar.or.jp, type = A, class = IN
    ANSWERS:
    ->  foo.bar.or.jp
        internet address = 172.31.1.1
        ttl = 3600 (1 hour)

------------
となります。これはこれで正しい動作です。しかし、 本来あるべき名前は

foo.bar.or.jp

なので、この名前で問い合わせて見るとホスト名は

foo.bar.or.jp.bar.or.jp

になります。このようなホスト名は存在しないので

# 問い合わせ文字列          問い合わせ先サーバ
foo.bar.or.jp.rim.or.jp  -> rim.or.jp
foo.bar.or.jp.or.jp      -> or.jp
foo.bar.or.jp.jp         -> jp
foo.bar.or.jp            -> bar.or.jp
のように、より上位のネームサーバに問い合わせを 行おうとします。この状態になった場合、タイムアウト を待たされます。また場合によっては挙げ句の果てに

host lookup fail

になります。

次に、PPPでリンクが確立されている事を確認した後、BINDを 立ち上げます。この時、起動に時間がかかるかも知れません が、気にしないで下さい。なお、私の設定の場合、BINDの プロセスサイズは13MB程度になりました。BINDが応答できる ようになったらnslookupコマンドできちんと動作しているか 確認して下さい。確認できたら

kill -HUP PID

を行って、現在のBINDの状態をファイルにダンプします。 この時、比較的良く利用しそうなホストのIPアドレスを 検索した後に行った方が効果的でしょう。ダンプされた ファイルは/var/tmp/named_dump.dbというファイルになって いると思います。このファイルをroot.cacheに指定した ファイルへコピーします。
これで、BINDの立ち上げは終了です。


9 おまけ

9.1 telnet

 IP接続しようとしている人に取ってTELNETの説明は 必要無い気がしますがとりあえず(^_^;;
telnetはリモートサイトへログインする時に使用する コマンドです。

telnet remote.host.some.domain

と言うように使用します。第二引数は指定しなくても 構いません。

9.2 ftp

 これもtelnetと同じく、IP接続しようとしている人に 取って説明は必要無い気がしますがとりあえず(^_^;;;
ftpはリモートサイトとの間で、ファイル転送を行う コマンドです。

ftp remote.host.some.domain

と言うように使用します。

本来、ftpはリモートサイト上にアカウントがある事が前提 となるのですが、アカウントを必要としないで利用できる ケースも存在します。これを「匿名ftp(anonmouse-ftp)」 と言います。これはユーザ名に「ftp」パスワードに貴方の メールアカウント指定した物です。

9.3 WWWクライアント

 ダイアルアップPPPで接続しようとしている人の大部分は、 Mosic等のWWWクライアントを使用する事を前提としていると 思います。そこで、私がFreeBSD上で動作確認できたWWW クライアントをあげておきます。

  • Mosic
     私はMotifを持っていないので、 確認できていません。
  • Chimera-1.5[14]jp
     多少、怪しげな動作をする時があります が、大体安定して動作しています。
  • Chimera-1.61jp
     オリジナルと同じように動作している ようですが、インラインイメージ関連が 不安定です。それ以外はまともに動作して います。
  • Lynx-jp
     1バイトコードのみを対象にすれば、 まともに動作するようです。

9.4 UUCPとの共存

 私の場合、メール/ニュースの配送にはUUCP、ftp/telnet の場合はPPPと、目的によって使い分けています。しかし、 PPPはUUCPロックをかけてくれないので、PPPを使用中にUUCP が回線を奪い取ろうとします。これを回避するために以下の ようなスクリプトを作成しました。
ちなみにpppd-2.1以降ではlockオプションでロックできるようになっています.

接続用スクリプト

#!/bin/sh
# This script is login script for PPP

# Check busy
if [ -f /var/spool/lock/LCK..cua01 ]; then
        exit 1
fi

# Make UUCP-LOCK
ppppid=`ps ax | grep pppd | grep -v grep | awk '{printf("%010d", $1)}'`
echo -n $ppppid > "/var/spool/lock/LCK..cua01"

# start PPP
chat	""
	"ATZ"			"OK"\
	"ATZ"			"OK"\
	"ATZ"			"OK"\
	"AT"			"OK"\
	"AT\\Q2"		"OK"\
	"ATD接続先の電話番号"	"CONNECT"\
	""\
	ogin:--ogin:		ログインID\
	assword:		パスワード\
|| (rm "/var/spool/lock/LCK..cua01" && false)

PPPスタート用スクリプト

#!/bin/sh
if [ -f "/var/spool/lock/LCK..cua01" ]; then
        echo "######### Telephone line is busy #########"
        exit 1
fi
/usr/libexec/pppd

PPP終了用スクリプト

#!/bin/sh

ppppid=`cat /var/spool/lock/LCK..cua01`
kill $ppppid
rm -f /var/spool/lock/LCK..cua01