うたカモ技術ブログ

Linux OpenWrt ネットワーク

【第 3 回】 OpenWrt開発入門   UCIコマンドによるネットワーク・Wi-Fi設定

post:     update: 

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

前回 は、OpenWrt公式リポジトリからSDKをダウンロードし、OpenWrtファームウェアイメージをビルドして Raspberry Pi3Bにインストールしてみました。

しかし、このときのRaspberry Piのネットワーク・Wi-Fi初期設定ではインターネット接続もWi-Fiによる無線通信もできません。

そこで今回は、OpenWrt専用のUnified Configuration Interface(以下、UCI)コマンドを利用した無線LANアクセスポイント(AP)とルーターのネットワーク・Wi-Fi設定をそれぞれ紹介します。 ※なお、今回のネットワーク設定はIPv4が対象です。

これを通して、UCIコマンドによる設定方法に関しても一定の理解をして頂けたら幸いです。 UCIコマンドをインタフェースとして持つUCIシステムの仕組みについても説明しますのでよろしくお願いします。

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

目次

  1. 実施環境と補足事項について
  2. OpenWrtのネットワーク初期設定
  3. UCIコマンドによるアクセスポイント(AP)設定
  4. 覚えておこう! アクセスポイントを探索する方法
  5. UCIコマンドによるルーター設定
  6. UCIシステムの仕組み
  7. おわりに
  8. その他の関連記事
  9. 参考文献

実施環境と補足事項について

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

※とは言え、Wi-Fi設定についてはデバイスに搭載されているRFチップに依存する箇所があるため、紹介する設定が全てのデバイスで通用する保障はありません。 OpenWrtコントリビューターの方々が標準的なOpenWrtのWiFi設定にどこまで合わせてくれるかが鍵になります。 その点、Raspberry Pi用の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

また、記事内で紹介するコンソール表記は次の通りです。

作業用PCのコンソール表記
ユーザー名とカレントディレクトリを色付けして表記します。
user:~/openwrt$ command
OpenWrtのコンソール表記
ユーザー名はroot@OpenWrtです。
root@OpenWrt:~# command

OpenWrtのネットワーク初期設定

前回の記事 でOpenWrtをインストールしたRaspberry Piは、そのままではインターネット接続も無線通信(Wi-Fi) もすることが出来ない状態です。

できることは、LANケーブルを介したRaspberry PiとPCの2者間通信のみです。

このとき、Raspberry Piのネットワーク初期設定を見ると、自身に対しては固定IPアドレス(192.168.1.1/24)を割り当て、LANケーブルを介して ネットワーク接続をしてきた機器(PC)には、192.168.1.2~192.168.1.254/24の範囲でIPアドレスを割り当てるようになっています。

そのため、Raspberry Piは、ワイヤレスHubとしてのAPやネットワーク間通信をするルーターの動作はできないものの、ネットワーク192.168.1.0/24 を管理できる通信機器となっています。

言い換えると、「完全に独立した1つのネットワークしか形成できない」のでこのままでは意味がありません。

しかし、この閉じたネットワークでRaspberry Piは、少なくとも1台のPCとネットワーク通信をすることができ、 起動時にSSHサーバーのdropbearが自動起動(status: Running)されるようになっています。

そのため、LANケーブルを介してRaspberry Piと繋がった作業用PCはSSH接続をすることが可能です。

SSH接続に必要なRaspberry Pi側のネットワーク・ログインパスワード初期設定は以下のようになっています。

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

以上から、作業用PC側のコンソール上で次のSSHコマンドを実行すると、Raspberry Piにログインできます。

kamo@kamo:~$ ssh 192.168.1.1 -l root

ログイン後は、次のOpenWrtコンソール画面が表示されます。

この記事では、このコンソール画面を通してUCIコマンドによるAP・ルーター別のネットワーク・Wi-Fi設定をそれぞれ紹介します。

前提環境として、今回は以下のネットワーク環境にOpenWrtがインストールされたRaspberry Piを接続し、AP・ルーターそれぞれの設定をしてみます。

この記事を参考にする際は、上記のネットワーク環境をご自身の環境に置き換えて見てください(※)。

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

