NetBSD で無線ブロードバンドルータ

NetBSD で無線ブロードバンドルータ

ノートPCに NetBSD をインストールして無線ブロードバンドルータを作ったときのメモです。
以下のような構成で使うことを想定しています。

           PPPoE                  wireless
Internet <-------> NetBSD router <------> LAN (192.168.0.0/24)
                 ne0           wi0
                          192.168.0.254/24

無線アクセスポイントの設定

LAN側を無線LANにするため、無線LANカードをアクセスポイントとして動作させます。無線LANカードは COREGA PCCB-11 を使いました。LAN側のネットワークアドレスを192.168.0.0/24、無線LANカードのIPアドレスを192.168.0.254/24とするものとします。

NetBSDのアップデート

NetBSD を無線アクセスポイントとして動作させるには、NetBSD 2.0 以上、または NetBSD-current にする必要があります。(NetBSD-1.6.2 以前のリリースではアクセスポイント機能は動作しません。)

/etc/ifconfig.wi0 の作成

COREGA PCCB-11 は wi0 として認識されます。アクセスポイントを

IPアドレス: 192.168.0.254/24
SSID: my_ap
WEPキー: 11111111

と設定する場合、以下の内容を /etc/ifconfig.wi0 に書きます。

inet 192.168.0.254 netmask 0xffffff00 nwid my_ap nwkey 0x11111111 media DS11 mode 11b mediaopt hostap

ifconfig のオプション mediaopt hostap がアクセスポイントとして動作させるためのオプションとなります。

PPPoEの設定

NetBSD での PPPoE の設定は、NetBSDドキュメンテーションのPPPoE (DSL) 経由の接続手順が参考になります。
基本的には /etc/ifconfig.pppoe0 を作成し、認証用ID、パスワード、各種パラメータを書きます。

/etc/ifconfig.pppoe0の作成

以下の内容を /etc/ifconfig.pppoe0 に書きます。

create
! pppoectl -e ne0 $int
! pppoectl $int myauthproto=pap myauthname=xxx myauthsecret=yyy
hisauthproto=none max-auth-failure=0 max-noreceive=20 max-alive-missed=3
0.0.0.0 0.0.0.1 netmask 255.255.255.255 up

ここでは PPPoE で使う Ethernetインタフェースを ne0 にしてます。
あらかじめ ne0 を有効にするため、/etc/ifconfig.ne0 を作成し、

up

と書いておきます。

PPPoE に関するパラメータの意味は以下のとおりです。
フレッツでは網から1分毎に LCP Echo リクエストが送信されてくるので、20秒ごとに3回 LCP Echo リクエストを送信しても応答がない場合に切断するように設定します。

myauthproto=pap
認証に pap を使用。
max-auth-failure=0
再接続を停止するまでの認証失敗の回数。0の場合は停止しない。
max-noreceive=20
LCP Echo 送信のタイミング。20秒に設定。
max-alive-missed=3
切断と判断するまでの LCP Echo 未応答の回数。

kernel option の追加

フレッツでは PADT を受信しないかぎり、1分ごとに5回 LCP Echoリクエストを送信しても応答がない場合にはじめて切断とみなすようです。そのため、PADT を送信せずに再起動した場合などは網側のほうで PPPoE セッションを保持しているため、約6分間はすぐに接続できない状況となってしまいます。

kernel config に以下の option を追加して再構築した kernel を使うことにより、不明な PPPoE セッションに対して PADT を送信する機能が有効になり、再起動後でもすぐに接続することができます。

options PPPOE_TERM_UNKNOWN_SESSIONS

Bフレッツなどで別の複数のマシンで PPPoE で接続する場合は、他の PPPoE セッションが切断されてしまうので注意してください。

/etc/ppp/ip-up, /etc/ppp/ip-down の作成

/etc/ppp/ip-up に以下の内容を書きます。
PPPoE で接続したときに接続先をデフォルトルートに設定します。このファイルは root が実行可能にしておきます。

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

/etc/ppp/ip-down に以下の内容を書きます。
PPPoE が切断したときにデフォルトルートを削除します。このファイルは root が実行可能にしておきます。

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

/etc/rc.conf に以下の行を追加します。

ifwatchd=YES

これにより、ifwatchd デーモンにより PPPoE が接続したときには、/etc/ppp/ip-up が実行され、切断したときには、/etc/ppp/ip-down が実行されます。

PPPoEマルチセッションの設定

PPPoEマルチセッションで ISP とフレッツスクウェアを同時に接続する場合は、2セッション目のPPPoE接続の設定を /etc/ifconfig.pppoe1 に書きます。 フレッツスクウェアへの接続は、IDが”guest@flets”、パスワードが”guest”です。

create
! pppoectl -e ne0 $int
! pppoectl $int myauthproto=pap myauthname=guest@flets myauthsecret=guest hisaut
hproto=none max-auth-failure=0 max-noreceive=20 max-alive-missed=3
0.0.0.0 0.0.0.1 netmask 255.255.255.255 up

