NetBSD を利用した PPPoE ルータの構築方法


ここでは新しいソフトウェアを一切導入することなく、NetBSD に標準添付のものだけを用い、PPPoE ルータとして必要最小限の機能を、 いかに効率良く短時間で提供できるかだけに的を絞っています。 派手な GUI での設定や、あれこれ機能満載ルータを必要としている方は、 いざというときの参考にはなるかもしれませんが、 望みのものが得られる可能性は極めて低いことをあらかじめお伝えしておきます。

紹介する設定例は、以下のようなマシン構成で、フレッツ ADSL を用いて、 常時接続を可能にするためのものです。

Internet <======> NetBSD PPPoE router <======> HomeLAN
           tlp0                         fxp0

Table of Contents

1. PPPoE 機能を有効にする

2. 手動接続実験

3. 自動接続実験

3.1. 起動時に自動接続

3.2. 切断時に自動再接続

4. IPv6

4.1. 6to4 の利用

4.2. stf(4) の手動設定

4.3. stf(4) の自動設定

4.4. rtadvd(8) の設定

4.5. 固定割り当てでない場合

5. マルチセッションの実現


1. PPPoE 機能を有効にする

NetBSD ではカーネルが PPPoE 機能を提供して、各種設定は、 pppoectl(8) で行えるようになっています。つまり、NetBSD を用いて PPPoE ルータを構築するには、まず pppoe(4) がカーネルに組み込まれているかどうかを確認しなければなりません。

# ifconfig -C

と実行した結果に、pppoe の文字が見えたら pppoe(4) はすでにカーネルに組み込まれています。もし無ければ、 カーネルコンフィグレーションファイルに、

pseudo-device pppoe

を加えてカーネルを再構築する必要があります。GENERIC カーネルには最初から組み込まれています。


2. 手動接続実験

まず手動による PPPoE セッションの確立をめざします。 うまくいかなかった場合の問題切り分けに役立つでしょうし、 操作を一通り順番にこなすのは、無駄ではないと思っているからです。 無駄だと思われる方は、ブラウザの戻るボタンを押して、 別のページを探してください。

# ifconfig -a

を実行してみてください。pppoe0 は出て来ないはずですので、

# ifconfig pppoe0 create

と実行して、pppoe0 を作ります。 この操作は再起動するたびに毎回必要です。この作業を忘れると PPPoE に関する作業は何もできません。忘れないようにしてください。

# ifconfig tlp0 up

と実行し、ADSL モデムの接続されているネットワークインターフェイスを有効にします。 この作業は必要ないと思う方もいるかもしれませんが、CardBus 接続あるいは、 PCMCIA 接続の NIC を使った場合、この作業が必要になることがあります。 必要のない NIC に対して、この操作を行っても問題はないので、 やっておいた方がよいでしょう。

ADSL モデムのつながっている tlp0pppoe0 に割り付けるために、

# /sbin/pppoectl -e tlp0 pppoe0

と実行してください。

次、認証に必要なデータを設定します。

# /sbin/pppoectl pppoe0 myauthproto=chap 'myauthname=XXX' 'myauthsecret=YYY' hisauthproto=none

XXX, YYY をそれぞれの環境に合わせて変更してください。PAP を使いたければ、 myauthproto=pap としてください。

# ifconfig pppoe0 0.0.0.0 0.0.0.1 netmask 255.255.255.255 up

と実行すれば、PPPoE セッションが確立されると思います。

0.0.0.0 や、0.0.0.1 は特別な意味があるので、 通常これを変更する必要はありません。

pppoe(4) の実装では、 netmask を指定していない場合、/8 となり、ちょっとまずいのではないか、という話がありますので、 明示的に netmask を指定するようにしました。 参考

正しく確立されていれば、

# /sbin/pppoectl -d pppoe0

と実行したときに、

pppoe0: state = session

という文字列が見えると思います。無ければ、 セッションの確立に失敗していますので、 今ごろカーネルは再試行を繰り返しているはずです。 もう一度入力した情報が間違っていないか確認してください。

自分に割り当てられた IPv4 アドレスなどを確認するには、

# ifconfig pppoe0

と実行してください。

このとき、デフォルトルートやリゾルバなどの設定をすることで、 NetBSD PPPoE ルータと外部との通信が可能になります。 接続先のルータにでも、ping(8) して、接続性を確認してもよいです。


