もやし日誌

日記のようなもの

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のバックアップを適当な場所に作っておくことをおすすめします。

github.com

上のリンク先に導入手順を英語で書きましたが、やることは書いてあるコマンドを打ち込むだけなので難しくないと思います。

また、今まで通りの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の実装は以下のパッチを参考にしました。

github.com

ただ、このパッチはdebianのpppdにそのまま適用できなかったのでソースを少し読んでちゃんと合うようにしました。(具体的に言うとスクリプトの実行完了を待たないとインターフェイスがリネームされたかどうかの確認処理の意味がなくなってしまうのでそこだけ直しました)

github.com

ロスコンパイルについて

EdgeRouter ER-Xは一般的なx86x86_64アーキテクチャではなくMIPS(リトルエンディアンモード。mipselとも言う)で動いているので、クロスコンパイルしなければなりません。

また、EdgeRouter ER-Xの内蔵フラッシュメモリは200MBちょっとしか無い上に空き容量がおおよそ70MBほどしか無い為、gccなどのツールのEdgeRouterへの導入は絶望的です。

今回は、DebianMIPS移植版をローカルのマシン上でQEMUを使って動かしました。と言ってもカーネルから全てエミュレートすると激遅になるので、ユーザランドだけエミュレートしています。

github.com

今回はこれを使いました。準備としてbinfmtqemu-mipsel-staticdebootstrapが必要になるので、入れておきましょう。

mkdir debian_stretch
./mkdebianrfs.sh mipsel stretch ./debian_stretch

で、勝手にrootfsが出来上がるのであとはaptからgccとmakeを入れてあげればビルド環境の出来上がりです。(スクリプトがやってることは中身を見てみれば分かりますが、単純にchrootしてるだけです)