第3回 FreeBSD+IPFilter+PPPoEでブロードバンドルータを作る

2002/5/6作成
2003/2/4更新


ブロードバンド化と家庭で所有するPCの数が増えてきている傾向により、ブロードバンドルータの需要が高まっています。
各社からいろんなブロードバンドルータがラインナップされていますが、そんなのを買わなくても使い古したパソコンにネットワークカードが最低1枚入っていればファイアウォール付きのルータができてしまいます。
ここに書いてある方法で作ったルータはBフレッツの他にもフレッツADSLなどPPPoEを使った認証のものに利用できます。PPPoAには残念ながら利用できません。

書いていることに間違いや意見がありましたらどんどん指摘してください。



1.概要

他にもいくつか方法がありますが、今回はintelなマシンにFreeBSDを入れてルータになってもらうことにします。
理由はいろいろありますが、FreeBSDが個人的に慣れ親しんだOSであること、Linuxに比べると比較的軽いこと、そのうちIPv6で遊ぼうと思っていたこと主な理由です。
ちなみにFreeBSDじゃなくても
 ○LinuxとNAT+IPマスカレード
 ○WindowsNT/2000/XP+IPフォワーディング
などの方法でもブロードバンドルータを作ることができると思います。
Windowsはライセンスやマシンスペック、セキュリティなどの問題で候補から外しました。

2.ハードウェアの構成

ルータを動かすシステムのハードは速ければ速いほどいいのですが、現在のBフレッツファミリー(10M)ではこのくらいで間に合っています。
CPU Pentium200 P54C
メモリ 96MB(SIMM)
NIC(LAN) intel PRO/100+
NIC(PPPoE) 3com 3C905B

3.ソフトウェア(モジュール)の導入について

ルータで動かすためには、ルータで動かすためのソフトが必要になります。
ApacheやBINDなどのソフトウェアと違ってこれらのソフトウェアはモジュールとしてカーネルに組み込む必要があります。
したがって、この作業はFreeBSDのカーネル再構築に関する知識が最低限必要となります。
カーネルの再構築に関してはここでは特に説明しません。詳しくはFreeBSDのハンドブックに載っているのでそちらで確認してください。
今回使用するOSはFreeBSD4.5-RELEASEを使います。入手方法はいろいろありますが、ftpで取得したり雑誌の付録で手に入れたりするのが一般的でしょう。他にもPlat'HomeLaser5から日本語版が出ています。アメリカのFreeBSD MALLで入手することもできます。
FreeBSDの標準インストール状態のカーネル(GENERICカーネル)ではサポートされていない機能があるためそれらを追加する必要があります。
必要なモジュールと導入方法について以下にまとめました。
モジュール 導入方法 説明
ppp 導入済み ダイヤルアップなどでポイント-ポイント接続をするために必要
pppoe カーネルに追加 pppを拡張したもの、Ether上でpppが使えるようになる
IP Filter カーネルに追加 パケットのフィルタリングをしてファイアウォールを実現する
pppoe、IPFilterのどちらもカーネルの再構築でできるので手間が省けました。

4.カーネルの再構築

それではさっそくPPPoEとIPFilterを導入するためにカーネルを再構築します。
○PPPoEを有効にする
PPPoEを有効にするために、以下の内容を書き加えておきます。
options NETGRAPH
options NETGRAPH_PPPOE
options NETGRAPH_SOCKET
○IPFilterを有効にする
IPFilterを有効にするためには上に加えて以下の行をカーネルのファイルに追加します。
#options TCP_RESTRICT_RST #--->1
options TCP_DROP_SYNFIN #--->2
options IPFILTER #--->3
options IPFILTER_LOG #--->4
options IPFILTER_DEFAULT_BLOCK #--->5
・・・<省略>・・・
# pseudo-device bpf #Berkeley packet filter --->6
1=>TCPのRSTフラグのものを廃棄するオプションなのですが、なぜかこのままではカーネルの構築に失敗してしまうのでコメントアウト。
2=>SYN/FINフラグのパケットを廃棄します。1,2の設定は特に必須ではありません。
3=>IPFilterを有効化
4=>IPFilterでログを有効化、IPFilterでlogオプションが有効になります。
5=>IPFilterの設定がデフォルトブロックになります。何も設定していないとまったくネットワークが使えません。
6=>bpf(Berklay Packet Filter)を無効化します。IPFilterを使うのでデフォルトのbpfは使わなくなります。

bpfを外す前に!
 bpfを無効化すると、プロミスキャストでのパケット受信ができなくなるため以下のような弊害が出ます。bpfを外すときはご自分で十分判断してから外してください。

 - tcpdumpができなくなる
 - etherealなどでパケットキャプチャができない可能性が高い
 - DHCPクライアントが使えなくなる
 - 自分がDHCPサーバになれない
 - IPのフィルタリングがIPFilterに処理が移ったので、IPFilterの設定を入れないとまったくネットワークを利用できない

あとはconfigしてmake dependしてmakeしてmake installしましょう。