3. 自動接続実験

手動による接続ができたとなれば、それを自動化するのは難しくはありません。 ようするに、手動で行った手続きをスクリプトとして書くだけ、 という理解で正しいと思います。ただ、フレッツ ADSL などでは、 何かのはずみで接続性を失うことがあります。 保安器が古くて電話が鳴るたびに切れる、というのもよく聞く話です。

ここでは、できるかぎり人間の手をかけずに、 NetBSD PPPoE ルータ自身が自動で接続性を保ち続けるように設定します。

3.1. 起動時に自動接続

起動時に自動接続するためには、/etc/ifconfig.pppoe0 というファイルを用意するだけで可能です。

create
! /sbin/ifconfig tlp0 up
! /sbin/pppoectl -e tlp0 pppoe0
! /sbin/pppoectl pppoe0 myauthproto=chap 'myauthname=XXX' 'myauthsecret=YYY' hisauthproto=none
0.0.0.0 0.0.0.1 netmask 255.255.255.255 up

と書けばよいでしょう。ただし、このファイルには、ユーザ名、 パスワードを記入しなければなりませんので、root にしか読めないように、

# chmod 600 /etc/ifconfig.pppoe0

とすべきです。

作業が終了したら再起動してみてください。マシンが起動した段階で、 自動的に /etc/ifconfig.pppoe0 が読み込まれ、 PPPoE セッションが確立されていると思います。

3.2. 切断時に自動再接続

なんらかの理由により接続性が失われた場合、 「接続性が失われた」という情報をシステムが知る必要があります。 オンデマンド接続にしておいて、一定間隔で ping(8) を送るという方法もあり得ますが、ださいのでしません。NetBSD では ifwatchd(8) というデーモンが利用できます。

接続性が確立されたときにすべき典型的な処理には、 デフォルトルートの変更があります。/etc/ppp/ip-up に、

#! /bin/sh
/sbin/route add default $5

と書けばよいでしょう。

反対に、接続性が失われた場合にデフォルトルートを削除するには、 /etc/ppp/ip-down に、

#! /bin/sh
/sbin/route delete default

と書けばよいでしょう。

これら二つのファイルを用意した後、/etc/rc.conf に、

ifwatchd=YES
ifwatchd_flags="-u /etc/ppp/ip-up -d /etc/ppp/ip-down pppoe0"

と書いてください。これで、システム起動時に PPPoE リンクを監視する ifwatchd(8) も起動されます。 ifwatchd(8) には、 いくつかの考慮すべき点があります。

一つめは、デフォルトルートの自動設定があります。たんに、PPPoE セッションが確立されただけでは、デフォルトルートの設定がされませんので、 ほとんどのパケットは行き先が分からず破棄されますが、 ifwatchd(8) が起動されることで、先の /etc/ppp/ip-up スクリプトによって、 デフォルトルートは設定されますから、この問題は解決されます。

二つめに、ifwatchd(8) の起動タイミングです。 ifwatchd(8) の起動は PPPoE セッションの確立に比べると、ずいぶん後になってから行われます。 named(8) や、 ntpd(8) などよりも後になるでしょう。これらのデーモンは、外部との接続性が必要ですから、 正しく起動するとは限りません。問題が無ければ、 システムが稼働し始めて最初のうちだけの話だと思って無視するのもいいでしょう。 あるいは、/etc/ppp/ip-up, /etc/ppp/ip-down の中で、 各種デーモンの再起動等を行うのもいいでしょう。 ここでは、精神衛生的に健康を保つためにも、後者をお勧めします。

三つめに、切断時にデフォルトルートを消かないと、再接続時に、 すでにデフォルトルートが設定されている、 と文句を言われてしまいます。これが問題になるとはあまり考えられませんが、 好ましい状況ではないので、正しく運用できる方法を選択しておきましょう。

ひとつ注意ですが、NTT 西日本の行っているフレッツ ADSL サービスでは、 いったん接続性が切れると、すぐには再確立できないようです。これは、フレッツ ADSL サービス側の問題、というか仕様であり、NetBSD には責任はありません。 必ずしも短いとはいえない時間なので、結構気分が悪いです。


4. IPv6

4.1. 6to4 の利用

NetBSD には IPv6 スタックが統合されているので、 IPv6 での接続性を確保する方法も紹介しておきます。