/etc/ppp/ip-up に2セッション目が接続された場合に2セッション目へのルーティングテーブルを追加する設定を追記します。

#!/bin/sh
if [ "$1" = "pppoe0" ]; then
  /sbin/route add default $5
  /etc/rc.d/named restart
fi
if [ "$1" = "pppoe1" ]; then
  /etc/ppp/flets.sh add $5
  /etc/rc.d/named restart
fi

/etc/ppp/flets.sh は、2セッション目にルーティングさせるためのルーティングテーブルを設定するスクリプトです。2セッション目へのルーティングテーブルは、http://routing.flets/routing.html の情報を参考に作成します。/etc/ppp/flets.shは以下のように書いておきます。

!/bin/sh
route $1 -net 220.210.194.0 -netmask 255.255.255.128 $2
route $1 -net 220.210.195.0 -netmask 255.255.255.192 $2
route $1 -net 220.210.195.64 -netmask 255.255.255.224 $2
route $1 -net 220.210.196.0 -netmask 255.255.255.0 $2
route $1 -net 220.210.197.0 -netmask 255.255.255.192 $2
route $1 -net 220.210.197.64 -netmask 255.255.255.224 $2
route $1 -net 220.210.197.96 -netmask 255.255.255.224 $2
route $1 -net 220.210.198.0 -netmask 255.255.255.192 $2
route $1 -net 220.210.199.0 -netmask 255.255.255.224 $2
route $1 -net 172.25.0.0 -netmask 255.255.0.0 $2
route $1 -net 172.27.0.0 -netmask 255.255.0.0 $2

/etc/ppp/ip-down は以下のようにします。

#!/bin/sh
if [ "$1" = "pppoe0" ]; then
   /sbin/route delete default $5
fi
if [ "$1" = "pppoe1" ]; then
   /etc/ppp/flets.sh delete $5
fi

また、フレッツスクウェア内のDNS解決はフレッツスクウェア内のDNSサーバでのみ行われるため、問い合わせるドメイン毎に問い合わせ先のDNSサーバを切り替える必要があります。そのためルータにDNSプロキシ機能を持たせ、PPPoE 接続をする毎に

$ /etc/rc.d/named restart

として、DNSサーバを初期化するようにしています。

DNSプロキシの設定

DNSプロキシは NetBSD に標準でインストールされている BIND を使って実現します。
BIND の設定は、/etc/named.conf に設定します。 設定する内容としては、通常のDNS問い合わせはISPのDNSサーバ (210.0.0.1、210.0.1.1) に、.fletsドメインの問い合わせについてはフレッツスクウェア内のDNSサーバ (220.210.194.67, 220.210.194.68) に問い合わせるようにするものとします。
/etc/named.conf の設定は以下のようになります。

options {
        directory "/etc/namedb";
        forward only;
        forwarders {
                210.0.0.1;
                210.0.1.1;
        };
};

zone "flets" {
        type forward;
        forward only;
        forwarders {
                220.210.194.67;
                220.210.194.68;
        };
};

zone "194.210.220.in-addr.arpa" {
        type forward;
        forward only;
        forwarders {
                220.210.194.67;
                220.210.194.68;
        };
};

また、ルータ自身でも問い合わせ可能となるように、/etc/resolv.conf に

nameserver 127.0.0.1

と設定しておきます。

NAPTの設定

NAPT (IPマスカレード) で動作させるため、ipfilter とipnat の設定をします。

ipfilterの設定

/etc/ipf.conf に以下の内容を書きます。
最初はすべて許可としておきます。

pass in from any to any
pass out from any to any

ipnatの設定

/etc/ipnat.conf に以下の内容を書きます。
フレッツADSLではMTU値が1454であるため、WAN側からコネクションが MSS(=MTU-40)値が1414となるように mssclamp オプションを設定します。

map pppoe0 192.168.0.0/24 -> 0/32 proxy port ftp ftp/tcp mssclamp 1414
map pppoe0 192.168.0.0/24 -> 0/32 portmap tcp/udp 40000:60000 mssclamp 1414
map pppoe0 192.168.0.0/24 -> 0/32 mssclamp 1414

逆にLAN側からのコネクションに対してもMSS値が1414となるようにするには、 /etc/sysctl.conf に以下の内容を追加します。

# Obey interface MTUs when calculating MSS
net.inet.tcp.mss_ifmtu=1

/etc/rc.confの設定

/etc/rc.conf で ipfilter と ipnat の設定を有効にします。

ipfilter=YES
ipnat=YES

パケットフォワーディングの設定

/etc/sysctl.conf で以下の内容を追加して、パケットフォワーディングを有効にします。

net.inet.ip.forwarding=1

kernel config で以下のoptionを有効にしている場合は上記の設定なしでパケットフォワーディングが有効になります。

options         GATEWAY         # packet forwarding