うたカモ技術ブログ

Linux OpenWrt ネットワーク

【第 4 回】 OpenWrt開発入門   LuCI(WebUI)によるネットワーク・Wi-Fi設定

post:     update: 

この記事に掲載しているOpenWrtの設定方法は執筆時点で最新のOpenWrt22.03に基づいています。 過去もしくは最新版のOpenWrtではこの記事の内容が当てはまらないかもしれません。予めご了承ください。

前回の記事では、UCIコマンドによる AP・ルーターそれぞれのネットワーク・Wi-Fi設定について紹介しました。

このUCIコマンドによる設定方法は、半ば手動設定と言ってもよく、目的とする設定をするためには少なくとも UCIシステムの仕組みとUCIコマンドの使い方に対する理解が必要です。 このことは、エンドユーザーとしてOpenWrtを使用したい人にとっては大変な障壁になります。

そこでOpenWrtでは、UCIシステムによる設定値(環境変数)管理の仕組みをLuCIと呼ばれるWebUIにより包み隠し、 ユーザービリティに富んだ操作画面を提供することで、OpenWrt固有システムに対する学習コスト を無くすような抽象化設計が図られています。

今回の記事では、前回記事で紹介したUCIコマンドによるAP・ルーターそれぞれのネットワーク・Wi-Fi設定をLuCIで実施します。 これを通して、LuCIがOpenWrt固有システムであるUCIシステムの仕組みと複雑さを抽象化し、エンドユーザーに「本質的なネットワーク・Wi-Fi設定 に集中できる環境」を提供していることを実感してもらいたいと思います。(ちなみに、今回もターゲットデバイスはRaspberry Pi3Bです。)

そして最後に、UCIシステムのようなコアシステムとUIシステムのレイヤー設計では想定エンドユーザーに合わせたサービスの抽象化が重要であることを述べます。 結論から言って、OpenWrtのLuCIが想定するエンドユーザーは「ネットワークエンジニアレベルの知識を持ったユーザー」 であるということを述べて締めくくりたいと思います。(もちろん、ここら辺は個人の感想ですけどね)

それでは、行ってみます。

この記事ではOpenWrtの無線設定を変更する内容が含まれます。 設定を間違えた場合、電波法違反になる搬送波が発射される可能性がありますのでご注意ください。 また、日本では技術基準適合証明または工事設計認証(技適)を受けた製品のみが無線機能を使用することが許可されます。 Raspberry Piを公式代理店などから購入していない場合、技適を受けていない可能性があります(受けていれば技適マークがあります)。 また、技適マークがあったとしても、Raspberry PiにOpenWrtをインストールして無線機能を利用すること自体が電波法のグレーゾーンですので、 この記事の実施は自己責任でお願いします。実施する場合は、電磁シールドの使用をおすすめします。また、この記事はメーカーによるプリインストールではないOpenWrtの無線機能を恒常的に使用することを奨めるものではありません。 あくまで学習を目的とします。

目次

  1. 実施環境と補足事項
  2. LuCIによる無線LANアクセスポイント(AP)設定
  3. LuCIによるルーター設定
  4. WeuUIとUCIシステムの関係性
  5. おわりに

実施環境と補足事項

この記事は以下の環境で実施した結果を元に作成しています。
今回はOpenWrtをRaspberry Pi3Bにインストールしていますが、基本的な設定はどのデバイスでも共通です。

※RFチップやハードウェアインタフェースに依存する箇所もLuCIとその下のCGIによって上手く吸収されていれば、難なく設定することが出来ます。 しかし、OpenWrtの各デバイス対応によっては実装が間に合っていない、バグが存在するなどの理由で設定できない場合もありますのでご注意ください。

#作業用PCの実行環境OS
ubuntu 22.04 LTS 64bit
#OpenWrtデバイス
  名称:Raspberry Pi3 Model B
  CPU:ARM Cortex-A53 (1.2GHz)
  SOC:Broadcom BCM2837
  RAM:1GB
  ストレージ(media):MicroSDカード
#OpenWrt
OpenWrt 22.03

また、ここで紹介するAP・ルーター別のネットワーク・Wi-Fi設定は以下の既存ネットワーク環境に適用した結果を元に作成しています。 この記事を参考にする際は、ご自身のネットワーク環境に合わせてください。

