さて、先日から PPPoE サーバを FreeBSD で作る企画を進めているんだけど、 今日はじめて大掛かりに一台システムを組んでみました (参照: 2002/01/11 2002/01/13, 2002/01/15)。 参考までに、以下の記述は、FreeBSD 4.5-RELEASEp2 をベースに記述しています。
まずは、次のような /etc/ppp/ppp.conf を用意しました。 基本的には先日の成果を利用しています。
default: set log Phase Chat LCP IPCP CCP tun command ident FreeBSD userland PPP # Ensure that "device" references the correct serial port # for your modem. (cuaa0 = COM1, cuaa1 = COM2) # set device /dev/cuaa1 set speed 115200 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \ \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT" set timeout 180 # 3 minute idle timer (the default) enable dns # request DNS info (for resolv.conf) service-pppoe: set mru 1492 set mtu 1492 allow mode direct set speed sync enable lqr enable pap enable chap disable deflate disable pred1 set ifaddr 172.16.0.1 172.16.0.100-172.16.0.199 255.255.255.255 accept dns set timeout 7200
NAT は IPFILTER で行うことにしました。 ということで、 カーネルの config ファイルに IPFILTER と IPFILTER_LOG の options を加えて、 カーネル再構築→インストールを行います。 そして NAT の設定として、次の設定を /etc/ipnat.rules に書きます。 ここで、 A.B.C.D はパブリック側のインターフェース (fxp0) の IP アドレスです。
map fxp0 172.16.0.0/24 -> A.B.C.D/32 portmap tcp/udp 1025:65000 map fxp0 172.16.0.0/24 -> A.B.C.D/32
これらの環境を整えるため、 /etc/rc.conf に以下の設定を加えます。
ifconfig_fxp1="inet 192.168.1.2 netmask 255.255.0.0" pppoed_enable="YES" pppoed_provider="service-pppoe" pppoed_flags="-P /var/run/pppoed.pid" pppoed_interface="fxp1" gateway_enable="YES" ipnat_enable="YES"
これで /etc/ppp/ppp.secret を用いた認証で PPPoE ができるようになります。 そこで、さらにユーザアカウント認証を RADIUS サーバから得るようにします。 これを行うには、まずは /etc/radius.conf を用意します。 ここで、RADIUS サーバのホスト名を radius.hoge.hoge、 RADIUS のパスワード XXXXXX をとします (ここではまだ auth だけで acct はやっていないですが、 いずれやる必要があるでしょう)。
auth radius.hoge.hoge XXXXXX
そして、さしあたって PAP 認証のみを有効にし、 /etc/radius.conf のデータをもとに、RADIUS 認証を行うことにします。 /etc/ppp/ppp.conf の service-pppoe: の部分を以下のように変更します。
service-pppoe: set mru 1492 set mtu 1492 allow mode direct set speed sync enable lqr enable pap disable chap disable deflate disable pred1 set radius /etc/radius.conf set ifaddr 172.16.0.1 172.16.0.100-172.16.0.199 255.255.255.255 accept dns set timeout 7200
ところが、これをやるとなぜか、 クライアントの IP アドレスが 255.255.255.254 になってしまうことが判明しました。 調べると、同じトラブルが昨年の freebsd-net に報告されているのを発見。 このスレッドでも触れられている通り、 255.255.255.254 は RADIUS プロトコルにおいて、 アクセスポイントがローカルで所有する IP アドレスを割り当てさせる特殊な値です。 ということで、どうやら ppp(8) がこのアドレスを正しく解釈していないらしい。
ということで、 このバグを修正するパッチを作成。 FreeBSD-current のソースには既に commit した上 (usr.sbin/ppp/auth.c, usr.sbin/ppp/radius.h)、 -stable にも近いうちに MFC する予定なので、 FreeBSD 4.6-RELEASE 以降ではこのバグは直るでしょう。 4.5-RELEASE 以前を使っている場合は、 このパッチを src/usr.sbin/ppp/ で適用してください。
ということで、 これで FreeBSD BOX が PPPoE サーバとして使用できるようになりました。 めでたしめでたし (実は最近うちのページに、 「FreeBSD PPPoE サーバ」というキーワードで google してくる人が多いので、 いったんまとめてみることにしたのでありました ^^;)。