昨晩、パソコン画面を見ていたら、複数開いているターミナルエミュレータが、突然、一枚一枚、勝手に消え始めました。
「やば!何か起きてる?」と、消えた端末のホストIPアドレスにping してみると、応答が無い。しかも、応答が無いホストが複数あるような感じなので、慌ててホストがあるところを見てみると、電源のパワーインジケーターが消えていました。
落ちていたのは、自作ルーターとして使っている、スティックPC、Intel Compute Stick STCK1A32W にインストールした pfSense。(電源にはUSB充電器を使用。)
電源を蹴っ飛ばしたかな?そんなはずはないんだけど。と、足元を見てみると、4ポートUSB電源の様子が何かおかしい。電源LEDが点滅しています。
あ~、4ポートUSB電源が壊れてしまったか~。買い替えないと。。。。と予備の2A USB電源にSTCK1A32W を接続しようと、USB電源からケーブルを抜いて、1ポートUSB電源につなぎ替え、スティックPCの電源ボタンを押してみたものの、LEDが点灯しない。
逆に、STCK1A32W 用電源ケーブルを抜きとった4ポートUSB電源のLEDランプは正常に点灯しました。
「げっ、壊れたのはUSB電源じゃなくて、スティックPCの方?」
これは痛い!
メインルーターの故障は、自宅ネットワーク全体が影響を受けてしまう。特に自動録音しているRadiko ラジオ番組を録音できなくなってしまう。とりあえず、代替品として、友人から、使わなくなった と、もらった Buffalo AirStation WSR-1166DHP2 を引っ張り出してPPPoEとルーティングテーブルをセットアップ。完ぺきではないにせよ、とりあえず外部ネットワークに出てゆけるようになった。
故障したルーターアプライアンスは、ゲートウェイ・ファイヤーウォール機能以外にも HTTP Proxy としても機能していたので、エアステーションでは完全に代替することは出来ず。また、リアルタイムのトラフィックモニターができないため、予備のSTCK1A32W を使って、ルーターアプライアンスを作り直すことにしました。
(ルーターの負荷なんか気にしない人は、家庭用ルーターでいいのでしょうが、ルーターにログインしていろいろやりたい場合は、自作ルーターが便利です。反面、手持ちの Intel STCK1A32W を全部使ってしまい予備が無くなってしまった。)
さて、故障したスティックPCで動いていた FreeBSDベースのpfSense ですが、パフォーマンスは十分なものの、細かいところに手が届かないもどかしさがありました。例えば、pkg コマンドが使えず、便利コマンドをインストールできない。再び pfSense をインストールしてもいいのですが、pfSense から派生した OPNsense というルーターアプライアンスに前から興味があって、OPNsense を使ってみることにしました。(pfSenseからの派生なので FreeBSDベース。)うまく使えなければ、pfSenseを上書きして、元に戻せばいいと考えてね。
ハードウェアの Intel STCK1A32W は、4コアCPU Atom Z3735F、2GB RAM、32GB SSD というスペックの 64bit PC(ですが、64bit 命令で動くのは LinuxなどUnix系OSの場合のみで、)Windowsを使う場合は32bit i386モードでしか動かない。2GBというWindows動作には力不足を感じるものの、個人用途のルーターアプライアンスでは、その半分のスペックでも十分動作可能でルーターで使うには余裕のスペック。
深夜から、ルーターアプライアンス復旧作業を始めましたが、OPNsense イメージダウンロードを開始するまでに手間取り(ルーターが壊れたわけですからね)、ダウンロードが始まったことを確認して、放置して寝ました。(ちなみにダウンロードしたのは、VGA パッケージ。)
翌日は、ダウンロードしたイメージファイルをUSBメモリに複製して、作業を開始。使ったのは、OPNsense 24.1。
まず、予備 STCK1A32W の Windows10 Home を Microsoftアカウントログインに切り替えて、状態確認。Windows10 の状態を確認するためだけではなく、Windows10 HomeライセンスをMicrosoftアカウントにしっかり結びつけるのが目的。必要な時にライセンスを別のボードに引っ越しできるようにします。壊れたSTCK1A32W のライセンスを探したけど、Windowsとしてログインしなかった時間が長かったためか、アカウントとライセンスの結びつきが消えてました。他のPCに移したっけ?と思うものの判明せず。
アカウントページで STCK1A32W のPC名がデバイス表示されたことを確認して、OPNsense のインストール開始。手順は以下のような流れ。
- STCK1A32W のEFIを起動して、WindowsモードからLinuxモードに切り替え。(これでWindowsは起動できなくなる。)
- STCK1A32W にモニターと USB HUBを接続し、USBポートには キーボードとOPNsenseインストーラUSBメモリだけ接続して、ブート。
- OPNsense インストールUSBメモリでは、root:opensense でログインすると、Liveモードで動作し、PC側のストレージを初期化することなく、OPNsense を利用でき、installer:opensense でログインすると、PCのストレージを消去してOPNsense をインストールできるようになっていました。
- 一度Liveモードで遊んだ後、installer でログインしてインストールを開始。FreeBSDインストール風の画面なので操作は慣れたもの。内蔵SSDを全部消して、全体をGPTパーティションで使うことにしました。(ZFSも選択できるけど、他のストレージをつなぐ予定はないのでMBRでもいいくらい。)
- root の他、リモートログイン用アカウントを一つ追加してルーターOSインストールは完了。
- 続いて、テスト起動。OPNsense インストール直後はLANが 192.168.1.1 にセットされる(OS起動直後の login:プロンプト前にIPアドレスが表示されます)ので、コンソールから初回ログインして、IPアドレス取得を一時的にDHCPに変更。
- このあとで、本番環境に戻しました。
- エアステーションを停止。
- 本番環境に戻して、DHCPで取得したIPアドレスをコンソール画面で確認。例えば、192.168.10.10。
- PCのWebブラウザーから、http://192.168.10.10/ をアクセスすると、ログイン画面が表示され、OSインストール中に設定した root アカウントとパスワードでログインできれば、OSインストールは完了。
- 続いて、IPアドレスを故障した元のルーターのものにセット、さらに PPPoE アカウントを設定すると、外部インターネット接続環境が復活。
さらに、ラジコ聴取環境を復活させるために、スタティックルートを設定。
OPNsense は pfSense から派生とはいえ、設定箇所が違うので、PPPoE パラメーターはどこで設定するの?ルーティングテーブルは?と探し回ることになりましたが、一度気付けば簡単。
約24時間かけて復旧作業が終わりました。
pfSense と OPNsense の違い
OPNsense は使い始めたばかりであり、pfSense も一度設定して放置、時々、設定を見直したりログを確認したり という感じで、使い倒すような使い方ではありませんでしたが、違いについて感想をメモしておきたいと思います。
どちらもFreeBSD をベースとしたルーターアプライアンスです。portsコレクションを使って素のFreeBSDからゴリゴリカスタマイズすれば、UIを除いて、pfSense,OPNsense と同じようなことが可能ようにも思えます。その場合の root 権限は自分にあるため、完全に自分好みのルーターを構築することが出来ます。自由度が高い反面、OSが外から丸々見えるわけですから、セキュリティー対策に時間を割く必要があります。また、ルーター向きのパラメーターチューンをしようとすると泥沼に沈みます。
対極にあるのがpfSense。ユーザーに許可されていることは、pfSense のメニューにあることだけ。管理者アカウント admin はあるものの OSの root 権限はユーザーには渡されていません。admin で殆どのことは出来ますが、ports コレクションは使えず、一部、pfSense開発側がオプションとして準備している squid や iftop などをインストールして使えるだけ。十分に安全ですが、やりたいことに手が届かないことも多い。
OPNsense は FreeBSD OS と pfSense のちょうど中間あたりにあるルーターアプライアンス という感じ。
root 権限はユーザーに渡されていて、pkg コマンドも8割くらい使えるため、pkg install <pkg_name> でルーターに欲しいコマンドをインストール可能です。例えば、http proxy の squid(これは pfSenseでも使えた) や bind-tools, apache なんかも入れることが出来ます。(Apacheを入れると、ルーター管理GUIとTCPポートがぶつかるので、工夫が必要だけれども入れることは出来る。)mysql なんかは最初から入ってる。
しかし、pkg コマンドからインストールできなかった管理コマンドもたくさんあり、htop, lsof, ttyload などは見つかりませんでした。
Vyatta とも比較
過去、OPNsense, pfSense 以外に Vyatta 6.x OS を使っていました。Vyatta は Linuxベースのルーターアプライアンスで、無料配布されていましたが、ブロケードが買収してしまい無料ではなくなってしまったことと、FreeBSD使いの私にはLinux系のコマンドを必要になった時毎回調べないといけないのが面倒で、これもPCハードウェアの故障をきっかけに FreeBSD系のルーターアプライアンスに乗り換えたわけですが、共通して言えることはルーターアプライアンスは家庭用ルーターよりも便利。その便利の中にも、利用者にどこまで解放されているのか?という敷居があり、OPNsense は Vyatta と同程度の自由度という印象です。無料のVyatta は無くなりVyOSになってしまいましたけどね。
ルーターアプライアンス向けハードウェア
ストックしていた STCK1A32W は無くなってしまったので、もし、次にSTCK1A32W が壊れてしまったらどうしようかと考え始めました。機能を代替できるPCはいくらでもありますが、STCK1A32Wをルーターとして使用する場合、最大 5V 2A の10W という低消費電力で、これと同等のものと言ったら、Raspberry Pi 3 しかない! Raspberry Pi 向けルーターアプライアンスを探さないといけないな~と思っているところです。
スティックPCの故障に関して
それにしても、なぜ、STCK1A32W は故障した?どんな壊れ方?
Stick PCのメインディスクは内蔵SSDのため、SSDの劣化は覚悟していました。特に /var 下の書き換えは多いはずなので、ディスクエラーが検出され始めたら、USB外部記憶を使うことになるかと思っていたのですが、別モードの故障。
問題のSTCK1A32W に接続すると、USB電源が落ちる。当然同じUSB電源につながっている全部が影響を受ける。おそらく、マイクロUSBコネクタ近辺で内部ショートが発生しているんでしょう。
コンデンサーのパンクや抵抗が焼き切れたりショートしていたり ということが予想できます。
さすがに、自分でチップコンデンサーやチップ抵抗の交換は出来ないので、自己修理は諦めることにします。