なお、ホームゲートウェイ(メインルーター)はDHCPサーバーとして動作しているものとします。読者ご自身が家電量販店で購入したルーター、またはインターネットサービスプロバイダー(ISP)との契約で 貸与・提供されたルーターをホームゲートウェイとして使用している場合、初期設定でDHCPサーバーが有効になっているのが普通です。そのため、このことに関しても意識する必要はありません。 (この記事の内容通りにやっても接続できないという場合に確認してみてください。)

UCIコマンドによるアクセスポイント(AP)設定

まず始めに、Raspberry Piを無線LANアクセスポイント(AP)として動作させるための設定について紹介します。

今回は、Raspberry Piを純粋な無線LAN APとして、既存のネットワーク環境に加えてみようと思います。 加えた後のイメージ図は以下のようになり、Raspberry Piを通してWi-FiでスマホやPCがインターネットに繋がるようになります。

それでは、さっそく作業用PCでRaspberry PiにSSH接続をして設定していきましょう。

[Wi-Fi設定]
OpenWrtの設定はLuCIと呼ばれるWebUIを除けば、UCIコマンドを使用して変更します。

UCIコマンドとはOpenWrt専用アプリケーションの環境変数であるUCIコンフィグレーションファイルを操作するユーティリティツールです。 このUCIコマンドを通して、今回は無線設定を変更してみます。

OpenWrtの無線設定はwirelessという名称のUCIコンフィグレーションファイル(コンフィグとも言います)で管理されています。 このコンフィグの中身は、次のUCIコマンドで見ることができます。

root@OpenWrt:~# uci show wireless

結果として、wirelessコンフィグに管理されているパラメーター群が次のように表示されるはずです。

この中で、無線LANアクセスポイント(AP)として動作をさせるために変更を加えるパラメーターは以下の2つ、

  1.  wireless.radio0.disabled
  2.  wireless.default_radio0.encryption

そして、新たに追加するパラメーターは以下の3つです。

  •  wireless.radio0.country
  •  wireless.radio0.txpower
  •  wireless.default_radio0.key

まず1つ目のwireless.radio0.disabledはWi-Fi機能の有効無効を指定するパラメーターです。 OpenWrtがインストールされたときは、その機器がどこの国で使用されるか不明なため、周辺の重要無線通信インフラを 妨害しないように無線機能がこのパラメーターにより無効化されています。

そのため、無線機能を有効化するには以下のようにUCIコマンドを使用して、wirelss.radio0.disabledを無線機能の有効化を示す0に 書き換え、加えてカントリーコードであるwireless.radio0.countryを日本(JP)に、送信出力のwireless.radio0.txpowerを10dBmに設定します。
※カントリーコード(countrycode)と送信出力(txpower)は今回、wirelessコンフィグに新規追加するパラメーターです。両者の設定を間違えた場合は 電波法違反になりえますので注意してください。

root@OpenWrt:~# uci set wireless.radio0.disabled=0
root@OpenWrt:~# uci set wireless.radio0.country=JP
root@OpenWrt:~# uci set wireless.radio0.txpower=10

2つ目はWi-Fiのセキュリティ認証を指定するパラメーターです。 これらのパラメーターはデフォルトでは認証なしの設定値のため、このままWi-Fiを動作させてしまうとただのFree Wi-Fi Spot(HotSpot)になってしまいます

そこで、今回はWi-Fi認証方式をWPA2-PSK(AES)とし、対応するパスワードを次のように設定してみます。

root@OpenWrt:~# uci set wireless.default_radio0.encryption=psk2
root@OpenWrt:~# uci set wireless.default_radio0.key=[パスワード(英数字+特殊文字で8~63文字)]

このようにすることで、スマホなどがWi-Fiに接続する際にパスワードを聞かれるようになります。そして、正しいパスワードを入力した端末に限り、Wi-Fi接続が許可されます。

ここまでで、無線通信のパラメーター変更はひとまず完了です。
以下のコマンドでパラメーター変更を確定します。

root@OpenWrt:~# uci commit wireless

後は設定をOpenWrtに適用するだけです。 次のコマンドで適用してみましょう。Wi-Fiが使用できるようになります。

root@OpenWrt:~# /etc/init.d/network reload

※これで上手く行かなかった場合は「/etc/init.d/network restart」かOpenWrtデバイスを再起動してください。

上記のコマンドで、OpenWrtのネットワーク制御用アプリケーションであるnetifdに設定値のリロードを要求しました。 これにより、netifdがパラメーターを読み込み直し、ネットワーク・無線通信制御をすることで設定内容が反映されます。

