HOME / コンピュータTips / FreeBSD / FreeBSDでPPPoEを設定する(ipfwとnatdつき)

Date: 2001/07/14 |  このエントリーをはてなブックマークに追加  |  Tags: FreeBSD, PPPoE, ipfw, natd, BA512, バーチャルコンピュータ, virtualcomputer, ダイナミックDNS, ddns, bind, nsupdate

もはやいろんな人が書いているので今更書く必要が無いが、自分用のメモも含めて。

ADSLになったときに予定していたInfosphereのBizADSL8が神奈川県でオープンしなかったので、wakwak.comの固定IPアドレスサービス(1IPのみ)を繋ぎとして申し込んでいた。そのときのメンテナンスでルータNTT-MEのBA512を付け、サーバの外側の足に丸無げ(バーチャルコンピュータ)を設定していたのだが、このバーチャルコンピュータの設定がなにをしているのかイマイチ不明という問題が起きていた。そもそもBA512のマニュアルには大したことが書いてなく、まるで「こんなに簡単よ」と言わんがために多くのものを語らない設定になっているのだ。

フレッツISDNでのときのように、最終的にはIPアドレスを8つもつ(Biz8)ので、ルータはunnumbererd対応でなくてはならない。実はこれに対応しているルータは少なく、1万円台では私が買うときにはほぼBA512しか選択肢がなかった。そういうことでルータはこれにせざるを得なかったのだ。ちなみに、BA512の設定優先順位は、

  1. メンテナンスページのMACアドレス指定
  2. ポートフォワーディング
  3. 丸投げ

の順であることは忘れないようにしておこう。セキュリティのためにルータは内側のマシンのMACアドレスからしか設定ページを表示不可能にしておく。この設定をしてルータの外側の足(つまり丸無げされて直結されたサーバの外側の足につながる)を叩く。当然、インターネットからは80番が叩かれたら内側のサーバのapacheのページが見える。ところが、メンテナンスページのMACアドレスの指定が一番上にあるということは、LANの中からそのマシン経由で見ると、絶対に設定画面にしか行けない。これを防ぐためには中からの名前解決を偽るとか、そういう姑息なことをしなくてはならないのだが、普通、ルータの外側の足を叩くか、ルータの中側の足を叩くかでそれを区別しないか?

まあよいことにしよう。

PPPoEの設定をしてルータに一時的に眠ってもらう必要があったのは、そういう理由だけではなく、ダイナミックDNSがこのネットワーク構造では動かないらしいこともあった。nsupdateのログを見ると、更新をしようとしたマシンrevfromに対してコネクションを貼ろうとして届かないというようなエラーがでる。確かにdnsはルータの外の足のIPアドレスということになっているから、一度ルータの外の足を叩いて帰ってくる。バーチャルコンピュータというルータの機能が何をやっているのかわからないので、ここでなにかが起きていてもイマイチ謎なのだ。dnsの動くマシンにとっての外側の足がグローバルIPではなく、namedに登録されているものとも違うというトリックとも関係があるような気がするし。

それも今月末までだと思ってたので良いかなと思っていたのだが、Infosphereが8月上旬まで工事が伸びたというからあと1ヶ月ということになってしまった。ということでPPPoEに入れ換えて、ネット構成を返る必要が出たというわけだ。(ああ、長い前振り)

PPPoEはそれほど難しくなく、ほとんどハンドブックの通りで動く。面倒なのは外のIPが変ったので、ipfwやnatd、squid、namedの書き換えだったりする。

まず最初にやらなくてはならないのはコネクションの切断だ。いいかげんに切断するとペナルティなのか、数分は復旧しないのでルータから素直に切断する。そして物理的な配線を変更。うっかりADSLモデムとクロスでつないでハマる。ちゃんとストレートでつなごう。

そしてカーネルをリコンフィグする。こんな感じなものを追加しよう。

--------------カーネル設定ファイルの一部抜粋。
options         IPFIREWALL              #firewall
options         IPDIVERT                #divert sockets
options         NETGRAPH
options         NETGRAPH_ETHER
options         NETGRAPH_PPPOE
options         NETGRAPH_SOCKET
--------------カーネル設定ファイルの一部抜粋。

ここでのキモは、NETGRAPH_ETHER以下がないとモジュール達がうまくいかんと怒られることだ。

module_register: module netgraph already exists!
linker_file_sysinit "netgraph.ko" failed to register! 17

バージョン固有の問題なのかもしれないしmake cleanをきっちりやらないとならなかったのかもしれないが、上記のように設定して解決した。ハンドブックにはNETGRAPH_ETHERが記述されて無いので注意。IPFIREWALLとIPDIVERTはipfwとnatd用。両者を使わないならばこのページを見るよりも他の人のページを見たほうが楽だと思う。

ppp.confの設定は次のとおり。

--------------/etc/ppp/ppp.conf
default:
 set device PPPoE:vr0
 set mru 1454
 set mtu 1454
 set log Phase Connect TUN command
 add default HISADDR
 accept CHAP

demand:
 set authname USERNAME@provider.ne.jp
 set authkey PASSWORD
--------------/etc/ppp/ppp.conf

vr0は外側の足。mruとmtuは1454にするほうがフレッツADSLでは効率がよいそうだ。ドリームキャストのPSOが動かなそうだが持って無いので良い事にしよう。ほかにキモはない。

案外簡単なのだが、rc.confも弄る。

--------------/etc/rc.confの抜粋。
hostname="necromancer.justplayer.com"
network_interface="lo0 vr0 fxp0"
ifconfig_lo0="inet 127.0.0.1"
ifconfig_vr0="up"
ifconfig_fxp0="inet 192.168.1.254 netmask 255.255.255.0"

ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="demand"
ppp_nat="NO"
firewall_enable="YES"
firewall_quiet="NO"
firewall_type="simple"
natd_enable="YES"
natd_interface="tun0"
gateway_enable="YES"
--------------/etc/rc.confの抜粋。

ここでキモが少し。バグかもしれないが、外側の足のvr0をupでむりやり起こしておかずにpppに任せると、pase not presentでカーネルが落ちる。そういうもんなのかも知れないが、こんなもんで落ちてよいものなのかは疑問が残る。まぁ偉い人がそのうち判断するに違いない。upで起こしておかなくても落ちないNICもあるようなのだが、落ちるNICの人は試してみるとよいかもしれない。

natはnatdにやらせるので、ppp_natはNO。また、firewallがsimpleなのだがfirewallは別のスクリプトを持っていてrc.localの時に閉じている。

natdがきどうするときに、ppp -ddial demandがダイアルをコネクトしないとどうやらnatdが立ち上がらない気がする。仕方がないのでrc.localで現在は上げているが、そのうち気が向いたらもう少しメンテする予定。あと、gateway_enable="YES"でなくてはうまくいかない。そのあたりはnatdのマニュアルに記載されている。以上。