IPv6 での接続性を確保するための方法は、今では非常にたくさん存在します。 ISP によっては、実験サービスをしているところも多くなってきているとは思います。 しかし、少なくとも私には、実際に IPv6 が必要になったことは一度もないし、 今後もなかなか無い気もしますが、今のうちにノウハウの蓄積をしておくのも、 悪くは無いでしょう。

ここでは、マシンの設定以外の手続きができる限り無い方法として、 6to4 を利用することにします。6to4 サービスを提供しているところは、 世界にはそこそこあるようですが、パフォーマンスを考えて、 国内でサービスしているところがよいと思います。今回は、 KDDI 研究所提供の 6to4 サービス を利用することにします。手順はほとんど変わらないので、 どこのサービスでもほとんど同じ操作でよいはずです。

IPv4 アドレスは固定割り当ての方がよいでしょう。以下、 固定割り当てを前提にします。

まず 6to4 を利用するためには、カーネルに stf(4) が組み込まれていなければなりません。

# ifconfig -C

と実行した結果に、stf の文字が見えたら、 stf(4) はカーネルに組み込まれています。もし無ければ、 カーネルコンフィグレーションファイルに、

pseudo-device stf 1

を加えてカーネルを再構築する必要があります。GENERIC カーネルには組み込まれていませんし、6to4 を利用するので無い限り、 組み込む必要はないので、ほとんどの方が再構築する必要があるでしょう。

4.2. stf(4) の手動設定

次に、stf(4) の設定をします。 6to4 の概要と利用方法については、 KDDI 研究所の web ページ を読んでください。 そこでは紹介されていない部分についてのみ書くことにします。

# ifconfig -a

を実行してください。おそらく stf0 が出て来ませんので、

# ifconfig stf0 create

として、stf0 を作成してください。pppoe0 同様、この作業は再起動するたびに必要です。次に、今割り当てられている IPv4 アドレスが 1.2.3.4 であるとすると、

+---------------------+-----------+-----------------------+
|        2002         | IPv4 ADDR |                       |
+---------------------+-----------+-----------------------+
| FP  |      TLA      |    NLA    | SLA ID | Interface ID |
|-----|---------------|-----------|--------|--------------|
| 001 | 0000000000010 |   32bit   | 16 bit |    64 bit    |
+---------------------+-----------+-----------------------+

といった形式の IPv6 アドレスを stf0 に割り当てます。 今の場合、

# ifconfig stf0 inet6 2002:0102:0304::1 prefixlen 16 alias

として stf0 に割り当てることになります。

次に、デフォルトルートを設定します。 KDDI 研究所の 6to4 実験サービスの場合、デフォルトルートは 2002:caff:2d05::1 ですので、

# route add -inet6 default 2002:caff:2d05::1

としてデフォルトルートの設定をしてください。これで IPv6 での接続性の確立は完了しました。

# ping6 -c 5 www.kame.net

と実行して確認してもよいでしょう。

4.3. stf(4) の自動設定

再起動のたびにこれらの設定をするのは面倒ですから、 自動設定するように修正を加えます。

内部のマシンも IPv6 を利用する可能性があるので、 この PPPoE ルータを IPv6 ルータとして設定しておきます。そのためには、 rc.conf(5) に、

ip6mode=router

という設定を加えてください。この設定により IPv6 forwarding の設定が有効になります。次に、

create inet6 2002l:0102:0304::1 prefixlen 16 alias

と書いた /etc/ifconfig.stf0 を用意してください。 これで stf(4) の設定は完了です。

デフォルトルートは不変ですから、/etc/rc.local の最後に、

/sbin/route -q add -inet6 default 2002:caff:2d05::1

の一文を足しておけばよいと思いますし、あるいは、 ifwatchd(8) の機能を用いて、ip-up, ip-down に書いてもよいと思います。 あるいは、ifconfig.stf0 に、

! /sbin/route -q add -inet6 default 2002:caff:2d05::1

と書くのもありです。私は、この方法をとっています。

4.4. rtadvd(8) の設定

PPPoE ルータだけ IPv6 での接続性があってもうれしいことは少ないので、 家庭内 LAN のマシンすべてで IPv6 接続性を確立するための設定をします。

