PPPoEルータを構成するには、イーサネットのインターフェースが 2 つ必要です。詳しく言うと、1 つでも実現できないわけではありませんが、2 つ使う方がオススメです。その他には、特別なハード構成は必要ありません。私が実際に使っているハードウェアも別掲しました。
私は、SiS900 というチップを搭載した、MELCO/BUFFALO の LGY-PCI-TXC というボードを使いました。FreeBSD では、このボードは、sis ドライバが対応します。2 枚挿すと、sis0 と sis1 になります。以下では、sis0 を「家庭内 LAN」に繋ぐためのポート、sis1 をADSLモデムに繋ぐためのポートとして使っています。
なお、同じボードを 2 枚挿すと、どちらが sis0 でどちらが sis1 になるのかよく分かりません。(技術的には、PCI スロットの優先順位によるらしいのですが。) そこで、ボードを挿す前に、イサーネットアドレス (MAC Address) を確認しておくことを勧めます。大抵のイーサネットカードでは、ボードに、イーサネットアドレスを書いたシールが貼ってあると思います。FreeBSD の起動時に、sis ドライバの初期化の段階でイーサネットアドレスが表示されますから、それを使って対応を取ることができます。(起動時のメッセージは、後から dmesg コマンドを使って確認することもできます。
私は、FreeBSD 4.2 RELEASE (実際には、これをベースに、いくつかのセキュリティパッチを適用したもの) を使っています。また、ppp は 2.3 版に入れ換えています。どのバージョンの FreeBSD から PPPoE に対応しているのかははっきりしない (ハンドブックに「PPPoE を使うためにはバージョン××以降が必要です」という記述があるのだか、「××」の部分がどんどん新しくなってしまう。:-) 基本的には ppp は入れ換えてしまいますので、NETGRAPH が対応していればいいはずです。たぶん、3.4 RELEASE 以降、というのが正解のようです。
ppp については、MTU に関する説明でも書いていますが、ルータとして PPPoE を使うには2000年12月以降のバージョンが必要です。これは、FreeBSD 4.2 RELEASE までには含まれていませんから、最新版に入れ換えることが必要です。
なお、FreeBSD にもときどき、いわゆるセキュリティホールが見つかり、随時修正が提供されています。ADSL でインターネットに常時接続されることになるわけですから、ちょっとしたセキュリティホールが致命的になるおそれもあります。あまり古いバージョンのソフトウェアを使い続けるのは、この意味で、PPPoE ルータには不適切です。新規にインストールするならできるだけ新しい版の RELEASE や STABLE を使い、適切なタイミングでセキュリティパッチも適用するように心がけるべきです。
いわゆる NAT BOX に仕立てるため、いくつかのパッケージもインストールしています。(ports でもいいのでしょうが、コンパイルが面倒なので。)
ここで示している設定は、以下のようなネットワークを対象にしています。
sis1。以下、私が 2000 年 3 月の時点で実際に使っている設定ファイルの内容を示します。
/etc/rc.confの設定ifconfig_sis0="inet 192.168.250.1 netmask 255.255.255.0" ifconfig_sis1="up media 10baseT/UTP" # to be used by PPPoE ppp_enable="YES" ppp_profile="-unit0 adsl" hostname="bear.home.example.com" sendmail_enable="NO" named_enable="YES" named_flags="" gateway_enable="YES" xntpd_enable="YES" sshd_enable="NO" inetd_enable="YES" usbd_enable="YES" apm_enable="YES" blanktime="60" saver="apm" rand_irqs="10 12 14 15" portmap_enable="NO"
/etc/ppp/ppp.confの設定default: set log phase tun command pppoe: set device PPPoE:sis1 set mru 1454 set mtu 1454 set dial set login set redial 1 8 set timeout 900 # 15 minutes protect: nat enable yes nat deny_incoming no # yes nat same_ports yes nat use_sockets yes nat log yes set filter in 0 permit udp src eq 123 dst eq 123 set filter in 1 deny udp dst lt 1024 set filter in 2 deny tcp dst lt 1024 set filter in 3 permit 0/0 0/0 set filter out 0 permit udp src eq 123 dst eq 123 set filter out 1 deny udp src lt 1024 set filter out 2 deny tcp src lt 1024 set filter out 3 permit 0/0 0/0 set filter dial 0 deny udp dst eq 123 set filter dial 1 permit 0/0 0/0 set filter alive 0 deny udp dst eq 123 set filter alive 1 deny udp src eq 123 set filter alive 2 permit 0/0 0/0 adsl: load pppoe load protect set authname XXXXXXXX set authkey XXXXXXXX set ifaddr 10.0.0.1/0 10.0.0.2/0 add! default HISADDR
上の例で、MTU/MRU を指定する部分は、このページを初めて公開した時点では以下のようになっていました。
set mru 1454 set mtu 1454
実際、当時は私のマシンの設定もそうなっており、問題なく動作していました。
ところが、FreeBSD を 4.4 RELEASE にアップデートしたところ、また、ブラックホール問題が発生するようになってしまいました。調べると、MTU/MRU に関するネゴの動作が変更になっているようでした。この新しいバージョンで、TCP MSS FIXUP を機能させるためには、maxというキーワードを追加する必要がありました。
/etc/namedb/named.confの設定
options {
        directory "/etc/namedb";
        listen-on { 192.168.250.1; 127.0.0.1; };
        forwarders {
                211.15.32.8;            // Metallic
                211.15.32.18;           // Metallic
        };
        dump-file "s/named_dump.db";
};
zone "." {
        type hint;
        file "named.root";
};
zone "0.0.127.in-addr.arpa" {
        type master;
        file "localhost.rev";
        allow-query { 127.0.0.1; 192.168.250.0/24; };
};
zone "0.0.10.in-addr.arpa" {
        type master;
        file "pppdummy.rev";
        allow-query { 127.0.0.1; 192.168.250.0/24; };
};
zone "example.com" {
        type master;
        file "s/example.com";
        allow-update { 127.0.0.1; };
        allow-query { 127.0.0.1; 192.168.250.0/24; };
};
zone "250.168.192.in-addr.arpa" {
        type master;
        file "s/250.168.192.in-addr.arpa";
        allow-update { 127.0.0.1; };
        allow-query { 127.0.0.1; 192.168.250.0/24; };
};
/etc/namedb/pppdummy.revの設定
$TTL    3600
@       IN      SOA     bear.home.example.com. root.bear.home.example.com. (
                                1       ; Serial
                                3600    ; Refresh
                                900     ; Retry
                                3600000 ; Expire
                                3600 )  ; Minimum
        IN      NS      bear.home.example.com.
/etc/namedb/s/example.comの設定(未稿)
/usr/local/etc/dhcp.confの設定(未稿)
/etc/ntp.confの設定(未稿)