今回は詳しくは触れていませんが、SSIDやチャネル設定などはデフォルト値をそのまま使っているため、関連設定をまとめると 次の表になります。上記のコマンド実行により、この設定内容でWi-Fiが動作します。

カントリーコードJP(日本)
送信出力10dB (10mW)
チャネル1ch (2401-2423MHz)
バンド幅20MHz (チャネルボンディングなし)
SSIDOpenWrt
認証方式WPA2 Personal
暗号方式AES
パスワード[ユーザー任意のパスワード]
WLANインタフェース名wlan0
所属ネットワーク設定network.lan(192.168.1.1/24)

それでは、Wi-Fi通信ができているか確認してみましょう。
ifconfigコマンド(またはip a)でRaspberry Piのネットワーク接続状態を確認してください。
すると、次のように新しくwlan0と呼ばれるNICが表示されるはずです(他のOpenWrtバージョンやリビジョン、もしくはインストールしたデバイスによっては名前が異なる可能性があります)。

これは、デフォルトでWLANインタフェースに割り当てられるNIC名です(※逆に、有線LANはeth0とかですね)。この記事で使用しているRaspberry Pi3Bでは2.4GHzのRF(Radio Frequency)チップが使われていますので、 これにより、Wi-Fi(2.4GHz)が使用できることが分かります。 そのため、Linux、Windows、MacOS、Androidなど、何でも良いのでワイヤレス接続設定画面を開いてみてください。次のようにOpenWrtのSSID名が表示されるはずです。 ※下の画像はUbuntu22.04のワイヤレス接続画面の例です。

選択すると認証パスワードが聞かれるので、正しく入力して接続を試みます。

これで、接続ができました。
この時のネットワーク環境をイメージで図で表すと次のようになります。

Raspberry PiとPCがLANケーブルの代わりにWi-Fiによる無線LANで繋がっています。
もちろん、スマホや他PCなどの複数台接続にも対応しています。

しかし、まだ単独の閉じたネットワーク192.168.1.0/24内で通信をしている状況ですので、既存のネットワーク192.168.3.0/24にRaspberry Piを 所属させる必要があります。

[ネットワーク設定]
ということで、次はネットワーク周りの設定をしていきましょう。

※このときに、LANケーブルを介してRaspberry PiとSSH接続していた作業用PCをWi-Fi接続に切り替えてください。 そして、LANケーブルをRaspberry Piから外し、ネットワーク設定が完了するまでそのままにしてください。

OpenWrtのネットワーク設定はnetworkコンフィグで管理されています。
wirelessコンフィグのときと同じように、UCIコマンドでnetworkコンフィグを見てみます。

root@OpenWrt:~#: uci show network

すると、次のようなネットワークの関連設定が記載されていることが分かります。

今回はその中でも、IPアドレス設定のパラメーターを変更します。
パラメーター変更により、Raspberry Piに192.168.1.1/24の固定IPアドレスを割り当てず、既存ネットワーク上のホームゲートウェイ から動的IPアドレス割り当て(DHCP)を受けるようにします。

固定IPアドレスもしくは動的IPアドレスかを決める設定パラメーターはnetwork.lan.protoです。 デフォルトの設定値は固定IPアドレスを示す'static'のため、これを'dhcp'に変更することでホームゲートウェイからの動的IPアドレス割り当てを 受け付けるようにします。

root@OpenWrt:~# uci set network.lan.proto=dhcp

このとき、network.lan.protoの前回値('static')に依存する固定IPアドレスとサブネットマスクのパラメーターが存在しますので、 ついでに削除します。削除はuci deleteで実行できます。

※本当のところ、uci deleteは実施しなくてもOKです。 使わない設定を残しておくのが煩わしいと思う方は次のコマンドを実行してください。 なお、今後設定変更の可能性がある場合は残しておくのがベストです。

root@OpenWrt:~# uci delete network.lan.ipaddr
root@OpenWrt:~# uci delete network.lan.netmask

ネットワーク設定は以上です。
wirelessコンフィグのときと同じく、次のコマンドでパラメーター変更を確定しましょう。

root@OpenWrt:~# uci commit network

上記のコマンドを実行し終えたら、ここでifconfigコマンド(またはip a)などを使用してeth0/br-lanのMACアドレスをメモしてください。 このメモを頼りに次節で紹介する方法でAP化した後のOpenWrtデバイスを発見し、SSH接続ができます。

