EdgeRouterでIPv6 PPPoEが正しく接続できない問題を解決する
TL;DR
- EdgeRouterのpppd(というかそもそもの本家のが)はIPCP受信時にしか
/etc/ppp/ip-pre-up
が走らず、IPv6CPしか送ってこない場合はインターフェイス名がリネームされない - よってインターフェイス名のリネームが走らずDHCPv6PD等の処理が走らない
- 強引にインターフェイス名をリネームして
/etc/ppp/ip-pre-up
を走らせるとpppdがバグってsyslogが汚染される(EdgeRouterでIPv6 PPPoEの設定) - ので、pppdにパッチを当ててクロスコンパイルしたもので
/sbin/pppd
を置き換えて解決させる
とりあえず直す
公式のファームウェアのtar.gzから引っこ抜いてくれば一瞬で戻せますが、万が一の事を考えて/sbin/pppd
のバックアップを適当な場所に作っておくことをおすすめします。
上のリンク先に導入手順を英語で書きましたが、やることは書いてあるコマンドを打ち込むだけなので難しくないと思います。
また、今まで通りのipv4のみのPPPoEもちゃんと動きますが、/var/run/pppoe-client-sessions/
以下にPIDファイルを作らないのでshow pppoe-client
が使えないことだけは注意してください。
ファームウェアアップデートの際には書き換えたものは全て消えてしまうので、ファームウェア更新の際には気をつけてください。
パッチの内容の解説(分かる人向け)
IPv6 only PPPoE = FAIL - Ubiquiti Networks Community
上のリンクにて問題が起こる理由とその対処方法が書かれていますが、pppdに当てているパッチが不十分でちゃんと動いていないようです。
まず、lcp-echo-adaptive
オプションはDebian独自のパッチなのでDebianのpppdのソースとパッチを取ってくる必要があります。
ちなみにipv6cpでのpre-upの実装は以下のパッチを参考にしました。
ただ、このパッチはdebianのpppdにそのまま適用できなかったのでソースを少し読んでちゃんと合うようにしました。(具体的に言うとスクリプトの実行完了を待たないとインターフェイスがリネームされたかどうかの確認処理の意味がなくなってしまうのでそこだけ直しました)
クロスコンパイルについて
EdgeRouter ER-Xは一般的なx86やx86_64アーキテクチャではなくMIPS(リトルエンディアンモード。mipsel
とも言う)で動いているので、クロスコンパイルしなければなりません。
また、EdgeRouter ER-Xの内蔵フラッシュメモリは200MBちょっとしか無い上に空き容量がおおよそ70MBほどしか無い為、gccなどのツールのEdgeRouterへの導入は絶望的です。
今回は、DebianのMIPS移植版をローカルのマシン上でQEMUを使って動かしました。と言ってもカーネルから全てエミュレートすると激遅になるので、ユーザランドだけエミュレートしています。
今回はこれを使いました。準備としてbinfmt
とqemu-mipsel-static
とdebootstrap
が必要になるので、入れておきましょう。
mkdir debian_stretch
./mkdebianrfs.sh mipsel stretch ./debian_stretch
で、勝手にrootfsが出来上がるのであとはaptからgccとmakeを入れてあげればビルド環境の出来上がりです。(スクリプトがやってることは中身を見てみれば分かりますが、単純にchrootしてるだけです)