FreeBSD で PPPoE ルータ (mpd 編) †FreeBSD を,Flet's ADSL 等のブロードバンド回線のルータとして使う.
mpd とは †FreeBSD には,昔から userppp という,ppp プログラムがあります.これは,扱いが簡単な反面,kernel レベルでの動作では無く,ユーザランドで動作する物なのでパケットが kernel と ppp 間で行き来する際にメモリコピーが発生します.その為にパフォーマンスが上がらないと言った問題が発生していました. 前提条件 †今回,mpd を利用するにあたって,以下の様な環境を元としています.
mpd を動かす準備 - kernel compile †mpd は netgraph を利用して動作する為,kernel の再構築または kernel module の読み込みを行う必要があります.kernel module の仕組みによって kernel 再構築は必要なくなりましたが,mpd を動作させる際に自動的に読み込まれるモジュールでは足らない為,手動で追加モジュールの読み込みが必要となります. ls -l /usr/local/etc/rc.dkldload.sh -rwxr-xr-x 1 root wheel 236 Mar 8 00:19 /usr/local/etc/rc.d/kldload.sh cat /usr/local/etc/rc.d/kldload.sh #!/bin/sh kldload /boot/kernel/netgraph.ko kldload /boot/kernel/ng_socket.ko kldload /boot/kernel/ng_iface.ko kldload /boot/kernel/ng_ppp.ko kldload /boot/kernel/ng_bpf.ko kldload /boot/kernel/ng_vjc.ko kldload /boot/kernel/ng_pppoe.ko kldload /boot/kernel/ng_ether.ko 上記のスクリプトで mpd を動作させる際に必要なモジュールの全てを読み込む事が可能ですが,それならばいっその事,kernel compile して,静的に kernel に組み込んでしまう方が良いでしょう. options NETGRAPH # netgraph(4) system options NETGRAPH_BPF options NETGRAPH_ETHER options NETGRAPH_IFACE options NETGRAPH_PPP options NETGRAPH_PPPOE options NETGRAPH_SOCKET options NETGRAPH_VJC 上記オプションで,mpd が動作するに必要な物を kernel に組み込む事になります.パケットフィルタリングや NAT(NAPT) を動作させる場合,追加で ipfilter や ipfw,pf のオプションを組み込みます. options IPFILTER #ipfilter support options IPFILTER_LOG #ipfilter logging options IPFILTER_DEFAULT_BLOCK #block all packets by default options IPSTEALTH #support for stealth forwarding ipfw や pf でも良いのですが,pf は使った事が無い点や ipfw + natd の場合,natd がユーザランドで動作するプログラムな為,NAT 処理でパフォーマンスを引っ張られる事になってしまいます.その場合,ipfw + ipfilter + ipnat といった組み合わせを取る事で NAT 処理も kernel で行う事が可能になるのでパフォーマンスが良いと思います. mpd を入れる †mpd は,標準ではインストールされていませんので,packages/ports でインストールする事になります.特にオプションも必要ない為,packages の利用で十分なのですが,ここでは ports にての導入を行います. cd /usr/ports/net/mpd make install これで,mpd のインストールが完了します.次に,設定に移ります.設定ファイル郡は,/usr/local/etc/mpd 以下に置かれていますので,確認しましょう.各ファイルには役割がありますので,以下で簡単に役割を説明します.
mpd.conf †mpd.conf は,mpd を利用する際の基本的なファイルになります.ここでは,B-Flet's を利用する場合を想定して記述してありますが,その他の Flet's 等 PPPoE を使う方法の場合でもほぼ同様の設定で接続が可能です. default:
load provider
load flets
provider:
new -i ng0 provider PPPoE0
set iface route default
set iface up-script /usr/local/etc/mpd/script-provider.sh
set iface down-script /usr/local/etc/mpd/script-provider.sh
set bundle authname [userName]
set ipcp set ipcp ranges 0.0.0.0/0 0.0.0.0/0
load common_setting
flets:
new -i ng1 flets PPPoE1
set iface up-script /usr/local/etc/mpd/script-flets.sh
set iface down-script /usr/local/etc/mpd/script-flets.sh
set iface route 220.210.194.0/25
set iface route 220.210.195.0/26
set iface route 220.210.195.64/26
set iface route 220.210.198.128/26
set iface route 220.210.199.0/27
set iface route 220.210.199.128/28
set iface route 220.210.199.160/28
set iface route 220.210.199.192/29
set iface route 220.210.199.176/28
set bundle authname guest@flets
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
load common_setting
common_setting:
set iface addrs 1.1.1.1 2.2.2.2
set iface disable on-demand
set iface idle 0
set iface mtu 1454
set bundle disable multilink
set link no acfcomp protocomp
set link disable pap chap
set link accept chap
set link mtu 1454
set link mru 1454
set ipcp yes vjcomp
open iface
上記設定ファイルを見てみると,大きく分けて4つのセクションがある事が分かるかと思います.default,provider,flets,common_setting です.この設定の場合のセクションは次の通りです.
new -i ng0 provider PPPoE0 ここで,ng0 というデバイスを作成し,次にセクションと同一の名前をつけ,最後に PPPoE0 と mpd.links のラベルを付けています. set iface route default デフォルトルートを,このプロバイダから出て行く様に設定します. set iface up-script /usr/local/etc/mpd/script-provider.sh set iface down-script /usr/local/etc/mpd/script-provider.sh この2行は,mpd が 接続した時 及び 切断した時 に実行するスクリプトのパスを記述しています.実際には後で詳しく書きますが,ipnat の再設定をこの中で行っています. set bundle authname [userName] 接続する際に使用するユーザ名をここに書きます. set ipcp set ipcp ranges 0.0.0.0/0 0.0.0.0/0 ipcp で IP アドレスが通知される際に自身が許可するアドレスレンジをここに記述します.複数の固定IPアドレスが利用可能なプロバイダで,それが利用可能な方はここに静的に記述した方が良いでしょう.1IP が利用可能な方は特に書かなくても ipcp で通知されるので上記のままでも良いと思います. load common_setting ここで,その他の設定を読み込みます.今回,プロバイダと Flet's スクウェアの2セッションを張る為の共通部分が出たためにこの様に設定を分けてありますが,この手法を取らずに個々の設定を各セクションで書いても問題はありません. set iface addrs 1.1.1.1 2.2.2.2 インタフェースレイヤでのアドレスを割り当てる項目な様ですが,無くても良いようです.実は,この項については詳しくはわかりません.ごめんなさい… set iface disable on-demand オンデマンド接続を無効にしています.ダイアルアップルータの場合は,enable として,外との接続が必要な際にオンデマンド接続が可能になります. set iface idle 0 アイドルタイムアウトを 0 としています.0 とするとアイドル時の切断を行わない様になります.これもダイアルアップルータの場合はある程度の値を入れる事を推奨します. set iface mtu 1454 MTU(Maximum Transmission Unit) の値を 1454 にしています.Flet's の場合,PPPoE の MTU 値は 1492 のようで,その値から PPP ヘッダを抜いた値が 1454 です. set bundle disable multilink 接続の際のマルチリンクを無効にしています.これは,ISDN でおなじみの 64 + 64 = 128 の機能を使うか,使わないかです.Flet's 等では利用が出来ない為,無効とします. set link no acfcomp protocomp acfcomp 及び protocomp を無効にしています.acfcomp は Address と ControlField の圧縮,protocomp は Protocol の圧縮を意味しています.Flet's では,そもそも仕様上利用不可なので,無効にしましょう.その他のラインを使っている方は調べて下さい. set link disable pap chap pap 及び chap での接続を受付ません.次の行とは扱いが違い,自身が受け付けるか,受け付けないかを enable/disable で指定します. set link accept chap サーバとの認証の際に chap を利用します.accept/deny を使って,pap,chap を指定します. set link mtu 1454 set link mru 1454 リンクレイヤで,MTU 及び MRU を 1454 にします.こちらも,Flet's の仕様上この様な設定になります. set ipcp yes vjcomp ipcp の Van Jacobson TCP ヘッダ圧縮を有効にします.殆どの場合,この圧縮は有効に機能しますので,このままでも問題無いと思われます. open iface インタフェースをオープンします.この段階で,ようやくセッションが開始されます. mpd.secret †mpd.secret は,ユーザ名に紐づくパスワードを mpd.conf から分離させた物になります.パスワードを mpd.conf に書かずに,mpd.secret に書き,mpd.secret のパーミッションを 600 等にし,厳重に管理する事で,よりセキュアになります. set bundle password [Password]
UserName Password guest guest Provider2 Password2 最初の列がユーザ名,次の列がパスワードとなります.ユーザ名で,mpd.conf と紐付けを行いますので,mpd.conf にあるユーザ名と同一かを確認して下さい. mpd.links †mpd.links ファイルは,どのインタフェースを利用して ppp セッションを張るか.を定義するファイルになります.このファイルで,ppp なのか,pppoe なのか,pptp なのかを決定します. PPPoE0:
set link type pppoe
set pppoe iface fxp0
set pppoe service "whatever"
set pppoe disable incoming
set pppoe enable originate
PPPoE1:
set link type pppoe
set pppoe iface fxp0
set pppoe service "whatever"
set pppoe disable incoming
set pppoe enable originate
このファイルの場合,セクションは PPPoE0 と PPPoE1 の 2つある事が分かります. set link type pppoe
set pppoe iface fxp0 PPPoE セッションを張る際に利用するインタフェースを決定しています.この場合は,fxp0 という Intel チップセットのインタフェースを指定しています.ADSL モデムや光の終端装置に繋がっているインタフェースを指定して下さい. set pppoe service "whatever"
mpd.script †mpd.script は,mpd での接続時や,切断時に実行させる事が出来るスクリプトファイルです.上記の mpd.conf に次の記述がありますが,これが mpd.script になります.ファイル名はプロバイダ名に合わせて変更してあります. set iface up-script /usr/local/etc/mpd/script-provider.sh set iface down-script /usr/local/etc/mpd/script-provider.sh up-script が接続時に実行されるもので,down-script が切断時に実行されるものです.自分の場合,同一のスクリプトファイルを用意しており,引数を元に動作を変えるようにしてあります. [scriptname] <interface> inet <local address> <remote address> <authname>
[scriptname] <interface> inet <authname>
#!/bin/sh
case $# in
# Connect
5)
/etc/rc.d/ipnat restart
;;
# Disconnect
3)
/etc/rc.d/ipnat restart
;;
*)
;;
esac
この場合,接続時及び切断時に ipnat を再起動しています.こうしている理由は,プロバイダとフレッツスクウェアの2つに接続していますので,ipnat を停止させる訳にも行かず,面倒だったので再起動とさせているだけです. 起動のテスト †実際にここまで完了したら,mpd を起動してみましょう. 手で起動する †ナニハトモワレ,最初は出て起動させて動作を確認しましょう.mpd を手で起動させるには次のようにタイプします. /usr/local/sbin/mpd すると,画面に大量の文字列があわられますがあわてないで下さい.これはふぉわグラウンドで動作し,ログを標準出力に書き出す仕様なので正常動作なのです. > ifconfig -a
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1454
inet 219.117.xxx.yyy --> 219.117.xxx.yyy netmask 0xffffffff
この状態が確認出来たら,mpd は PPPoE セッションをうまく張れている状態となります.外部のホストへアクセスしてみる等,動作を確認してみて下さい. スクリプトで起動する †mpd を ports/packages でインストールした場合,/usr/local/etc/rc.d 以下に,mpd.sh というスクリプトもインストールされます. mpd_enable="YES" これによって,mpd.sh を実行した際に,スタートの処理が進みます. mpd_flags="" mpd.sh を見てもらうと分かるのですが,デフォルト状態で mpd_flags には -b のオプションが渡されています.これは mpd が動作する際に,起動した後にバックグラウンドで動作させる為のオプションとなります. /usr/local/etc/rc.d/mpd.sh start この様に実行する事で mpd が起動し,PPPoE での接続が行われます.
> ifconfig -a
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1454
inet 219.117.xxx.yyy --> 219.117.xxx.yyy netmask 0xffffffff
接続確認作業 †実際に mpd での接続が行われ,ng デバイスに IP アドレスが割り振られていれば,その FreeBSD ボックスからの Internet への接続は出来る状態です.が,デフォルトルート等が設定されているかの確認も重要ですので,これらもちゃんと確認しておきましょう. set iface route default この行がある事で,デフォルトルートが設定されるはずですので確認してみましょう. > netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 219.117.xxx.zzz UGS 0 755833 ng0 この様にデフォルトルートが設定されている事を確認出来たら大丈夫です. NAT ボックスとしての設定 †これまでの段階で,FreeBSD ボックスでの接続が行われていると仮定し,ここでは NAT ボックスとして仕上げて行く事とします. daemontools で起動する †qmail の作者である D. J. Bernstein 氏が作成している daemontools というソフトウェアがあります.このソフトウェアを使用する事で,起動及び停止,再起動が容易になります.また,PPPoE が切断した後の復旧が自動化出来るようになり,ルータとして使っている場合はとても便利に利用できます. 起動スクリプトの用意 †とりあえず,起動スクリプトを作成しなければ始まりません.ここでは /var/daemontools/mpd 以下に作成します.
最初の run はプログラムの起動の為のスクリプトになります.ここでは単純に mpd をフォアグラウンドで起動しています.これは,daemontools はフォアグラウンドプロセスのみ扱えるからです.パーミッションは 755 にしておきます daemontools に管理させる †上記のスクリプトを,daemontools に管理させるには,daemontools が管理しているディレクトリへリンクを張ることで可能になります. ln -s /var/PPPoE/mpd mpd 以上で,daemontools への組み込みは完了です.5秒ほどするとプロセスが開始されるはずです.以下のように,ps の出力を確認し,mpd が表示されていれば完了です. ps -ax | grep mpd 870 ?? I 0:00.11 supervise mpd 878 ?? S 2:23.73 /usr/local/sbin/mpd 880 ?? I 0:00.01 multilog t s5242880 n10 /var/log/mpd supervise mpd が,daemontools が管理している事を示すプロセスで,その下に /usr/local/sbin/mpd が表示されています.この2行が1セットになって表示されていると正常に動作していると考えられます.PPPoE 用のインタフェースが出来ているか,IP アドレスが取得できているか,外につながるか,等の確認をして下さい. Hiroyuki Seino http://www.seichan.org/ http://www.seichan.org/blog/ |