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_ether,ng_pppoe,ng_socket の各カーネルモジュールを動的にロードする.
カスタムカーネルを構築し,これらを静的に組み込む場合には,カーネルコンフィギュレーションファイルに次の行を書く.
options NETGRAPH options NETGRAPH_ETHER options NETGRAPH_PPPOE options NETGRAPH_SOCKET
イーサネットインタフェース名の確認
PPPoE を行うインタフェース名を確認するために,コマンドプロンプトで次のコマンドを実行する.
ifconfig
表示された一覧のうち,回線終端装置(ONU)やモデムに接続しているインタフェース名(例:em0,re0,igb0)を控えておく.そのインタフェースには IP アドレスを設定しない.PPPoE で使うだけであるので,リンクが有効になっていればよい.
/etc/ppp/ppp.conf の設定
管理者権限で /etc/ppp/ppp.conf を編集し,次のように設定する.set device PPPoE:em0 の em0 は,使用するイーサネットインタフェース名に置き換える.<認証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 ifaddr の 10.0.0.1/0,10.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 セッションの確立),LCP の State change ... --> Opened(リンクの確立),Pap Input: SUCCESS(認証の成功),IPCP の LayerUp と myaddr(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.conf の default: の項目に enable dns を追加する.