※とは言え、AP設定ではRaspberry Piを動的IPアドレス割り当て(DHCP)によって既存ネットワークに所属させますので、この記事で仮定する既存ネットワークとのIPアドレスの 違いを意識する必要ありません。またルーター設定では、Raspberry PiのLAN側ネットワークと既存ネットワークが同じにならないことだけを意識しましょう(後に続く説明を読めば分かると思います)。

なお、既存ネットワークに接続されるOpenWrtデバイスのSSH、LuCIの初期設定は以下の設定であるとします。 これはOpenWrtインストール直後のデフォルト設定です。

IPアドレス ユーザーID パスワード
192.168.1.1 root なし

※この記事で紹介する各種設定手順はOpenWrtの初期設定が全てインストール直後のデフォルト値であることを前提にしています。 そのため、読者の方が既にOpenWrtをRaspberry Piやその他の機器にインストールしており、複数の設定を施している場合はこの記事の内容が 当てはまらないかもしれませんので予めご了承ください。

LuCIによる無線LANアクセスポイント(AP)設定

はじめにアクセスポイント(AP)設定から紹介します。
今回も前回記事と同様に、Raspberry Piを純粋な無線LAN APとして、既存のネットワーク環境に加えてみようと思います。 加えた後のイメージ図は以下のようになり、Raspberry Piを通してスマホやPCがインターネットに繋がるようになります。

それではさっそく行ってみます。

[Wi-Fi設定]
まずはじめに、作業用PCのWebブラウザーでLuCIのWebUIを表示してみましょう。
作業用PCとRaspberry Pi3BをLANケーブルで接続し、作業用PC側のWebブラウザーのURL入力欄に「https://192.168.1.1」と入力してください。 問題がなければ、LuCIのログインページが表示されるはずです。

OpenWrtの初期設定では、LuCIのログインパスワードはありませんので、パスワード欄に何も入力せずにそのままLOGINボタンを押してください。 すると、次のようにWebUIのトップ画面が表示されます。

続いて、トップ画面のメニューバー「Network」をクリックし、プルダウンメニューから「Wireless」を選択します。

Wireless Overview項目にあるSSIDのEditボタンを押します。

Device Configuration項目のAdvanced SettingsタブにあるCountryCodeに「JP」を指定します。

これで、カントリーコードとして日本(JP)を指定できましたので、次はGeneral Setupタブに行き、Maximum Transmit Power (送信出力)を10dB(10mW)に指定します。※ここを間違えると電波法違反になりえますので注意してください。

これで、Wi-Fiの搬送波が発射できる最低限の設定が完了しました。

次はSSIDのセキュリティ設定をします。
今回も認証方式をWPA2 PSKとして設定します。
前回操作画面下部のInterface Configuration項目のWireless Securityタブをクリックし、 次の図のように設定、Saveボタンを押します。(keyはパスワードなので私の場合はutakamo1234としました。)

前の画面に遷移しますので、続いてEnableボタンを押し、WLANインタフェース(wlan0)を有効にしましょう。
※インストールしたOpenWrtのバージョンやリビジョン、デバイス環境によってはwlan0という名前ではないかもしれません。

以上により、基本的なWi-Fi設定は完了です。
詳しくは触れていませんが今回は、SSIDやチャネル設定などはデフォルト値をそのまま使っているため、関連設定をまとめると 次の表のようになります。

カントリーコードJP(日本)
送信出力10dB (10mW)
チャネル1ch (2401-2423MHz)
バンド幅20MHz (チャネルボンディングなし)
SSIDOpenWrt
認証方式WPA2 Personal
暗号方式AES
パスワード[ユーザー任意のパスワード]

これにより、作業用PCとRaspberry Pi3BがWi-Fi通信できるようになりました。
作業用PCとRaspberry Pi3Bを繋いでいたLANケーブルを外し、作業用PCのWi-Fi設定画面からRaspberry PiにWi-Fi接続してみてください。 ※デフォルトSSID名のOpenWrtが一覧に表示されているはずです。クリックしてパスワードを入力しましょう。

接続が成功すると、ネットワーク構成は次のようになります。