準備が済んだら、次のコマンドでRaspberry Pi3B側のDHCPサーバーのOFFとネットワーク設定の適用をしてください。

root@OpenWrt:~# uci set dhcp.@dnsmasq[0].disabled=1
root@OpenWrt:~# uci commit dhcp
root@OpenWrt:~# /etc/init.d/dnsmasq restart
root@OpenWrt:~# /etc/init.d/network restart

※ここで上手く行かなかった場合は、OpenWrtデバイスを再起動してください。

これで無線LANアクセスポイント(AP)としてRaspberry Piが動作するはずです。 さっそく、LANケーブルでRaspberry Piとホームゲートウェイ(メインルーター)を繋げてみてください。

ホームゲートウェイが管理するネットワーク192.168.3.0/24にRaspberry Piが所属することでネットワーク構成が上の図となり、Raspberry PiとWi-Fiで繋がっているスマホやPCがインターネット に接続できるようになるはずです。試しに、youtubeでも表示させて確認してください。

正常にネットワーク通信ができることを確認したら、最後にタイムゾーン設定をしましょう。

アクセスポイント設定適用後のOpenWrtデバイスに再接続しよう

ここまでに説明したアクセスポイント用ネットワーク設定を適用すると、OpenWrtデバイスであるRaspberry Pi3Bの IPアドレスが変更されます。

これはホームゲートウェイのDHCPサーバーからのIPアドレス付与をRaspberry Pi3Bが受け付けるからです。 そのため、もう一度SSH接続をしてコンソールログインをするには変更後のIPアドレスを特定する必要があります。

変更後のIPアドレスは次節の覚えておこう! アクセスポイントを探索する方法 を参照して特定してみてください。

特定した変更後のIPに対して、再度SSH接続をした上で以下のタイムゾーン設定を実施してください。

次のコマンドでタイムゾーンを日本(JST-9)にしてください。

root@OpenWrt:~# uci set system.@system[0].zonename=Asia/Tokyo
root@OpenWrt:~# uci set system.@system[0].timezone=JST-9
root@OpenWrt:~# uci commit system
root@OpenWrt:~# /etc/init.d/system reload

dateコマンドを実行して日本時間が表示されれば、正常に設定ができています。
これでOpenWrtデバイスをAPとして利用するためのネットワーク・Wi-Fi設定は全て完了となります。

補足

WANとLAN・WLANインタフェースのブリッジ設定について知りたい方は【第 8 回】OpenWrt開発入門 Coffee Break-WLANとLANインタフェースのブリッジ設定について を参照してみてください。

覚えておこう! アクセスポイントを探索する方法

DHCPサーバーによって動的にIPアドレスを割り当てられた、OpenWrtデバイスにSSH接続(またはWebUIアクセス)をしたい場合は、そのIPアドレスを特定する必要があります。 そんなときは、OpenWrtデバイスとWi-Fi接続をしている作業用PC側(Linux OS)のコンソール上で以下のコマンドを実行して所属ネットワークをスキャンしてください。

kamo@kamo:~$ nmap -sP [対象ネットワーク]/[サブネットマスク]

私のRaspberry Piは前節までの操作により、192.168.3.0のネットワークに所属しており、サブネットマスクは255.255.255.0(=24)です。 そのため、以下のようにコマンドを入力することで、ネットワーク192.168.3.0/24上のホストをスキャンできます。

kamo@kamo:~$ nmap -sP 192.168.3.0/24

指定ネットワーク上の全ホストのARPテーブル(MACアドレスとIPアドレスの対応表)が取得できますので、 続けて今度は以下のコマンドを実行してみてください。

kamo@kamo:~$ arp -a

次のように、ARPテーブルの一覧が表示されるはずです。

この中から、予めメモをしておいたRaspberry Piのネットワークインタフェースeth0/br-lanのMACアドレスと同じものを探します。 そして、そのMACアドレスに対応するIPアドレスに対してSSH接続を試みます。今回、私の環境では192.168.3.10がRaspberry PiのIPアドレスでしたので、そちらにSSH接続をしてみます。

Raspberry PiのIPアドレスが分からなくなっても、この方法で発見しましょう。

UCIコマンドによるルーター設定

ここでは、Raspberry Piをルーターとして動作させるための設定について紹介します。
ルーターとしてのネットワーク設定だけでなく、AP機能でスマホやPCとも無線接続したいのでWi-Fi設定につていも紹介します。