5.pppの設定

今回はPPPoEですがコンフィグはpppの設定ファイルと同じでppp.confになります。
置き場所ですが、いろんな記事を読むと/etc/ppp.confに置くようなことが書いてあるのですが、FreeBSD4.5の場合は/etc/ppp/ppp.confに置きます。
実は私も3時間くらいこれではまってしまいました(笑)
以下はうちで動いているppp.confです。よろしければ参考にしてください。
default:
set device PPPoE:xl0 ---(1)
set MRU 1454 ---(2)
set MTU 1454 ---(2)'
set speed sync
set log Phase tun command
set ifaddr 10.0.0.1/0 10.0.0.2/0 ---(3)
add default HISADDR
nat enable yes ---(4)
accept chap
accept pap

#OCNのユーザ名とアクセスパスワード
ocn: ---(5)
set authname xxx@yyy.ocn.ne.jp ---(6)
set authkey [password] ---(7)

#フレッツテスト用サイトの設定
square:
set authname guest@flets
set authkey guest
<解説>
(1) xl0はPPPoEを使うネットワークカードを指定します。自分のカードがなんなのかわからないときはifconfigとかdmesgで確認してください。
(2) BフレッツやフレッツADSLを使うとき、MRU(Maximum Recieve Unit)が1454オクテットでなければなりません。(NTT発行の技術参考資料(pdf)4.1.3より)自分のMTUは相手のMRUなのでここは両方1454にします。FreeBSDのハンドブックを見ると、1492になっていますが、1492だとパケットが落とされるので通信に支障が出ます。ここもはまりやすいです。
(3) IPCPでIPアドレスを払い出してもらう時はこのままにします。もし、払い出してもらうアドレスが決まっている場合、は直接IPアドレスを記入することができます。最初のアドレスは自分のアドレスで、次のアドレスが対向のルータのアドレスになります。詳しくはppp.confのマニュアルに書いてあります。うちでは固定IPを申し込んでいるのでここは静的に書いても良かったのですが、IPCPでアドレス教えてくれるのでそのままにしてあります。
(4) NATを使うときはYESにします。ところが、ppp起動時にもコマンドにNATオプションを付けるので、本当に必要なのかどうかはよくわかりません。とりあえず付けてあります。もちろんNATを使うつもりが無ければ付けなくてもいいですが、付けないとブロードバンドルータとしての機能果たさないような・・・
(5) 適当な名前付けてください。うちはOCNなのでocnにしてあります。
(6) プロバイダにアクセスするためのユーザ名を入れます。詳しくはプロバイダから送られてくる資料を見てみましょう。
(7) 同じくパスワードです。
起動するときは以下のコマンドをrootで入力します。
"ocn"のところは上の(5)で入れた名前に置き換えてください。
# ppp -ddial -nat ocn
あと、マシン起動時に自動接続したいので、rc.confに書き加えておきます。
手動接続でいい人は特に必要ありません。
/etc/rc.confに以下を書き加えます。一番最後に書いたほうがいいと思います。
ppp_enable="YES"
ppp_mode="ddial" #pppの起動オプションのようです
ppp_nat="YES" #NATを使わない場合は不要
ppp_profile="ocn" # (5)で書いたのを入れます
【6/1更新】pppでNATをかけずにIPFilterでNATをかける方法に変更しました。こちらへどうぞ。

6.IPFilterの設定

IPFilterの設定ファイルは/etc/ipf.ruleに記入します。
非常に長いのでこっちに置いておきます。といっても、参考文献に書いてあるFirewall構築ガイドに書いてあるのをそのまんま写しただけです。
コツはWANのデバイスがxl0じゃなく、tun0になっているところです。
ここだけ注意すればあとは特に問題ないです。
起動時にIPFilterが有効になるように、こっちもrc.confに変更を加えます。
NATはpppでかけているのでここでは無効にしておくことにします。
pppでNATをかけた場合とIPFでNATをかけた場合にどう違うのか面白そうなのでそのうち実験してみようと思います。
ipfilter_enable="YES" #IPFilterを有効化
ipfilter_rules="/etc/ipf.rules" #コンフィグファイルの位置
ipfilter_flags="" #起動オプションがあればここに書く
gateway_enable="YES" #ルータとして動かす場合はYES
ipmon_enable="YES" #IPFのログを取る
ipmon_flags="-D /var/log/ipflog" #IPFのログの位置
#ipnat_enable="YES" #IPFでNATを使う場合はYES
#ipnat_rules="/etc/ipnat.rules" #NATファイルの位置

〜参考文献〜
Software Design 2001/2月号 特集:今すぐできるファイアウォール 技術評論社
Firewall構築ガイド http://www.tac.tsukuba.ac.jp/~hiromi/firewall.html
FreeBSDハンドブック http://www.freebsd.org/ja/handbook/index.html
FreeBSD-net-jpメーリングリストアーカイブ http://home.jp.freebsd.org/cgi-bin/namazu.cgi


もどる