このとき、既存ネットワークに対して、Raspberry Pi3Bは独立した閉じたネットワーク192.168.1.0/24を管理する通信機器と なっています。そのため、次はネットワーク設定を施し、Raspberry Pi3Bが既存ネットワーク192.168.3.0/24に所属するようにします。

※ルーター設定を目的として読んでいた方はここからは「LuCIによるルーター設定」を見てください。

[ネットワーク設定]
ということで、APのネットワーク設定に入ります
WebUIのトップ画面のメニューバー「Network」のプルダウンメニューから「Interfaces」を選択します。

次に、interfaces項目上のLANのEditボタンを押します。

すると、LAN側のネットワークインタフェースの設定画面が表示されます。 今回は既存ネットワークにRaspberry PiをAPとして所属させたいので、LANインタフェースにDHCP Clientを指定してSaveボタンを押します。

前の画面に戻ってきたら、次にSave & Applyボタンを押します。

最後に確認画面が表示されますので、Apply and keep settingsボタンを押してネットワーク設定を反映させます。

以上により、AP用のネットワーク・Wi-Fi設定は全て完了です。

Raspberry Pi3BとメインルーターのホームゲートウェイをLANケーブルで繋いでください。
これにより、ネットワーク構成が上記で示したものとなり、Raspberry Pi3BとWi-Fi接続している作業用PCはインターネットにアクセスできるようになります。 youtubeでも開いて確認してみてください。

正常に通信できていることが確認出来たら、次はタイムゾーンを設定します。

タイムゾーン設定に入る前に! IPアドレス変更後のOpenWrtデバイスにアクセスしよう!

上記までで紹介したアクセスポイント用ネットワーク設定の適用によって、OpenWrtデバイスであるRaspberry Pi3BのIPアドレスは 192.168.1.1/24ではなくなり、LuCIにアクセスできなくなる可能性があります。

これは、ここまでのネットワーク設定の変更適用によって、ホームゲートウェイのDHCPサーバーによる動的なIPアドレス付与をRaspberry Pi3Bが受け付けるからです。 (この記事の例ではホームゲートウェイが192.168.3.1/24なので、DHCPサーバーのIPアドレス付与範囲の制限がなければ、Raspbery Pi3BのIPアドレスは192.168.3.2~192.168.3.254/24のどれかになります。)