今回の場合ではルーターとして使用するために、既存ネットワーク192.168.3.0/24に対し、Raspberry PiのLAN側で新たなネットワーク192.168.4.0/24を管理させます。 そして、Raspberry PiのWAN側を192.168.3.0/24に所属させることで2つのネットワークが物理的に接続される状態にします。

これにより、Raspberry PiとWi-Fi接続しているスマホやPCはネットワークを跨いでインターネットを利用することが可能となります。

注意:このネットワーク構成は俗にいう2重ルーター環境です。今回はお試しということでこの環境を意図的に構築します。OpenWrtデバイスをメインルーターとして 使用したい場合はこの記事で紹介する設定に加え、ファイアウォールとパスワードなどのセキュリティ設定、PPPoE認証などのプロバイダ(ISP)設定も必要です。今回は、2重ルーターとして配置することで、 ISPプロトコルなどの通信をホームゲートウェイ(メインルーター)側に任せ、セキュリティも担保してもらっています。

[Wi-Fi設定]
それでは、Wi-Fi設定から始めましょう。各設定パラメーターについては前節の「UCIコマンドによるアクセスポイント(AP)設定」で説明していますのでサクサク進めたいと思います。

Wi-Fiの設定は、はじめに以下のコマンドを実行します。

root@OpenWrt:~# uci set wireless.radio0.disabled=0
root@OpenWrt:~# uci set wireless.radio0.country=JP
root@OpenWrt:~# uci set wireless.radio0.txpower=10
root@OpenWrt:~# uci set wireless.default_radio0.encryption=psk2
root@OpenWrt:~# uci set wireless.default_radio0.key=[パスワード(英数字+特殊文字で8~63文字)]

続けて次のコマンドで、上記のパラメーター変更を静的データとして確定します。

root@OpenWrt:~# uci commit wireless

そして最後に、次のコマンドで上記の設定変更をアプリケーションに適用します。

root@OpenWrt:~# /etc/init.d/network reload

※これで上手く行かなかった場合は「/etc/init.d/network restart」かOpenWrtデバイスを再起動してください。

これでWi-Fi機能が有効になりました。

ifconfigコマンド(またはip a)でインタフェース一覧を表示してみると、wlan0と呼ばれるWLANインタフェースが表示されるようになります。 インストールしたOpenWrtのバージョンやリビジョンあるいはデバイスによってはwlan0という名前ではないかもしれません。

[ネットワーク設定]
次はネットワーク設定です。

※このときに、LANケーブルを介してRaspberry PiとSSH接続していた作業用PCをWi-Fi接続に切り替えてください。 そして、LANケーブルをRaspberry Piから外し、ネットワーク設定が完了するまでそのままにしてください。

Raspberry PiのLAN側(2.4GHz WiFiモジュール)でネットワーク192.168.4.0/24を管理させます。そして、Raspberry PiのWAN側(LANポート)がホームゲートウェイのネットワーク192.168.3.0/24に 所属するようにnetworkコンフィグのパラメーターを変更してみます。

まず、networkコンフィグの初期設定を確認してみます。

root@OpenWrt:~# uci show network

初期設定は次のように、Rasberry PiがLANを192.168.1.0/24で管理し、 自身のLAN側固定IPアドレスとして、192.168.1.1/24を割り当てるようになっています。 WANのネットワーク設定はありませんので、完全に閉じたネットワークです。

これに対して、以下のUCIコマンドを実行することでルーター用の設定に変更できます。

root@OpenWrt:~# uci set network.lan.device=wlan0  <--- OpenWrtのバージョン、リビジョン、インストールしたデバイスによってはwlan0ではない可能性があります。ifconfig、またはip aで確認してください。
root@OpenWrt:~# uci set network.lan.ipaddr=192.168.4.1
root@OpenWrt:~# uci set network.wan=interface
root@OpenWrt:~# uci set network.wan.device=eth0
root@OpenWrt:~# uci set network.wan.proto=dhcp

network.lan.deviceはRaspberry Piが管理するLANに対応するNICを指定しています。 今回はRaspberry Piが管理するLANは無線LANとして運用したいのでWLANインタフェースであるwlan0を指定しています。

