家に古いバッファローのルータWHR-G301Nが転がっていたので、OpenWrtを入れてみましたので、その時の手順をここにメモっておきます。

環境

作業に使用した環境は以下の通りです。

  • 作業PC
    • Windows 10
      • Windowsのファイアウォール機能は無効化 ★無効化しておかないとタイミング有無に関係なくファームウェア転送に失敗しました。私はこれでハマったのでご注意ください。
  • 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にパスワードは設定されていません。

ログイン後の画面例も載せておきます。