(This page is written in Japanese.)

水無川研究所

FreeBSDでフレッツADSLで接続する

最終更新: 2001/05/15

必要なもの

カーネルの再構築

ppp(8)を使用してPPPoEで接続するためには、NETGRAPHモジュールとtunデバイスを有効にする必要があります。
また、必要に応じて、IPFIREWALL、IPFIREWALL_VERBOSE、IPDIVERTも組み込んでおきます。

GENERICカーネルではNETGRAPHモジュールが有効になっていないので、カーネルオプションにNETGRAPHを追加して、再構築します(NETGRAPH_PPPOEなどを設定するとある文献もありますが、NETGRAPHだけで動くようです)。

具体的には、rootになって/sys/i386/conf(FreeBSD(98)では/sys/pc98/conf)ディレクトリに移動し、コンフィグレーションファイルGENERIC (または現在使用しているコンフィグレーションファイル)を別の名前にコピーして、

ident           GENERIC
という行のGENERICを、自分のコンフィグレーションファイル名に書き換え、options行が並んでいるところに、
options         NETGRAPH
という行を追加します。
ppp(8)を使用してPPPoEで接続するためには、tunデバイスも必要です。
GENERICカーネルではtunデバイスが有効になっています。tunデバイスを無効にしたコンフィグレーションファイルを元に変更する場合には、
pseudo-device   tun     1
という行を戻しておきます。
ipfw(8)を使用してパケットフィルタを使用し、ログを出力するには、
options		IPFIREWALL
options		IPFIREWALL_VERBOSE
という行も追加しておきます。フィルタだけでログが必要ないなら、追加しなくても動かすことはできます。
さらにnatd(8)でNATを行なうのであれば、
options 	IPDIVERT
という行も追加しておきます。ppp(8)にもNAT機能があるため、目的がプライベートアドレスのLANからアクセスしたいというだけであれば、natd(8)は必要ありません。

コンフィグレーションファイルの編集が終わったら、

config MYKERNEL (MYKERNELは自分のコンフィグレーションファイル名)
cd ../../compile/MYKERNEL
make depend ; make
を実行して、カーネルを再構築します。無事に再構築が終了したら、
make install
を実行して新しいカーネルをインストールし、shutdown -r nowを実行して再起動します。

もし再起動に失敗した場合は、起動中に

Hit [Enter] to boot immediately, or any other key for command prompt.
と出ているところで、Enter以外のキーを押し、
unload
load kernel.GENERIC (FreeBSD(98)の場合はkernel.GENERIC98)
boot
と入力すると、以前のカーネルで起動できます。

ppp.confの設定

ppp(8)を使用してPPPoEで接続するためには、設定ファイル/etc/ppp/ppp.confを編集する必要があります。
/etc/ppp/ppp.confは、

default:
 set device PPPoE:ed0
 set MRU 1454
 set MTU 1454
 set log Phase Chat IPCP CCP tun command
 add default HISADDR
 accept CHAP
 enable dns
provider:
 set authname username@example.ne.jp
 set authkey HONEST
のように書きます。default: , provider:の行は必ず行頭から始まり:で終わること、それ以外の行は少なくとも1つの空白またはタブで始まることが必要です。
ed0の部分には、PPPoEに使用するEthernetインターフェースを書きます。
MRU/MTUは文献によっては1490などとしてありますが、 NTT東日本 -FLET'S公式サイト -フレッツ・ADSL -技術参考資料 - PDF によると、1454にすべきとされています。この値を1454より大きくすると、パケットの分断が起き、性能が低下するおそれがあります。
authnameは、プロバイダの指定に従い、@以降も含めて完全に記述する必要があります。
プロバイダがDNSアドレスを自動で渡す設定になっている場合は、enable dnsという行を書いておけば、自動的にDNSアドレスを受けとって設定するようになります。
逆に自サイトでDNSを立ち上げている場合には、enable dnsの行は記述しないようにします。

手動接続テスト

rootで
ppp -ddial provider
を実行すると、PPPoE接続を行ないます。接続できたら、
netstat -rn
を実行すると、PPPoEによって割り当てられたアドレスとルーティングテーブルが確認できます。

起動時に接続

FreeBSDの起動時にEthernetインターフェースを設定してPPPoE接続するようにするには、/etc/rc.confに、

ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="provider"
のように行を追加します。/etc/rc.confのデフォルトではppp(8)によるアドレス変換が有効となるので、プロバイダが固定で複数のIPアドレスを割り当てる場合で、LAN側にもグローバルアドレスを割り当てている場合は、
ppp_nat="NO"
として、ppp(8)によるアドレス変換を禁止します。

カーネルオプションでIPFIREWALLを指定した場合には、/etc/rc.conffirewall_enable="NO"と設定すると、パケットがまったく許可されなくなるため、ファイアウォールの設定が必要です。/etc/rc.confに、

firewall_enable="YES"
firewall_type="/etc/firewall"
という行を追加し、/etc/firewallにファイアウォールのルールを記述します。
/etc/firewallの一例を挙げると、
add 10000 deny all from 202.224.192.16/29 to any in via tun0
add 11000 allow tcp from any to any ssh,http in via tun0
add 12000 allow tcp from 202.239.113.26 to 202.224.192.17 domain in via tun0
add 13000 allow tcp from any 20 to any 1024-65535 in via tun0
add 14000 allow udp from any domain,ntp to any in via tun0
add 15000 allow udp from any to any domain in via tun0
add 20000 deny log tcp from any to any in via tun0 setup
add 65000 allow ip from any to any
のようになります。
ここで202.224.192.16/29は自サイトのネットワーク、202.224.192.17は自サイトのDNS、202.239.113.26は外部にあるセカンダリDNSです。
カーネルオプションでIPFIREWALL_DEFAULT_TO_ACCEPTを指定した場合を除き、常にルール
65535 deny ip from any to any
が存在するため、通したいパケットは明示的に許可する必要があります。
各ルールの意味は、
10000 外部から自サイトのアドレスを始点に持つパケットを拒否する(アドレス偽造攻撃対策)。
11000 外部からTCPでのssh, httpポートへの接続を許可する。
12000 セカンダリDNSによるゾーン転送要求を許可する(ネームサーバ側でも転送を許可する設定が必要です)。
13000 ftp-dataからの接続を許可する。
14000 内部からのDNS問い合わせの応答とNTPによる時刻合わせの応答を許可する。
15000 外部からのDNS問い合わせを許可する。
20000 すでに許可された以外の外部からのTCP接続を拒否する。
65000 すでに拒否された以外のすべてのパケットを許可する。
となっています。

Path MTU Discovery問題

FreeBSD 4.2以前のppp(8)でPPPoE接続したホストをゲートウェイにして、LANと外部を接続した場合に、LAN内部のマシンから外部へのTCP接続が途中で途絶え、外部のWWWページの一部が見えないなどの現象が知られています。
PPPoE接続しているホストのppp(8)を新しいものに入れ換えるのが根本的な解決方法ですが、LAN内部のマシンのMTUを手動で下げる応急手段もあります。

参考文献

FreeBSDハンドブック - PPP オーバイーサネット (PPPoE) の利用
フレッツADSLの固定IPアドレスで動かす
わが家のブロードバンド化計画(2)──速度が出ないのはなぜ?
Path MTU Discovery Black Hole 問題と対処