network.lan.ipaddrではRaspberry Piの固定IPアドレスを192.168.4.1に設定しています。 また、このパラメーター設定と既存設定のnetwork.lan.netmask="255.255.255.0"により、 Raspberry Piが管理するLANが192.168.4.0/24に決定されます。

network.wanはWAN側のネットワーク設定を保存するためのデータです。
今回は深く取り上げませんが、これはUCIコンフィグレーションファイルの中でセクションと呼ばれるデータになります。

uci set network.wan='interface'とすることで、「type属性=interface、section名=wan」 の名前付きセクションを作成しています。WANに関するネットワーク設定を保持するパラメーター が存在しなかったため、親要素となるセクションを作成し、パラメーターを設定する準備をしています。 ※詳しく知りたい方は関連記事のOpenWrt UCIコマンドの使い方をお読みください。

WANのパラメーターはnetwork.wan.deviceとnetwork.wan.protoの2つです。前者はWANに対応するNIC、 後者は静的・動的IP設定を示します。

今回は、Raspberry PiのWAN側をLANケーブルを介してホームゲートウェイに接続し、 既存ネットワーク192.168.3.0/24に所属させる必要があるので、WANに対応するNICをLANポートを示す「network.wan.device=eth0」にし、 ホームゲートウェイのDHCPサーバーから動的IPアドレス割り当てを受けたいので「network.wan.proto=dhcp」としています。

ということで、上記のuci setによってパラメーター変更・追加がされたnetworkコンフィグは次になります。

設定ができていることを確認できたら、次のコマンドでパラメータ変更を確定します。

root@OpenWrt:~# uci commit network

最後に、以下のコマンドで設定を適用してみましょう。

前節のアクセスポイント設定に続けてルーター設定を実施している方は、以下のようにdnsmasqを有効にしてください。
root@OpenWrt:~# uci set dhcp.@dnsmasq[0].disabled=0
root@OpenWrt:~# uci commit dhcp
root@OpenWrt:~# /etc/init.d/dnsmasq restart
root@OpenWrt:~# /etc/init.d/network restart

※ここで上手く行かなかった場合は、OpenWrtデバイスを再起動してください。

これでルーターとしての最低限の設定が出来たはずです。
Raspberry PiのWAN側(LANポート)をLANケーブルでホームゲートウェイと繋げば、上図のネットワーク構成となります。
さっそく作業用PCをRaspberry PiにWi-Fi接続してみましょう。確認のため、youtubeでも開いてページが正しく表示されるか試してみてください。

正常にネットワーク通信ができることを確認したら、最後にタイムゾーン設定をしましょう。 上記で設定したLAN側ネットワーク(今回は192.168.4.1/24)で再度SSH接続ssh 192.168.4.1 -l rootをして、以下のコマンドでタイムゾーンを日本(JST-9)に設定します。

root@OpenWrt:~# uci set system.@system[0].zonename=Asia/Tokyo
root@OpenWrt:~# uci set system.@system[0].timezone=JST-9
root@OpenWrt:~# uci commit system
root@OpenWrt:~# /etc/init.d/system reload

dateコマンドを実行して日本時間が表示されれば正常に設定ができています。
これでルーターとして利用するためのネットワーク・Wi-Fi設定は全て完了です。

なお、今後ルーターとして運用しているOpenWrtデバイスにSSH接続したい場合は、LAN側に所属する通信機器(STA)から入ることができます。 今回の場合ではRaspberry PiのLAN側IPアドレスは192.168.4.1/24なので、接続機器(作業用PCなど)で以下のようにSSHコマンドを実行するとログインができます。

補足

今回取り上げたルーターのネットワーク設定はRaspberry Pi3B用に合わせたものです。 もっと一般的なインタフェース構成を持つルーター機器のネットワーク設定については【第 8 回】OpenWrt開発入門 Coffee Break-一般的なインタフェース構成に対応したルーターのネットワーク設定 を参照してみてください。

UCIシステムの仕組み

この記事ではUCIコマンドによるOpenWrtのネットワーク・Wi-Fi設定を紹介してきました。
UCIコマンドとは、OpenWrtアプリケーションが使用する専用の環境変数管理システム(UCIシステム)を操作するインタフェースです。

次の図に示すようにUCIコマンドを通して、UCIシステムにUCIコンフィグレーションファイルを出力(show)・取得(get)・追記(set)・削除(delete)・更新(commit)・キャンセル(revert) を促します。

