家に古いバッファローのルータWHR-G301Nが転がっていたので、OpenWrtを入れてみましたので、その時の手順をここにメモっておきます。
環境
作業に使用した環境は以下の通りです。
- 作業PC
- Windows 10
- Windowsのファイアウォール機能は無効化 ★無効化しておかないとタイミング有無に関係なくファームウェア転送に失敗しました。私はこれでハマったのでご注意ください。
- Windows 10
- L2スイッチ
- ルーターとWindows PCを直接つなぐと、ルータ電源投入時にリンクアップに時間がかかってしまい、ファームウェア転送のタイミングがシビアになるらしいので、L2スイッチを間に挟みました。
- OpenWrt
- バージョン 17.01.2 (こちらからwhr-g301n-squashfs-tftp.binをダウンロード)
- 2022年5月現在、OpenWrtはもっと新しいバージョンがリリースされていますが、本ルータはフラッシュが4MiBしかなく、インストールできません。また、19.xxのバージョンも入れてみましたが、ルータの設定を変更しても保存されない事象が発生してしまったため、最終的に17.01.2に落ち着きました。
既存ファームウェアのバックアップ
元のファームウェアに戻したい時のことを考えて、ファームウェアをバックアップしました。手順は、DD-WRT OpenWrt 適材適所で両方使いたい人向け @ ウィキ の記述を参考にしました。
ずっと家に放置していたルータで、どんな設定かもわからなかったので、まずはルータを初期化しました。リセット方法はバッファローの公式YouTube動画を参考にしました。底面にリセットスイッチがあるのですが、縦置き用の台を本体に取り付けてると見えないので外しましょう。私は力ずくで引っ張ると外れましたが、場合によっては爪が折れる可能性もあるので、ご注意ください。
後は動画の通り、電源が入ってる状態で底面のリセットボタンをDIAGランプが点滅するまで長押しました。その後DIAGランプは点灯→消灯すると完了です。
次に、ルーターとPCを繋ぎます。PCには、ルータのデフォルトのネットワーク設定によって、192.168.11.XX (私の場合は192.168.11.2)が付与されました。コマンドプロンプトを管理者として実行し、ipconfigを実行した結果の例です。
※ この時点では、管理者として実行する必要はありませんが、後ほどのarpテーブルの操作で管理者権限が必要なので、忘れないようにこの時点で管理者として実行しました。
C:\> ipconfig
~略~
イーサネット アダプター ethernet:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 192.168.11.2
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.11.1
私の環境では、アダプター名が "ethernet" になっていますが、環境によっては、"イーサネット 1"といった表示になっていると思います。このアダプター名は後で使うので、記憶しておきましょう。
http://192.168.11.1にブラウザからアクセスできることを確認します。IDはroot、パスワードは空欄でログインできます。
では、次にルーターのデバッグモードに入ります。ブラウザから、http://192.168.11.1/cgi-bin/cgi?req=frm&frm=py-db/55debug.html にアクセスします。IDはbufpy、パスワードはotdpopyです。
※ ルーターを初期化していない場合は、192.168.11.1はルーターのIPに読み替えてください。
※ ルーターにパスワードを設定している場合、デバッグモートのパスワードは、otdpopy+管理者パスワードになります。
以下のような画面が表示されるので、telnetdをクリック後、"start"ボタンを押します。
startボタンを押すとブラウザの画面は、通常のルーターの管理画面に戻ります。
Windowsのコマンドプロンプトからtelnetで192.168.11.1に接続します。
※ telnetコマンドがインストールされていない場合は、コントロールパネルのプログラムと機能よりインストールしておきましょう。(詳細割愛)
C:\> telnet 192.168.11.1
BusyBox v1.00 (2013.07.16-01:07+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.
#
パーティションを確認します。
# cat /proc/mtd
dev: size erasesize name
mtd0: 0003e000 00001000 "uboot"
mtd1: 00002000 00001000 "uboot_environ"
mtd2: 000e0000 00010000 "linux"
mtd3: 002c0000 00010000 "rootfs"
mtd4: 00010000 00010000 "user_property"
mtd5: 00010000 00010000 "ART"
mtd6: 003a0000 00010000 "firmware"
各パーティションをddコマンドを使ってダンプします。なお、ルータ内はストレージの空きが少ないので、一気にダンプするのではなく、各パーティションをダンプ→PCにダウンロード→ダンプ削除 の手順でバックアップしていきます。
まずは、書き込み可能なディレクトリに移動します。
# cd /tmp
mtd0をmtd0.ddというファイル名でダンプします。
# dd if=/dev/mtdblock/0 of=mtd0.dd
496+0 records in
496+0 records out
ダンプしたファイルをブラウザを使ってダウンロードします。mtd0.dd をダウンロードするには、http://192.168.11.1//html/py-db/tmp/mtd0.dd にアクセスします。アカウントは先程と同じく、IDがbufpy、パスワードはotdpopyです。
ダウンロードが終わりましたら、mtd0.dd を削除します。
# rm mtd0.dd
mtd1~6までを同様の手順でバックアップします。(手順割愛)
次に、ルーターのLAN側インターフェスのMACアドレスを確認します。以下はAA:AA:AA:AA:AA:AAと表記していますが、もちろんルーターによって値は変わりますので適宜読み替えてください。
※ ルータ側面に貼られているシールのSSIDの値がこのMACアドレスになっているようなので、そこから判断しても構いません。
# ipconfig br0
br0 Link encap:Ethernet HWaddr AA:AA:AA:AA:AA:AA
inet addr:192.168.11.1 Bcast:192.168.11.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15843 errors:0 dropped:0 overruns:0 frame:0
TX packets:19273 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2127383 (2.0 MiB) TX bytes:10746171 (10.2 MiB)
tftpでファームウェアインストールできるように、accept_open_rt_fmtを1に設定します。
# ubootenv set accept_open_rt_fmt 1
telnetでの作業は終わりです。exitで抜けましょう。
# exit
ホストとの接続が切断されました。
OpenWrtのインストール
いざOpenWrtのインストールです。作業はC:\openwrtフォルダで実施していきますので、なければ作っておいてください。
このフォルダに、ファームウェア lede-17.3vlnjs2H.01.2-ar71xx-generic-whr-g301n-squashfs-tftp.bin をダウンロードしておきます。
※ Wifiでインターネットに繋いでて、LANケーブルでルーターに接続している場合、有線側の優先度が高くなるため、インターネットアクセスがエラーになります。ファームウェアをダウンロードしていない場合は、一旦LANケーブルを抜いてみてください。
管理者として実行されているコマンドプロンプトで、C:\openwrt に移動します。
C:\> cd C:\openwrt
C:\openwrt> dir
ドライブ C のボリューム ラベルは Windows です
ボリューム シリアル番号は XXXX-XXXX です
C:\openwrt のディレクトリ
2022/05/07 21:33 <DIR> .
2022/05/07 21:33 <DIR> ..
2022/05/07 21:33 3,473,444 lede-17.01.2-ar71xx-generic-whr-g301n-squashfs-tftp.bin
1 個のファイル 3,473,444 バイト
2 個のディレクトリ 27,196,813,312 バイトの空き領域
ルーターのMACアドレス(AA:AA:AA:AA:AA:AA)を、192.168.11.1でWindowsのARPテーブルに登録します。ここで、MACアドレスの表記は、":"ではなく、"-" で区切る必要があるので注意。
※ MACアドレスとアダプタ名(ethernet)は適宜読み替えてください。
C:\openwrt>netsh interface ipv4 set neighbors "ethernet" 192.168.11.1 AA-AA-AA-AA-AA-AA
ARPテーブルに登録されたことを確認します。
C:\openwrt>arp -a
インターフェイス: 192.168.11.2 --- 0xa
インターネット アドレス 物理アドレス 種類
192.168.11.1 aa-aa-aa-aa-aa-aa 静的 ★ここが静的になっていること
~略~
コントロールパネルからネットワークアダプタの設定を開き、PCのIPアドレスを192.168.11.2/255.255.255.0に固定します。
Windowsセキュリティを開いて、使用しているネットワークのファイアウォールを無効化します。
これで準備は完了です。コマンドプロンプトに以下のコマンドを打ち込んでおきます。(実行はまだ)
※ tftp コマンドがインストールされていない場合は、telnetコマンド同様にコントロールパネルのプログラムと機能よりインストールしておきましょう。(詳細割愛)
C:\openwrt>tftp -i 192.168.11.1 PUT C:\openwrt\lede-17.01.2-ar71xx-generic-whr-g301n-squashfs-tftp.bin
ルータの電源を一旦抜き、再度挿した後、5~8秒後ぐらいに上記コマンドを実行します。
※ 電源投入後、L2スイッチのランプがリンクアップした後、一瞬消えます。私はそのタイミングで実行すると成功しました。
以下の通り「転送を正常に完了しました」が表示されれば成功です。DIAGの赤いLEDが点滅後、緑の点滅に変わり、点灯に変われば書き込み完了です。(DIAGは消灯しませんでした)
C:\openwrt>tftp -i 192.168.11.1 PUT C:\openwrt\lede-17.01.2-ar71xx-generic-whr-g301n-squashfs-tftp.bin
転送を正常に完了しました: 2 秒間に 3473444 バイト、1736722 バイト/秒
もし転送が正常に完了したのに、バッファローの管理画面が表示されてしまう場合は、前述のaccept_open_rt_fmtを1に設定し忘れていないか確認しましょう。
後始末とOpenWrtへのログイン
ARPテーブルに登録したルーターのMACアドレスは削除します。
C:\openwrt>netsh interface ipv4 delete neighbors "ethernet" 192.168.11.1
OK
ファイアウォールも必要に応じて、有効に戻しておきましょう。さらに、PCに設定したIP (192.168.11.2) も自動に戻しておきます。
これで、OpenWrtのデフォルトのネットワークセグメントのIPがDHCPで自動でPCに割り振られるはずです。私の環境では、192.168.1.233 が設定されました。
ブラウザでhttp://192.168.1.1にアクセスして、OpenWrtの画面が表示されることを確認して作業完了です。
※ デフォルトではrootにパスワードは設定されていません。
ログイン後の画面例も載せておきます。