2019年2月20日水曜日

WZR-HP-AG300H with OpenWrt

2 台目となる Buffalo の Wi-Fi ルーター親機 WZR-HP-AG300H をメルカリで入手した。ちなみに 1 台目は友人が不要になったものをたまたまもらっただけで、特に WZR-HP-AG300H であることを狙ったわけではない。もらってしまってから、DD-WRT というカスタムファームウェアに書き換えられること、それによって、OpenVPN が使えるということを知り、Buffalo 公式の OEM ファームウェアで使える(セキュリティ性能が脆弱な)PPTP ではなく OpenVPN を是非使いたかったので、それだけが目的で DD-WRT にしてみたという経緯であった。なので特に元の OEM ファームウェアに戻すことなど考えずに、その時はただ DD-WRT(v24-sp2 (12/22/14) std - SVN revision 25697)化した。

2014 年頃で DD-WRT の方は(少なくとも WZR-HP-AG300H 用については)安定版のリリースが停滞してしまっている(専らベータ版のみ)。せめて KRACK 対策された安定版が欲しいところ。一方、OpenWrt の方は今でも WZR-HP-AG300H 用の最新版が用意されている。

さらに、OpenWrt は色々と追加パッケージを自分で好きなように入れることができ、中には、Asterisk や Python やデータベースのパッケージもあるという。これは OpenWrt に俄然、興味を惹かれた。

またよくよく調べてみると、昔の時点だけでなく 2019 年の今に至るまで、OpenWrt 用の Buffalo 製ハードとしては WZR-HP-AG300H はメチャクチャ最適な機種らしいということがわかってきた。

型番の AG というのは、Wi-Fi の周波数が 5GHz 帯の IEEE 802.11a と 2.4GHz 帯の IEEE 802.11g の両対応という意味のようで、これ以前の機種や廉価版機種では G のみの型番のものが多く(それらはハードオフなどでも見捨てられてジャンクとして転がっている)、Wi-Fi 性能の点で一線を画している。さらに型番の 300 は IEEE 802.11n の通信速度 300Mbps のことだろう。

とはいえ、後に 3x3 MIMO(450Mbps)や 4x4 MIMO(600Mbps)の機種も登場しているし、IEEE 802.11ac という規格のものも出てきているので、Wi-Fi 性能の点ではもっと新しい世代の Buffalo のルーターもあり、そちらの方がなおさらいいのではないかと言うと、実はそうでもない。WZR-600DHP3 など後の世代のものは CPU 性能がさらに向上し、RAM もフラッシュメモリーもさらに容量が多くなっている。しかし、これら(ブロードコム系無線チップ搭載のもの)は、OpenWrt にファームウェアを書き換えると、Wi-Fi 機能が使えなくなってしまう。Wi-Fi チップに関する制御コードが暗号化されてしまっていて、自由に利用できないとか何とか、ビジネス的な事情によるもののようである。つまり現実問題として、Wi-Fi ルーターとして利用可能な OpenWrt 用の安価な中古ハードウェアとしては、WZR-HP-AG300H が最善の選択となってしまうみたいなのだ(金に糸目を付けなければ、Netgear の R7800 あたりに OpenWrt を載せてみたいものだが)。

1 台目が WZR-HP-AG300H となったのは単なる偶然だったが、今回の 2 台目はそういうことで狙ってこの WZR-HP-AG300H を入手した。1 台目の DD-WRT を OpenWrt に書き換えても良かったのだが、1 台目を DD-WRT に書き換えた時は特に何も戻すこと等は考えていなかったので、オリジナルの OEM ファームウェアのバックアップを取ることなどもしておらず、片道切符での作業だった(調べてみたら、バックアップを使わずとも戻せるので、この点は気にしなくてもよかったことだが)。そういったこともあって、現に運用中の DD-WRT の WZR-HP-AG300H をぶっつけ本番で OpenWrt 化するのはためらわれたので、たかだか 1000 円程度で入手できるものであるからと、2 台目をメルカリで確保し、これを使って安全に気の済むまでいじってみることにした。

OEM ファームウェア(メルカリ入手時 1.72)のバックアップ作業やその検証

mkdir /mnt/usb0_0/firm1.72
dd if=/dev/mtdblock/0 of=/mnt/usb0_0/firm1.72/mtdblock0.bin
dd if=/dev/mtdblock/1 of=/mnt/usb0_0/firm1.72/mtdblock1.bin
dd if=/dev/mtdblock/2 of=/mnt/usb0_0/firm1.72/mtdblock2.bin
dd if=/dev/mtdblock/3 of=/mnt/usb0_0/firm1.72/mtdblock3.bin
dd if=/dev/mtdblock/4 of=/mnt/usb0_0/firm1.72/mtdblock4.bin
dd if=/dev/mtdblock/5 of=/mnt/usb0_0/firm1.72/mtdblock5.bin
dd if=/dev/mtdblock/6 of=/mnt/usb0_0/firm1.72/mtdblock6.bin

