FreeBSD 9.3 サーバーをリモートから 10.3 へアップグレードする作業を行いました。
背景は、BIND9.10 を更新するため。FreeBSD 9.3 上で最新 bind910 を make install しようとすると、エラーで更新できませんでしたので、OS 自体を更新することにしました。FreeBSD10.3 では bind910 を更新できることは確認済み。
freebsd-update コマンドで手順通り進めて、最後に cron でバッチを実行したところ、いつまで待ってもネットワークが復活しない!が〜〜〜ん。
やむを得ないので翌日設置場所に出かけてみましたが、予想外の状況が発生していました。
- OS は問題なく更新されていた。
- 設置場所は集合住宅で、canvas.ne.jp の集合住宅向けLANが来ており、利用者はDHCPでダイナミックなプライベートアドレスと、2枚目のNICを入れオプションのPPPoE グローバルIPサービスので固定アドレスを得ることが出来ます。結果的に、このFreeBSDサーバーはプライベートアドレスと固定グローバルアドレスを持つことになり、デフォルトルーターは、PPPoEで固定IP側のゲートウェイが自動的に指定されるはずなのですが、なぜかプライベートアドレス側のルーターがデフォルトルーターとなっており、グローバルインターネットからアクセス不能になっていました。
- 数ヶ月ぶりにサーバーを再起動したため、FreeBSD10.3 へ更新したために問題が発生しているのか、canvas の仕様が変更になったのかが不明。
- プライベート側のLANを停止すると、自動的にグローバル側のルーターがデフォルトルーターになるが、PPPoEサーバーがネームサーバとしてプライベートアドレス側ネームサーバのアドレスを resolve.conf に書き込むため、プライベートアドレス側のLANを切断すると、逆引きが出来なくなってしまう。
- 手動で default router を削除し、PPPoE側のルータをデフォルトルーターとして登録すれば、今まで通り正常に動作する。
- しかし、自動起動させると、またプライベート側ゲートウェイがデフォルトルーターとなってしまうので通信不能になってしまう。
とりあえず、/etc/rc.local の中に、
# sleep 10 route delete default /etc/rc.d/ppp stop sleep 10 /etc/rc.d/ppp start
と書いておくことで、リブート時に強制的にプライベート側のルーターを削除し、PPPoE側のゲートウェイを使うようにしておきました。
/var/log/ppp.log を見てみると、抜粋ですが次のようなラインがたくさん残っていました。
Jan 20 17:10:31 higashi ppp[568]: tun0: Warning: Add! route failed: 0.0.0.0: errno: Value too large to be stored in data type Jan 20 17:10:31 higashi ppp[568]: tun0: Phase: deflink: IPV6CP protocol reject closes IPV6CP ! Jan 20 17:11:33 higashi ppp[568]: tun0: Phase: Signal 15, terminate. Jan 20 17:10:31 higashi ppp[568]: tun0: Warning: Add! route failed: 0.0.0.0: errno: Value too large to be stored in data type Jan 20 17:10:31 higashi ppp[568]: tun0: Phase: deflink: IPV6CP protocol reject closes IPV6CP ! Jan 20 17:11:33 higashi ppp[568]: tun0: Phase: bundle: Dead Jan 20 17:11:33 higashi ppp[568]: tun0: Phase: PPP Terminated (normal). Jan 20 17:11:47 higashi ppp[1216]: Phase: Using interface: tun0 Jan 20 17:11:47 higashi ppp[1216]: Phase: deflink: Created in closed state Jan 20 17:11:47 higashi ppp[1216]: Warning: Add! route failed: ff02::: errno: Value too large to be stored in data type
どうも、IPv6 のアドレスを掴もうとして失敗しているように見えます。Canvas が仕様を替えた?それとも、FreeBSD10.x で ppp の仕様が変わった?
とりあえず、/etc/rc.local に上のコマンドを書き込むことで引き上げてきましたが、自宅に帰って引き続き調査を行っているところです。
そうしたところ、ppp の man の中に次の記述を見つけました。
ひょっとして原因はこれ?
ipv6cp Default: Enabled. This option allows ppp to attempt to negotiate IPv6 control protocol capabilities and if successful to exchange IPv6 datagrams with the peer.
すでに設置場所を離れていて、さすがにこのコマンドをリモートから試す気にはなりませんので、次回設置場所に出かけた時に、/etc/ppp/ppp.conf に
disable ipv6cp
(でいいのかな?)と書き込んで試してみようと思っているところです。
ipv6cp に関しては、FreeBSD 10.3, 9.3 のオンラインマニュアルとも同じ記述でした。