🛡️

Azure上に最新のOpenWrtを立ち上げる

2023/01/14に公開

はじめに

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をお勧めします。

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にダウンロードしてきます。

img

イメージファイルの変換

作業しているローカル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上で動かします。

新規ホストを作ります。

img

仮想マシンの名前は適当に。

img

世代の指定では「第1世代」を選択します。

img

起動メモリは1GBもあれば十分すぎます。

img

NICは接続しなくて大丈夫です。

img

既存のハードディスクとして、先ほど作成したvhdファイルを選択します。

img

最後に「完了」を押して準備完了。

img

一覧から今作成した仮想マシンを選択後、「接続」を押します。

img

起動します。

img

少し待ってからEnterを押せばOpenWrtロゴが表示されて、こちらのコンソールから各種コマンドが実行可能になります。

img

以下のコマンドを入力します。

これは、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」にすることを忘れないでください。

img

イメージリソースの作成

Azure仮想マシンの元となるイメージリソースを作ります。

リソースの新規作成で検索フィールドに「image」とか打ち込むと希望のリソース種類が選べるかもです。

img

基本タブ

  • 対象のサブスクリプション、リソースグループを選択
  • イメージの名前、リージョンを選択
  • OSの種類は「Linux」「Gen 1」を選択
  • ストレージBLOBには先ほどアップロードしたvhdファイルを選択
  • アカウントの種類はコストを考えて「Standard HDD」を選択

img

あとは特に設定しなくても大丈夫なので、これで作成します。

Azure仮想マシンのデプロイ

上で作ったイメージリソースの「+VMの作成」を押します。

img

基本タブ

  • 対象のサブスクリプション、リソースグループを選択
  • 仮想マシン名は適当に
  • 可用性オプションは、今回は1台構成なので冗長なし
  • サイズは小さくて構わないので「Standard_b1s」(1core, 1GB)を選択

img

  • 管理者アカウントは設定しても今回は無意味なので適当に(Azureエージェントが入っていないのでそもそもユーザ追加が行われない)
  • 受信ポートの規制は、とりあえずHTTP,HTTPS,SSHを選択

img

ディスクタブ

  • ディスクIOはそれほど無いので一番安い「Standard HDD」を選択

img

ネットワークタブ

  • サブネットは今回はazure-subnet(私の想定では内部ネットワークという位置づけ)を選択
  • パブリックIPも付けます。これは管理用という位置づけ。
  • NICネットワークセキュリティグループも基本タブで設定した内容がデフォルトで設定されているのでこのまま設定

img

後は「検証および作成」に進んでデプロイ開始します。

しばらく待っても状態は「作成中」のまま変わりません。

img

これは、OpenWrtのイメージにAzure向けのエージェントが組み組まれていないからです。

今更ですが、Azure仮想マシン上でOpenWrtは動作しますが、Azureの各種機能(モニター管理など)は一切期待しないでください。

OpenWrt管理画面へのアクセスと初期設定

先のAzure仮想マシンの状態が「作成中」のままでも(きっと)OpenWrtは動いています。

パブリックIPアドレスを確認して、ブラウザからアクセスすると繋がります。

img

初期状態ではrootのパスワードは未設定なので、急いで「Login」を押して先に進みます。

System→Administrationを選択

img

rootのパスワードを設定します。

img

ここまでで一安心ですね。

どうせなら日本語化しておきましょう。

img

タイムゾーンも「Asia/Tokyo」に変更。

img

一応これでOK。

img

Azure側の最初に作ったLAN側のNICに割り当てらているNSGも、SSH,HTTP,HTTPSアクセスを自分の拠点からのみの許可に変更しました。

img

DMZ用NICの追加

一度仮想マシンを停止します。

img

仮想マシンの「ネットワーク」から「ネットワークインターフェイスの接続」を押します。

img

新たなNICを作成するので「ネットワークインターフェイスの作成と接続」を押します。

img

新しいNIC名を設定します。

DMZゾーンへのアクセスは全てOpenWrtのFirewallが守ってくれるはずなので、ここではNSGは設定しません。

ただし今回の記事ではとりあえずパブリックIPアドレスは用意していません。(次回以降で。。)

img

作成が完了すると、NICが増えましたね。

img

再度仮想マシンを起動します。

img

OpenWrtの管理画面にログイン後、ネットワークインファーフェースの新規作成を行います。

img

名前は「DMZ」にしました。プロトコルはこちらも「DHCPクライアント」にして、デバイスに先ほど追加された「eth1」を選択して作成します。

img

作成されたDMZの「ファイアウォール設定」を選択します。

img

ファイアウォールのゾーンに「wan」を設定します。

img

これで、なんとなくDMZとプライベートセグメントできっちり分かれた構成になりました。

img

今後の予定

以下について引き続き検証・実施を行って記事化していく予定です。

  • WireGuardを導入して実家のOpenWrtと閉域接続
  • DMZゾーンにもPublic IP Addressを設定してWebサイト構築

おわりに

とりあえず今回の記事で紹介したところまで構築できれば、後は基本的にはOpenWrt側の設定になると思います。

私は実はそれほどOpenWrtについて詳しくないので、この後の操作は試行錯誤になると思います。

本記事を読んで実践された方は、色々と情報交換が出来ればなと考えます。

最後になりましたが、今後さらに検証を進めて記事化するために各種ルータを購入したいため、良ければバッジを送っていただけると助かりますw

Discussion