ubootenv set で変数を一種類のみ変更して前後でのファームウェアイメージの変化を調べたところ、mtdblock1 以外に mtdblock4 にも変化が見られた。また、純正ファームウェア上での「設定初期化」では、ubootenv の変更はリセットされなかった。dd コマンドによる mtdblock1 の書き戻しで、ubootenv list の内容がリストアされることも確認した。一方、mtdblock4 は ubootenv set の前後のいずれとも一致しなかったので、起動毎に構成されるような一時的なデータが格納されるものと思われる。

さらに 1.72 → 1.73 へのアップデートで、mtdblock2、mtdblock3、mtdblock4、mtdblock6 が変化した。やはり、mtdblock0 は U-Boot 本体であるから不変であるべきであろうし、mtdblock5 の ART というのは、シリアル関係のファームなのだろうか、OS とは別個のものなのだろう。

OpenWrt ToH の Flash Layout によると、サイズから推測するに、OpenWrt では、rootfs_data 用の領域が増えているだけで、残りの 7 ブロックについてはサイズ的に一致している。一方、DD-WRT の方は、U-Boot(RedBoot に変更される)も含めて大幅に書き換えられているようである。

ubootenv コマンドによる TFTP の有効化等

OEM Web UI のデバッグモードにてコマンドを実行:

ubootenv set accept_open_rt_fmt 1
ubootenv set region US

OEM ファームウェア 1.73

オリジナルの OEM ファームウェアでは 1.73 がベスト。デバッグモードが使えて、ubootenv コマンド(TFTP の有効化と、リージョン変更のために必要)や dd コマンド(オリジナル状態の ROM イメージをバックアップしておくために必要)等が実行できるから。1.74 以降はデバッグモードが無効化されている。

OpenWrt(や DD-WRT)へのファームウェアの載せ替え作業自体は、デバッグモードが使える(1.73 以下である)必要はなく、(1.74 以降であっても)Web UI からのアップデートでインストールが可能である。

文鎮化

何度かネットワーク設定を誤って文鎮化したことがあった。TFTP リカバリー機能(予め、OEM Web UI で ubootenv コマンドを使って TFTP を有効化しておく必要がある。この方法が使えないと、殻割りしてシリアルコンソールによるデバッグ方法しか手段が残されていない)を使って回復させた。

OpenWrt を TFTP リカバリーから入れられるようにするため、ubootenv で region を US にしていたため、日本版の OEM ファームウェアは入れられなかったので、US 版の OEM ファームウェア(ちなみにバージョンは 1.78)を使う必要があった。

また、OEM ではなく、OpenWrt でリカバリーする場合には、TFTP 用のファームウェア必要となるが、15.05 のファームウェア openwrt-15.05.1-ar71xx-generic-wzr-hp-ag300h-squashfs-tftp.bin が現時点で最新の TFTP 用であり、一旦 15.05 で復活させて、それを 18.06 にアップグレードする形で復旧した。

TFTP サーバー機としては、Windows10 機を使った。手持ちの Macbook には有線 LAN の接続手段が無く、Linux 機もスイッチングハブを介さないケーブル直結状態では ip コマンドが失敗するので、Windows に落ち着いた。1: netsh コマンド; 2: arp -a コマンド; 3: tftp -i コマンドの計 3 行のコマンドからなるバッチファイル(recover. bat)を使ってタイミングを測って実行するやり方で上手く行った。

Technical Glossary

