FreeBSD で PPPoE 接続を設定する

PPPoE(PPP over Ethernet, RFC 2516)は,イーサネットのフレーム上で PPP セッションを確立する方式である.日本国内では,光回線(FTTH)の接続方式として広く使われている.かつて ADSL でも用いられたが,Yahoo! BB ADSL は 2024年3月31日,NTT東日本のフレッツ・ADSL は 2025年1月31日,NTT西日本のフレッツ・ADSL は 2026年1月31日に提供を終了している.また,KDDI の「DION」は「au one net」に名称変更されている.

FreeBSD では,ユーザランドの ppp(8) と,カーネル内の netgraph の PPPoE ノード(ng_pppoe)を用いて PPPoE 接続を行う.接続に必要な情報は,接続業者から通知される認証 ID(ユーザ名)とパスワード,および回線側が接続されているイーサネットインタフェース名である.

カーネルの設定

現在の FreeBSD では,PPPoE のためのカーネル再構築は不要である.GENERIC カーネルのままでよい.必要な netgraph の機能がカーネルに組み込まれていない場合,ppp(8) が ng_etherng_pppoeng_socket の各カーネルモジュールを動的にロードする.

カスタムカーネルを構築し,これらを静的に組み込む場合には,カーネルコンフィギュレーションファイルに次の行を書く.

options NETGRAPH
options NETGRAPH_ETHER
options NETGRAPH_PPPOE
options NETGRAPH_SOCKET

イーサネットインタフェース名の確認

PPPoE を行うインタフェース名を確認するために,コマンドプロンプトで次のコマンドを実行する.

ifconfig

表示された一覧のうち,回線終端装置(ONU)やモデムに接続しているインタフェース名(例:em0re0igb0)を控えておく.そのインタフェースには IP アドレスを設定しない.PPPoE で使うだけであるので,リンクが有効になっていればよい.

/etc/ppp/ppp.conf の設定

管理者権限で /etc/ppp/ppp.conf を編集し,次のように設定する.set device PPPoE:em0em0 は,使用するイーサネットインタフェース名に置き換える.<認証ID><パスワード> は,接続業者から通知された値に置き換える.行頭が : で終わるラベル行は 1 桁目から書き,その他の行は字下げする.

default:
 set log Phase tun command
 ident user-ppp VERSION

pppoe:
 set device PPPoE:em0
 set MRU 1454
 set MTU 1454
 set authname <認証ID>
 set authkey <パスワード>
 set dial
 set login
 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 0.0.0.0
 add default HISADDR

set ifaddr10.0.0.1/010.0.0.2/0 は仮の値で,実際のアドレスは接続時に IPCP で折衝される.add default HISADDR は,折衝で得られた相手側アドレスをデフォルトルートに設定する指定であり,set ifaddr より後に書く.

MTU は,PPPoE のヘッダ(8 バイト)の分だけイーサネットの 1500 バイトより小さくなり,上限は 1492 である.NTT のフレッツ回線では 1454 が指定されている.接続業者の案内する値に合わせる.

ppp.conf にはパスワードが平文で書かれるため,コマンドプロンプトで次のコマンドを実行し,管理者以外が読めないようにする.

chown root:wheel /etc/ppp/ppp.conf
chmod 600 /etc/ppp/ppp.conf

接続の確認

設定を確認するために,コマンドプロンプトで次のコマンドを管理者権限で実行する.pppoe は,ppp.conf に書いたラベル名である.

ppp -ddial pppoe

接続できたかどうかを確認するために,コマンドプロンプトで次のコマンドを実行する.tun0 にグローバル IP アドレスが割り当てられていれば接続できている.

ifconfig tun0

/etc/rc.conf の設定

システム起動時に自動的に接続するために,/etc/rc.conf に次の行を追加する.ppp_profile には,ppp.conf に書いたラベル名を指定する.

ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="pppoe"

この FreeBSD マシンをルータとして使い,LAN 側の機器にアドレス変換を行わせる場合には,次の行も追加する.

ppp_nat="YES"

設定を反映して ppp を起動するために,コマンドプロンプトで次のコマンドを管理者権限で実行する.

service ppp start

通信できないときの確認

ppp の動作は /var/log/ppp.log に記録される.ログが出力されない場合には,/etc/syslog.conf に次の行があることを確認し,syslogd を再起動する.

!ppp
*.*     /var/log/ppp.log

ログのうち,NGM_PPPOE_SUCCESS(PPPoE セッションの確立),LCPState change ... --> Opened(リンクの確立),Pap Input: SUCCESS(認証の成功),IPCPLayerUpmyaddr(IP アドレスの割り当て)の 4 か所を順に確認することで,どの段階で失敗しているかを切り分けることができる.

正常に接続できているときのログの例(一部分)

tun0: Phase: Received NGM_PPPOE_SUCCESS (hook "tun0")
tun0: Phase: deflink: carrier -> login
tun0: Phase: deflink: login -> lcp
tun0: LCP:  MRU[4] 1454
tun0: LCP:  AUTHPROTO[4] 0xc023 (PAP)
tun0: LCP: deflink: State change Ack-Sent --> Opened
tun0: Phase: bundle: Authenticate
tun0: Phase: deflink: his = PAP, mine = none
tun0: Phase: Pap Input: SUCCESS ()
tun0: Phase: bundle: Network
tun0: IPCP:  IPADDR[6]  changing address: 0.0.0.0  --> XXX.XXX.XXX.XXX
tun0: IPCP: deflink: State change Ack-Sent --> Opened
tun0: IPCP: deflink: LayerUp.
tun0: IPCP: myaddr XXX.XXX.XXX.XXX hisaddr = XXX.XXX.XX.XX
tun0: LCP: deflink: RecvEchoRequest(16) state = Opened
tun0: LCP: deflink: SendEchoReply(16) state = Opened

NGM_PPPOE_SUCCESS が現れない場合には,インタフェース名の指定,配線,回線終端装置の状態を確認する.Pap Input: SUCCESS に至らない場合には,認証 ID とパスワードを確認する.IP アドレスは割り当てられているのに Web ページが閲覧できない場合には,/etc/resolv.conf の DNS サーバの設定を確認する.接続業者から DNS サーバのアドレスを受け取る場合には,ppp.confdefault: の項目に enable dns を追加する.