すでに PPPoE ルータを IPv6 ルータにも設定しているので、PPPoE ルータ上の内向きインターフェイス fxp0 に IPv6 アドレスを割り当て、 ルータ広告デーモンを起動するのが一番楽ではないかと思います。

fxp0 に割り当てる IPv6 アドレスは、SLA ID を 1 にした 2002:0102:0304:1::1 にします。割り当てるアドレスが決まれば、

inet6 2002:0102:0304:1::1 prefixlen 64

と書いた /etc/ifconfig.fxp0 を用意するか、 すでに存在するのであれば、書き足して下さい。

次に、rtadvd(8) の設定ですが、

rtadvd="YES"
rtadvd_flags="fxp0"

という文を /etc/rc.conf に加えて、 マシンを再起動すればいいでしょう。これで IPv6 ルータに関する設定はすべて完了です。

4.5. 固定割り当てでない場合

IPv4 アドレスが固定割り当ての方がいい理由ですが、固定割り当ての場合、 おのずと IPv6 アドレスも決定されるので、設定がどれも非常に簡単ですが、 非固定の場合は以下のような問題があると考えられます。

  1. pppoe(4)stf(4) の依存関係の解決
  2. 割り当てられた IPv4 アドレスから IPv6 アドレスへの変換および各種設定

/etc/rc.local の最後でまとめて IPv6 周りの設定をする、 という方針をとれば問題の多くは解決しますから、 あとは設定するための苦労をする価値があるかどうかです。 残念ながら少なくとも私には苦労する価値は全くありませんでした。今回のように 6to4 を使うのではなく、gif(4) を用いたトンネルサービスだと、IPv4 アドレスが非固定の場合も考慮してあったりするのでまだましですが、 NetBSD 標準コマンドだけで実現されているものを見たことはありません。 肝心の設定ツール以外に、なんらかのソフトウェアの導入を強制されます。 それでもよいという方は、 頑張ってサービスを提供してくれるところを探しましょう。


5. マルチセッションの実現

NTT 西日本および NTT 東日本が今まで基本セッション数が 1 だったサービスについて、同時接続セッション数が 2 までは、 基本料金への追加料金なしで 2002/10/1 から提供することを決めたらしいので、 その対応作業をします。

PPPoE 接続自体は、pppoe0 に対して行った設定項目に関して、 pppoe1 についても同様に設定するだけです。

次に ifwatchd(8) ですが、 ip-up, ip-down が呼ばれる際に、 第一引数にインターフェイス名が入ってますので、 それを利用して起動すべきコマンド群の切替えをすればよいでしょう。例えば、

if [ "$1" = "pppoe0" ]; then
        ...
fi

if [ "$1" = "pppoe1" ]; then
        ...
fi

といった具合に、ip-up, ip-down を書き、 /etc/rc.confifwatchd_flags を、

ifwatchd_flags="-u /etc/ppp/ip-up -d /etc/ppp/ip-down pppoe0 pppoe1"

すればよいです。

次に、フレッツ ADSL 方面に関する DNS サーバの IP アドレスが分からないと困るわけですが、これについては、 まず PPP の機能から自動的に割り当てたアドレスを取得します。そのためには、

# ifconfig pppoe1 down
# pppoectl pppoe1 query-dns=3
# ifconfig pppoe1 up
# pppoectl -n 1 pppoe1
aaa.bbb.ccc.ddd
# pppoectl -n 2 pppoe1
xxx.yyy.zzz.aaa

と実行し、表示された IP アドレスを控えておきます。このとき、 0.0.0.0 と表示されたらアドレスはとれてません。 接続が確立されれば、少なくとも一個はアドレスを取れるはずですので、 取れないときはきっと NTT 側の障害でしょう。

取ったアドレスをどうするかですが、ローカルに DNS サーバを用意して、 フレッツ関係のアドレスを引く必要があるときは今取ったアドレスに、 それ以外は、ISP の用意している DNS サーバに forward するような設定にするのもひとつの手です。

他にも方法はいろいろあると思いますので、世界に迷惑をかけない程度に実験し、 自分の用途にあった方法を見付けましょう。

私は daemon-systems.org というドメインを、 自分の手もとで運用していますので、DNS サーバは必然的に立てる必要があり、 そこで処理させています。

これでフレッツスクウェアにも同時にアクセスできるようになります。 速度測定でもしてみるのはどうでしょうか。


MAEKAWA Masahide

To index