U-Boot (Universal Boot Loader)
組み込み機器における、PC-Linux にとっての BIOS + GRUB の部分に相当するもの。もちろん WZR-HP-AG300H にも使われている。この U-Boot が、OEM ファームウェアの Web UI なり、OpenWrt なりを起動してバトンタッチすることになる。つまり、(オリジナル、OpenWrt、DD-WRT の)Web UI によるファームウェアの書き換え処理によって変更されるのは、U-Boot によってバトンが渡される先の OS 本体の部分についてであって、(恐らく)U-Boot は不変である(ただし、mtd コマンド、dd コマンド、cat コマンド等で書き込み先を指定して直接書き込みを行う場合には、そこがたとえ U-Boot の部分であっても書き込めてしまうだろうから、くれぐれも書き込み先の指定は間違えないように注意する必要がある)。
TFTP (Trivial FTP)
U-Boot が備えている機能の一つで、ネットワークからファイルをダウンロードする。ブート用の OS のカーネルイメージをネットワークから読み込(んで、Flash ROM に書き込)むのに利用されている。Buffalo が TFTP を応用したこのような機能を用意しているのは、何らかの理由でファームウェアが壊れた場合に、ファームウェアを改めて書き込み直すというリカバリー手段としてであろう。日本版の WZR-HP-AG300H ではデフォルトでは TFTP が U-Boot の環境変数(フラグ)で無効化されている。
WZR-HP-AG300H の TFTP リカバリー機能
WZR-HP-AG300H の IP アドレス: 192.168.11.1; MAC アドレス: 02:aa:bb:cc:dd:20; TFTP サーバー(PC)の IP アドレス: 192.168.11.2; 待ち時間 4 秒(ubootenv で tftp_wait を 4 秒よりも長い時間に変更できるが、実際には効果がないように思われる)。
👉 BHR-4GRVでのTFTPインストール方法(DD-WRT OpenWrt 適材適所で両方使いたい人向け)BHR-4GRV 用の説明だが WZR-HP-AG300H と基本的に共通している。
👉 WZR-HP-AG300H を tftp で純正ファームに戻す(ばっくらっしゅの備忘録)実際の作業上のタイミングを知る上で、ここの写真入り解説が一番わかりやすい。
👉 WZR-HP-AG300H(OpenWrt ToH)
👉 De-bricking and TFTP Info(DD-WRT wiki)
OpenWrt ファームウェアの種類
***-squashfs-factory.bin(OEM Web UI → OpenWrt)
***-squashfs-sysupgrade.bin(OpenWrt → OpenWrt)
***-squashfs-tftp.bin(U-Boot の TFTP リカバリー機能を用いた OpenWrt 化)
DD-WRT からの OpenWrt 化
DD-WRT の linux ブロックは、OpenWrt の firmware ブロック(さらには OEM ファームウェアの ブロック 6)に相当するようだ。***-squashfs-sysupgrade イメージがそのブロックの中身そのもののようである。
👉 DD-WRT化したWZR-HP-AG300HからOpenWRTのインストール方法(DD-WRT OpenWrt 適材適所で両方使いたい人向け)
👉 オリジナルfirmwareへの復旧方法 > OS上から > CLIコンソールからの復旧(DD-WRT OpenWrt 適材適所で両方使いたい人向け)
OEM ファームウェア上でのファームウェアイメージのバックアップ
👉 BHR-4GRVでのTFTPインストール方法(DD-WRT OpenWrt 適材適所で両方使いたい人向け)dd コマンドによるバックアップが丁寧に記載されている。
👉 ファームウェア・設定ファイルなどのバックアップ・書き込み(DD-WRTまとめwiki)バックアップされるイメージは U-Boot 用のイメージなので、バイナリーが「27 05 19 56」で始まるファイルのはず(未確認)。
OEM ファームウェアのデバッグモード
1.73 以下で、user: bufpy; pass: otdpopy(ところで、bufpy の buf は Buffalo の buf なんだろうけけど、py とか otdpo は何を意味しているのだろうか?)
ubootenv set コマンドで環境変数(accept_open_rt_fmt, region 等)を変更できる。ubootenv list で環境変数のリストを表示できる。
👉 WZR-HP-AG300H、デバッグモードに入り telnetdを起動(ばっくらっしゅの備忘録)
👉 デバッグモードによるファーム書き込みでWZR-HP-AG300HをWZR-600DHPに変身(物好き者)
👉 今日のお品。WZR-600DHP ハードウェア的には WZR-HP-AG300H と同等品の WZR-600DHP だが、ダウンロード配布されている OEM ファームウェアが暗号化されているかいないかという違いがあるようだ。OEM ファームウェアしか使わないのであれば、WZR-600DHP 化して喜んだりするのもありだが、OpenWrt 化を前提にすると、改悪版以外の何物でもない。
DD-WRT での NVRAM リセット方法(未確認)
telnet で 1) erase nvram 2) reboot
👉 【Buffalo】 DD-WRTから元に戻す & OpenWrtの導入 【改造】

OpenWrt 化後の作業

  1. Wi-Fi
  2. SSH
  3. Timezone、NTP
  4. ブリッジ化
  5. VPN サーバー
  6. USB Drive
  7. WWW サーバー(uHTTPd)
  8. Python3
  9. MariaDB
  10. SFTP サーバー

OpenWrt 化後の作業例:👉 OpenWrtを設定していく

0 件のコメント:

コメントを投稿