Azure上に最新のOpenWrtを立ち上げる
はじめに
OpenWrt最高ですね。
実家ではいわゆる市販のルータを組み合わせて、運用していたのですがELECOMの中古ルータ(2,000円)を買ってきて、もともとあったI/O DataのルータもOpenWrt化することで、Wi-FiもIEEE 802.11rによるメッシュ化が実現できました。
更にWireGuardで自宅・実家・Azureの拠点間も現状の機器構成から全てをOpenWrt上で構築すべく、まずはAzure仮想マシン上にOpenWrtを導入することにしました。
過去のWireGuardの記事はこちらです。
WireGuardでAzure、オンプレミス、iPhoneを閉域接続しまくる
本記事ではまずはOpenWrtをAzure上に立ち上げるところまでを紹介します。
ちなみに物理ルータではWi-Fi5までの対応ですが、安価で中古市場でもかなり安く買える、ELECOMのWRC-1167GST2をお勧めします。
本記事でやること
以下のステップを紹介します。
- 公式サイトから最新のx86向けイメージファイルを取得
- イメージファイルをvhd形式に変換
- ローカルPC上のHyper-Vにて起動、ネットワークインタフェースの設定変更
- vhdファイルをAzureに転送
- Azure仮想マシンのデプロイ
- OpenWrtの基本設定
実際のルーティング動作や、WireGuard設定などは今後別記事で紹介したいと思っています。
OpenWrt最新イメージの取得
以下のサイトに飛びます。
https://downloads.openwrt.org/
Stable ReleaseにあるOpenWrtの最新Versionのリンクに飛びます。本記事執筆時点では「OpenWrt 22.03.3」となっています。
Azure仮想マシンはx86→64になります。
具体的なリンクは以下の通り。
https://downloads.openwrt.org/releases/22.03.3/targets/x86/64/
「generic-ext4-combined.img.gz」をローカルPCにダウンロードしてきます。
イメージファイルの変換
作業しているローカルPCはWindows 11ですが、まずはUbuntuが載っているWSLターミナル上から作業します。
イメージファイルの変換には各種ツールが存在するようですが、qemu-imgコマンドが一番楽に操作可能でした。
まずはWSL上にツールをインストール。
sudo apt update
sudo apt install qemu-utils
元のファイルを解凍。
BASE='/mnt/c/Users/katakura/Downloads'
FILE='openwrt-22.03.3-x86-64-generic-ext4-combined'
cd ${BASE}
gunzip ${FILE}.gz
解凍したイメージのサイズを確認します。
qemu-img info ${FILE}.img
サイズは120MiBですね。
$ qemu-img info ${FILE}.img
image: openwrt-22.03.3-x86-64-generic-ext4-combined.img
file format: raw
virtual size: 120 MiB (126353408 bytes)
disk size: 120 MiB
Azure仮想マシンに適用可能なサイズは1MiB単位で調整する必要があるので、120MiBより多めの128MiBでのサイズを計算します。
$ echo '128 * 1024 * 1024' | bc
134217728
こちらで得た値でイメージファイルのサイズを拡張します。
qemu-img resize -f raw ${FILE}.img 134217728
$ qemu-img resize -f raw ${FILE}.img 134217728
Image resized.
$ qemu-img info ${FILE}.img
image: openwrt-22.03.3-x86-64-generic-ext4-combined.img
file format: raw
virtual size: 128 MiB (134217728 bytes)
disk size: 128 MiB
固定サイズのvhd形式に変換します。
qemu-img convert -f raw -o subformat=fixed,force_size -O vpc ${FILE}.img ${FILE}.vhd
$ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc ${FILE}.img ${FILE}.vhd
$ ls -l
total 262148
-rwxrwxrwx 1 katakura katakura 134217728 Jan 13 16:13 openwrt-22.03.3-x86-64-generic-ext4-combined.img
-rwxrwxrwx 1 katakura katakura 134218240 Jan 13 16:15 openwrt-22.03.3-x86-64-generic-ext4-combined.vhd
ローカルPCからの実行
ローカルPCのHyper-V上で動かします。
新規ホストを作ります。
仮想マシンの名前は適当に。
世代の指定では「第1世代」を選択します。
起動メモリは1GBもあれば十分すぎます。
NICは接続しなくて大丈夫です。
既存のハードディスクとして、先ほど作成したvhdファイルを選択します。
最後に「完了」を押して準備完了。
一覧から今作成した仮想マシンを選択後、「接続」を押します。
起動します。
少し待ってからEnterを押せばOpenWrtロゴが表示されて、こちらのコンソールから各種コマンドが実行可能になります。
以下のコマンドを入力します。
これは、OpenWrtがデフォルトでlanインタフェースのIPアドレスをスタティックで「192.168.1.1」を割り当てているところをAzureに合わせてDHCPに変更したVHDファイルに変更しています。
uci set network.lan.proto=dhcp
uci delete network.lan.ipaddr
uci delete network.lan.netmask
uci commit network
ここまで完了したらHyper-V上でOpenWrtをシャットダウンします。
Azure上のリソース準備
以下のリソースについて事前に適当なリソースグループ配下に作成しておきます。
具体的な操作方法は割愛します。がんばってください。
- ストレージアカウント
- vhdファイルのアップロードに必要
- 適当なコンテナ(ディレクトリ)を作成しておく
- 仮想ネットワーク
- サブネットとしてDMZ、プライベート用に2つ以上作成
私は仮想ネットワーク上に既に別のWireGuard用の仮想マシンが存在していたりするのですが、以下の構成で作成しています。
- method-vnet (192.168.2.0/24)
- dmz-subnet (192.168.2.0/26)
- private-subnet (192.168.2.64/26)
- azure-subnet (192.168.2.128/26)
まだちゃんと用途は決まっていないのですが、azure-subnetをlanセグメントとして、構築を進めます。
vhdファイルの転送
ローカルPCで作成したvhdファイルをAzureに転送します。
今回はAzureポータルから操作しましたが、ページBLOBとして転送できるのであれば他のツールを使っても構いません。
事前に作成したストレージアカウントのコンテナ内にアップロードします。詳細設定にてBLOBの種類は必ず「ページBLOB」にすることを忘れないでください。
イメージリソースの作成
Azure仮想マシンの元となるイメージリソースを作ります。
リソースの新規作成で検索フィールドに「image」とか打ち込むと希望のリソース種類が選べるかもです。
基本タブ
- 対象のサブスクリプション、リソースグループを選択
- イメージの名前、リージョンを選択
- OSの種類は「Linux」「Gen 1」を選択
- ストレージBLOBには先ほどアップロードしたvhdファイルを選択
- アカウントの種類はコストを考えて「Standard HDD」を選択
あとは特に設定しなくても大丈夫なので、これで作成します。
Azure仮想マシンのデプロイ
上で作ったイメージリソースの「+VMの作成」を押します。
基本タブ
- 対象のサブスクリプション、リソースグループを選択
- 仮想マシン名は適当に
- 可用性オプションは、今回は1台構成なので冗長なし
- サイズは小さくて構わないので「Standard_b1s」(1core, 1GB)を選択
- 管理者アカウントは設定しても今回は無意味なので適当に(Azureエージェントが入っていないのでそもそもユーザ追加が行われない)
- 受信ポートの規制は、とりあえずHTTP,HTTPS,SSHを選択
ディスクタブ
- ディスクIOはそれほど無いので一番安い「Standard HDD」を選択
ネットワークタブ
- サブネットは今回はazure-subnet(私の想定では内部ネットワークという位置づけ)を選択
- パブリックIPも付けます。これは管理用という位置づけ。
- NICネットワークセキュリティグループも基本タブで設定した内容がデフォルトで設定されているのでこのまま設定
後は「検証および作成」に進んでデプロイ開始します。
しばらく待っても状態は「作成中」のまま変わりません。
これは、OpenWrtのイメージにAzure向けのエージェントが組み組まれていないからです。
今更ですが、Azure仮想マシン上でOpenWrtは動作しますが、Azureの各種機能(モニター管理など)は一切期待しないでください。
OpenWrt管理画面へのアクセスと初期設定
先のAzure仮想マシンの状態が「作成中」のままでも(きっと)OpenWrtは動いています。
パブリックIPアドレスを確認して、ブラウザからアクセスすると繋がります。
初期状態ではrootのパスワードは未設定なので、急いで「Login」を押して先に進みます。
System→Administrationを選択
rootのパスワードを設定します。
ここまでで一安心ですね。
どうせなら日本語化しておきましょう。
タイムゾーンも「Asia/Tokyo」に変更。
一応これでOK。
Azure側の最初に作ったLAN側のNICに割り当てらているNSGも、SSH,HTTP,HTTPSアクセスを自分の拠点からのみの許可に変更しました。
DMZ用NICの追加
一度仮想マシンを停止します。
仮想マシンの「ネットワーク」から「ネットワークインターフェイスの接続」を押します。
新たなNICを作成するので「ネットワークインターフェイスの作成と接続」を押します。
新しいNIC名を設定します。
DMZゾーンへのアクセスは全てOpenWrtのFirewallが守ってくれるはずなので、ここではNSGは設定しません。
ただし今回の記事ではとりあえずパブリックIPアドレスは用意していません。(次回以降で。。)
作成が完了すると、NICが増えましたね。
再度仮想マシンを起動します。
OpenWrtの管理画面にログイン後、ネットワークインファーフェースの新規作成を行います。
名前は「DMZ」にしました。プロトコルはこちらも「DHCPクライアント」にして、デバイスに先ほど追加された「eth1」を選択して作成します。
作成されたDMZの「ファイアウォール設定」を選択します。
ファイアウォールのゾーンに「wan」を設定します。
これで、なんとなくDMZとプライベートセグメントできっちり分かれた構成になりました。
今後の予定
以下について引き続き検証・実施を行って記事化していく予定です。
- WireGuardを導入して実家のOpenWrtと閉域接続
- DMZゾーンにもPublic IP Addressを設定してWebサイト構築
おわりに
とりあえず今回の記事で紹介したところまで構築できれば、後は基本的にはOpenWrt側の設定になると思います。
私は実はそれほどOpenWrtについて詳しくないので、この後の操作は試行錯誤になると思います。
本記事を読んで実践された方は、色々と情報交換が出来ればなと考えます。
最後になりましたが、今後さらに検証を進めて記事化するために各種ルータを購入したいため、良ければバッジを送っていただけると助かりますw
Discussion