UCIコマンドの特徴は、パラメーターの追加や削除などを含む変更をステージング領域(/tmp/.uci)に一時保存することです。 前節までのネットワーク・Wi-Fi設定で使用したuci setやuci deleteなどは変更差分を/tmp/.uci/~に保存する処理となります。

そして、uci commitによってステージング領域の変更差分をFLASH領域(/etc/config)にコピーすることで、データ変更を確定 します。uci commit実行後はステージング領域の該当データは消去されます。また、このときにuci commitの代わりにuci revertを実行すると、FLASH領域には何もコピーされずに 該当のステージング領域は消去されます。

通常、ステージング領域はRAM上に配置される領域です。そのため、 OpenWrtデバイスの電源断が発生すると保存していたデータは消去されます。

逆に、FLASH領域は電源断が発生してもデータが消去されることはありません。

では、何故このようなステージング領域とFLASH領域が存在するのでしょうか?
結局、パラメーター変更を静的なものとして確定する必要があるのなら、UCIコマンドによってパラメーター変更をしたら 直ぐに変更内容を/etc/configのFLASH領域に保存してしまえば良さそうに思えます。

実は、UCIコンフィグレーションファイルを環境変数として利用するOpenWrtアプリケーションはステージング領域の変更差分を お試し適用できる仕組みを持っています。

どういうことかと言うと、次の図に示すように、OpenWrt専用アプリケーションはステージング領域とFLASH領域のマージ 結果をパラメーター読み込み時に認識するということです。

パラメーター変更を確定(uci commit)する前に「/etc/init.d/network [reload or restart]」などを実行することで、ステージング領域 に保存された変更差分を対象のアプリケーションに一時的に適用することができます。

このときに問題があれば、OpenWrtデバイスの電源断もしくはrevertコマンド実行をすることで元の設定に戻ることが可能です。

ここまでの理解を助けるために、1つ例を出しましょう。
前節までで紹介したWi-Fi設定を次のようにしたとします。

root@OpenWrt:~# uci set wireless.radio0.disabled=0
root@OpenWrt:~# uci set wireless.radio0.country=JP
root@OpenWrt:~# uci set wireless.radio0.txpower=10
root@OpenWrt:~# uci set wireless.default_radio0.encryption=psk2
root@OpenWrt:~# uci set wireless.default_radio0.key=utakamo1234

すると該当するステージング領域の/tmp/.uci/wirelessには次の変更差分が保存されます。

また、この時にFLASH領域/etc/config/wirelessを見てみると、元のデータが保存されていることが分かります。

では、この状態のとき、uci show wirelessを実行するとどうなるでしょうか?
答えは次のようになります。

つまり、uci showは/tmp/.uci/wirelessと/etc/config/wirelessのマージ結果を出力します。
ここで重要なのは、uci showによって出力されるこのようなマージ結果をOpenWrtアプリケーションがパラメーター読み込み時に認識するということです。

これにより、uci commitをする前に「/etc/init.d/network [reload or restart]」などを実行すれば、仮決定されているパラメーター変更を現在のランタイム環境に適用する ことが出来ます。そして、正常な動作が確認できれば続けてuci commitによってパラメーター変更を静的なものとして決定し、以後は電源断をしても永続的な パラメーター設定としてアプリケーションは認識できるわけです。(ちなみに、今回紹介したネットワーク・WiFi設定は分かり切ったことなので先にuci commitをしています。)

このように、UCIコンフィグレーションファイルを管理することで、設定適用に対する柔軟性を実現しています。

UCIコマンドの説明は以上です。
今回の説明の補足がほしい方は第1回のUnified Configuration Interface(UCI System)でも取り上げていますので、 興味があればそちらもご確認ください。

なお、UCIコマンドの具体的な使い方については別の記事「OpenWrt UCIコマンドの使い方」を参照してください。

おわりに

今回は、OpenWrtデバイスをAP、ルーターとして動作させるためのUCIコマンドによるネットワーク・Wi-Fi設定について取り上げ、 UCIコマンドをインタフェースとして持つUCIシステムの仕組みについても説明しました。

次回はOpenWrtのWebUIであるLuCIを使ってネットワーク・Wi-Fi設定をする方法を紹介します。
設定方法の紹介後は、UCIコマンドとWebUIの関係性なども説明したいと思いますのでよろしくお願いします。

その他の関連記事

UCIコマンドに関する関連記事リンクをここに掲載します。

参考文献