そのため、次に紹介するタイムゾーン設定ページをWebブラウザに表示するには、ホームゲートウェイのDHCPサーバーによってRaspbery Pi3Bに付与されたIPアドレスを特定する必要があります。 そして、Google ChromeなどのWebブラウザのURL入力欄に特定したIPアドレス(例えば192.168.3.80/24であれば、https://192.168.3.80)を入力してLuCI(WebUI)に再びアクセス、タイムゾーン設定ページに遷移してください。

アクセスポイント設定後のIPアドレスの特定は前回記事に掲載した覚えておこう! アクセスポイントを探索する方法を参照してください。 予めRaspbery Pi3BのWlanインタフェース(例えば、wlan0)のMACアドレスを知っていると探しやすいですが、リストアップされた使用中IPアドレスに対して、Webブラウザで片っ端からアクセスしてみても良いと思います。

上の説明に従ってRaspberry Pi3BのLuCIに再度アクセスできたでしょうか?それでは短いですが、タイムゾーン設定について説明します。

WebUIトップ画面のメニューバー「System」のプルダウンメニューから「Overview」を選択してください。

表示された設定画面の中のTimezoneをAsia/Tokyoにし、Save&Applyボタンを押してください。

これで、ルーターとして動作させるためのすべての設定は完了です。

LuCIによるルーター設定

次はルーターのネットワーク・Wi-Fi設定を紹介します。
今回も前回記事と同様に、ルーターとして使用するために、既存ネットワーク192.168.3.0/24に対し、Raspberry PiのLAN側で新たなネットワーク192.168.4.0/24を管理させます。 そして、Raspberry PiのWAN側を192.168.3.0/24に所属させることで2つのネットワークが物理的に接続される状態にします。

Rasberry Piをルーターとして既存ネットワーク環境に加えた結果は以下の図のようになります。

注意:今回取り上げるルーター設定は二重ルータ環境下での実施を前提とします。 つまり、OpenWrtをインストールした機器をメインルーターとして使用したい場合は、 この記事で取り上げる内容に加え、ファイアウォールによるセキュリティ対策が必要です。 今回は敢えて二重ルーターとしてRaspberry Pi3Bを配置することでメインルーター(ホームゲートウェイ)にセキュリティを担保してもらってます。

[Wi-Fi設定]
ということで、設定手順に入ります。
Wi-Fi設定は前節のLuCIによる無線LANアクセスポイント(AP)設定と全く同じですのでこれを省略し、ネットワーク設定のみを取り上げます。

[ネットワーク設定]
実施条件:上記の案内によりWi-Fi設定を実施して、作業用PCをRaspberry Piに無線接続した上で以降の説明に従ってネットワーク設定をしてみてください。 ネットワーク設定実施後は、Raspberry Piとホームゲートウェイ(メインルーター)をLANケーブルで繋いで通信確認をしてみてください。 ※逆に、ネットワーク設定が完了するまではLANケーブルを繋がないでください

ルーターのネットワーク設定では、まずはじめにWebUIのトップ画面のメニューバー「Network」のプルダウンメニューから「Interfaces」を選択します。 ※AP設定と同じく、WebブラウザのURL欄に「https://192.168.1.1」と入力することでWebUIにログインできます。

次に、interfaces項目のLANにあるEditボタンを押します。

すると、LANのネットワークインタフェースの設定画面が表示されます。 今回はRaspberry Pi3BをWi-Fiルーターとして動作させ、LAN側(192.168.4.0/24)でWi-Fi無線を使用したいので、 WLANインタフェースを表すwlan0をDeviceに、Raspberry Pi3B自身のLAN側IPアドレスを192.168.4.1(サブネットマスク:255.255.255.0)に設定します。

※インストールしたOpenWrtのバージョンやリビジョン、またはOpenWrtデバイス環境によってはWLANインタフェースの名前がwlan0ではないかもしれません。

設定ができたらSaveボタンを押します。
これでRaspberry Pi3BのLAN側ネットワーク設定は完了です。

次はWAN側のネットワーク設定をしてみます。はじめに、Interfaces項目下部にあるAdd New Interfaceボタンを押します。

インタフェース設定画面が表示されますので次のように指定し、Create Interfaceボタンを押します。

これによりwanインタフェース(eth0)が作成されますので、次はwanインタフェースのEditボタンを押します。
表示された設定画面の各項目を次のように指定し、Saveボタンを押してください。

前の画面に戻ってきたら、そのままSave&Applyボタンを押し、続いてApply and keep settingsボタンを押します。

これにより、WAN側のネットワーク設定も完了です。 さっそくインターネットに接続してみましょう。 LANケーブルでRaspberry Pi3Bとホームゲートウェイ(メインルーター)を繋いだ上で、作業用PCとRaspberry Pi3BをWi-Fi接続してください。

※設定適用により、現在のWi-Fi接続状態だと上手く通信できない可能性があります。 上手くいかない場合はWi-Fiを一旦切り、再接続するか、少しの時間待つか、作業用PCまたはRaspberry Piを再起動してみてください。

Raspberry PiのLAN側IPアドレスは192.168.4.1に変更されますので、以降、WebUIには 「https://192.168.4.1」でログインできます。

正しく設定が出来ている場合、次のようにwanインタフェースにMACアドレスやIPアドレスなどが割り振られます。 特に、IPアドレスに関してはホームゲートウェイ(メインルーター)が管理するネットワーク192.168.3.0/24に所属しているため (今回、私の環境では192.168.3.11ですね)、 これによってWAN側とLAN側で通信できるようになったことが分かります。

以上より、ネットワーク構成が上の図のようになりました。

作業用PC側のWebブラウザでyoutubeでも開いてインターネットにアクセスできているか確認しましょう。

正常に通信できていることが確認出来たら、次はタイムゾーンを設定します。
WebUIトップ画面のメニューバー「System」のプルダウンメニューから「Overview」を選択してください。

表示された設定画面の中のTimezoneをAsia/Tokyoにし、Save&Applyボタンを押してください。

これで、ルーターとして動作させるためのすべての設定は完了です。

WeuUIとUCIシステムの関係性

これまで、LuCIによるネットワーク・Wi-Fi設定について紹介してきました。 LuCIがユーザービリティに富んだ設定画面をエンドユーザーに提供することで、目的とする設定が容易にできることを感じて頂けたかと思います。 特に、UI上で設定項目を表示することでOpenWrtを知らない人でも各設定についてある程度の勘を働かせることができます。

このことを単純に言ってしまえば「OpenWrtは使いやすいWebUI(設定画面)を持っている」ということになります。 しかし、これらの設定画面によって提供されるユーザービリティはその下のレイヤーによる抽象化設計の恩恵あってのものです。

前回記事のUCIコマンドによるネットワーク・Wi-Fi設定のように、本来、OpenWrtのネットワーク・Wi-Fi制御用アプリケーションは UCIシステムにより管理されているUCIコンフィグレーションファイルを設定値として読み込み、動作しています。

UCIコンフィグレーションファイルはUCIコマンドで編集できますので、もしLuCIによるWebUIがなければユーザーは設定値の変更・追記・削除を UCIコマンドで直接行う必要があります。

しかし、これには問題が2つあります。

1つ目は、目的とするネットワーク・Wi-Fi設定をするのにユーザー自身がUCIシステムの仕組みとUCIコマンドの使い方を理解する必要があることです。

UCIシステムが管理するUCIコンフィグレーションファイルには論理階層が存在し、まず1つの関連設定を 束ねるコンフィグレーションファイル自身、それをさらに細分化したセクション、そしてセクションにぶら下がる形でオプション、リストと呼ばれる階層が存在します。 前回記事では上記の論理階層を持ったUCIコンフィグレーションファイルを単に「networkコンフィグ」、「wirelessコンフィグ」と呼んでいたわけです。

一方、UCIコンフィグレーションファイルを操作するUCIコマンドでは、データの変更・追記をするsetコマンド、削除をするdeleteコマンド、一度ステージングされたデータを消去するrevertコマンド、 静的データとしてステージングデータを確定するcommitコマンドなどがあり、それぞれのコマンドは適切な状況で使用される必要があります。

このように、もしWebUIがなければ、ネットワーク・Wi-Fi設定をしたいだけのエンドユーザーは、これらの仕組みや使い方を理解する必要があります。 一般ユーザーとしてOpenWrtを使用するという点に着目してみれば、これは学習コストが高く、乗り越えるのが大変な障壁です。

2つ目は、あまりにも設定が細かいことです。
UCIコンフィグレーションファイルはアプリケーションが読み込む設定値ですので、ユーザー視点で各設定値を見た場合、「こんなこともわざわざ指定してあげなくちゃいけないのか」 という感想を抱くでしょう。例えば、タイムゾーン設定では、WebUI上でTimeZoneをAsia/Tokyoに指定してあげれば済む話ですが、UCIコマンドでの手動設定ではTimeZone の他に日本標準時を示すJST-9を指定しなければいけません。

このように、エンドユーザーとしてOpenWrtのネットワーク・Wi-Fi設定をしたいと考えた場合、UCIコマンドでの手動設定はどうしてもプリミティブすぎます。

出来れば意識する必要のない固有システムの設定はシステム自身が自動でやって、ネットワーク・Wi-Fi設定の本質部分だけをUI経由でエンドユーザーは弄りたいはずです。

このような考えから作り出されたのがWebUIであり、OpenWrtではLuCIが実装し、提供します。
LuCIのシステム内部の役割はWebUI上で設定された値を基に、ユーザーに代わってUCIコンフィグレーションファイルをUCIコマンドを利用して操作することです。 (ただし、LuCIが使用するUCIコマンドはRPC対応版の別バイナリ(/sbin/rpcd)です。)

つまり、上に掲載した図にあるようにユーザーとUCIシステムの間をLuCIが仲介することで、ユーザーがUCIシステムやUCIコマンドを学習しなくて済むように取り計らってくれています。 このように、細かい設定はエンドユーザーに意識させないようにLuCIにより抽象化(または隠ぺい)し、本当に大事な設定項目のみをWebUIとして提供することが非常に重要です。

また、このようなWebUIは、どんなエンドユーザーを想定して開発されるかが重要になります。例えば、OpenWrtデバイスの製品化を考えた場合、想定するエンドユーザーに ネットワークに関する高いリテラシーを求めないようであれば、誰でも設定できるようなサービスになるまで抽象度を上げ、詳細設定はできないけどLANケーブルでONUに接続すれば取り合えずはインターネット を利用できるようにするのが得策でしょう。この場合、LuCIのようなCGIシステムとWebUIが実現するサービスの抽象度、詳細設定の隠ぺい性も高くなります。

対して、想定エンドユーザーを「ネットワークリテラシーが高い人」とすれば、サービスの抽象度は低くなります。より詳細で細かい設定ができることで、ネットワークに関する知識がある 人なら自身の環境に最適な設定を選ぶことができ、製品に対する満足度は高くなるでしょう。ただしその代わり、ネットワークの知識がない人にはちんぷんかんぷんな製品になります。

以上のような、考えを巡らせてOpenWrtのLuCIが提供するWebUIについて評価すると、私としてはLuCIが想定するエンドユーザーは 「ネットワークエンジニアレベルの知識を持ったユーザー」であると感じます。Wi-Fi設定ではカントリコードから送信出力、バンド幅まで指定させ、 ネットワークに至ってはDS-LiteやPPPoE認証などの設定をユーザー側に任せています。

詳細な設定ができるため、ネットワークの知識がある人から見れば非常に遊びがいのあるものなのではないでしょうか。 また、それゆえにネットワーク関連の研究をしている人たちからも重宝されそうです。

このように抽象化設計を各レイヤーで行って最終的なサービスをエンドユーザーに提供しているのが、 今日のシステム製品であり、その1つがAP・ルーター機器用LinuxディストリビューションのOpenWrtです。

ちなみにですが、上記の図にもあるように実はUCIシステムが持つUCIコンフィグレーションファイルはさらに下のレイヤーを抽象化したものです。 OpenWrtの構造をさらに調べると上の図のような3層構造が見えてきます。

UCIコンフィグレーションファイルを読み込んだnetifdのアプリケーションはHardwareに働いてもらうために、SOCなどのチップと対話するHardware Interfaceを内部で使用しています。 Wi-Fi関連の設定部分に着目すれば、Hardware Interfaceを介する設定はWi-Fiの変調方式(QAMやOFDM)や802.11フレーム(フラグメント、ブロックアック、MTU)など、 よりプリミティブなものです。この部分を扱う場合、必要な知識は無線通信理論、IEEE802.11やWiFiアライアンスのWi-Fi規格に関する知識、各チップ仕様など多岐に渡ります。

このようにレイヤーが深くなればなるほど、そこで取り扱われる設定はより詳細で具体的で複雑であり、開発者には高い専門性が必要になります。 逆に言えば、複雑なあれやこれを専門のエンジニアが抽象化してサービスを提供してくれるからこそ、エンドユーザーの人たちが容易にAP・ルーター設定ができるようになります。 システムを通してエンジニアとユーザーが繋がっているわけですね。(上図に開発者を描いているのはそういう意味でもあります。)

2024/3/30追記:LuCI対応アプリケーションを作ってみよう!

LuCIに対応したOpenWrtアプリケーションの開発方法を紹介した記事を掲載します。本記事に掲載した内容および各実装知識を基に、 作成した記事になります。

興味があればご参考ください。

  1. OpenWrtアプリケーション開発 LuCI用カスタムページの作成と追加(難易度Lv1)
  2. OpenWrtアプリケーション開発 自作スクリプトと連携するLuCI用カスタムページの作成と追加(難易度Lv2)[作成中]
  3. OpenWrtアプリケーション開発 自作UBUS対応アプリと連携するLuCI用カスタムページの作成と追加(難易度Lv3)[作成中]

おわりに

今回は、LuCIによるネットワーク・Wi-Fi設定をしてみました。
この記事を通して、サービスの抽象化とは何かについても一定の理解をしてもらえたら幸いです。

次は、OpenWrt専用アプリケーションの作成方法について書いていきたいと思います。
このブログ、誰が読んでいるか分かりませんが、次回から本格的にアプリを作りますので参考にしていただければと思います。