2002 年 4 月 4 日 (木) 三田

さて、先日から 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 してくる人が多いので、 いったんまとめてみることにしたのでありました ^^;)。


このサイトへのリンクには何ら許可は必要ありません。 ただし、無断で写真をダウンロードして他の場所に掲載したり、 画像加工の素材として利用するなど、再配布に当たる行為はしないようにしてください。 また、このサイトへのリンクであることを明示すること無しに <img src="..."> などで他のページの内部に画像ファイルを取り込むことも、 ご遠慮下さい。