OrangePi-PCを使ってみる

WiFiルーター(HotSpot)の構築


こ ちらにArmbianでのWiFiルーター(HotSpot)構築手順が公開されています。
Armbianでは非常に簡単にHotSpotを構築することができます。
試してみたところ、少し手順が違いました。
また、IPアドレスの変更方法なども併せて紹介します。

nmcliでデバイスを確認する

WifiドングルをUSBポートに刺して、以下のコマンドでTYPEにwifiのデバイスが現れることを確認します。
この時点でwifiのデバイスが出現しなければ、カーネルにドライバーが組み込まれていないので、
そのドングルは使えません。
$ nmcli d
DEVICE           TYPE      STATE         CONNECTION
eth0             ethernet  connected     Wired connection 1
wlx40a5efdb252f  wifi      disconnected  --
lo               loopback  unmanaged     --

今回使用したのはRTL8188EUSのWiFiドングルです。
非常に安定して動きます。
$ lsusb | grep Real
Bus 005 Device 002: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter

nmcliの接続情報を削除する

WiFiをステーションモードで使用しているときはNetwork Managerの接続情報を削除します。
$ nmcli connection show
NAME                UUID                                  TYPE             DEVICE
aterm-d5a4ee-g      4d3366e2-38ee-441b-a033-972afb6791f1  802-11-wireless  wlx40a5efdb252f

$ nmcli connection down aterm-d5a4ee-g
Connection 'aterm-d5a4ee-g' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)

$ nmcli connection show
NAME                UUID                                  TYPE             DEVICE
aterm-d5a4ee-g      0030f668-b368-4387-8acc-13643a088285  802-11-wireless  --

$ nmcli connection delete aterm-d5a4ee-g
Connection 'aterm-d5a4ee-g' (4d3366e2-38ee-441b-a033-972afb6791f1) successfully deleted.

HotSpotを構築する

armbian-configを起動し以下の手順でHotSpotを構築します。








ONEやZEROの様にオンボードWiFiが搭載されているモデルでは、USB-WiFiを使った方が安定して動きます。




これだけでWiFiルーターが完成します。
SSID=ARMBIAN、パスワード=12345678に接続すると、172.24.1.104のIPアドレスが払い出されます。
Wireless LAN adapter Wi-Fi 15:

   接続固有の DNS サフィックス . . . . .:
   説明. . . . . . . . . . . . . . . . .: Realtek 8811CU Wireless LAN 802.11ac USB NIC
   物理アドレス. . . . . . . . . . . . .: 00-13-25-AE-1D-3D
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   リンクローカル IPv6 アドレス. . . . .: fe80::ed92:aa99:b491:96cf%15(優先)
   IPv4 アドレス . . . . . . . . . . . .: 172.24.1.104(優先)
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   リース取得. . . . . . . . . . . . . .: 2021年8月3日 14:30:04
   リースの有効期限. . . . . . . . . . .: 2021年8月4日 2:30:04
   デフォルト ゲートウェイ . . . . . . .: 172.24.1.1
   DHCP サーバー . . . . . . . . . . . .: 172.24.1.1
   DHCPv6 IAID . . . . . . . . . . . . .: 1023415077
   DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-21-94-5D-B3-D4-3D-7E-47-4E-4E
   DNS サーバー. . . . . . . . . . . . .: 172.24.1.1
   NetBIOS over TCP/IP . . . . . . . . .: 有効

SSID、パスワードを変更する

HotSpotのSSID、パスワードはarmbian-configを使って変更することができます。








このスクリーンでSSIDとパスワードを指定します。


さらに細かな設定を変更したいときは<Advance>を使って、/etc/hostapd.confを編集します。


IPアドレスを変更する

armbian-configで設定したHotSpotは、172.24.1.1のIPアドレスとなります。
$ sudo ifconfig -a
wlx40a5efdb252f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.24.1.1  netmask 255.255.255.0  broadcast 172.24.1.255
        inet6 fe80::42a5:efff:fedb:252f  prefixlen 64  scopeid 0x20<link>
        ether 40:a5:ef:db:25:2f  txqueuelen 1000  (Ethernet)
        RX packets 475  bytes 118066 (115.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 98  bytes 12237 (11.9 KiB)
        TX errors 0  dropped 7 overruns 0  carrier 0  collisions 0

以下の手順で任意のIPアドレスに変更することができます。
今回は192.168.11.1に変更します。
$ sudo vi /etc/network/interfaces.d/armbian.ap.nat

<変更前>
# armbian NAT hostapd
allow-hotplug wlx40a5efdb252f
iface wlx40a5efdb252f inet static
        address 172.24.1.1
        netmask 255.255.255.0
        network 172.24.1.0
        broadcast 172.24.1.255

<変更後>
# armbian NAT hostapd
allow-hotplug wlx40a5efdb252f
iface wlx40a5efdb252f inet static
        address 192.168.11.1
        netmask 255.255.255.0
        network 192.168.11.0
        broadcast 192.168.11.255

これに合わせてDHCPの払い出し範囲も変更します。
$ sudo vi /etc/dnsmasq.conf

<変更前>
interface=wlx40a5efdb252f
listen-address=172.24.1.1
bind-interfaces
server=8.8.8.8
domain-needed
forward short names
bogus-priv
dhcp-range=172.24.1.50,172.24.1.150,12h

<変更後>
interface=wlx40a5efdb252f
listen-address=192.168.11.1
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=192.168.11.50,192.168.11.150,12h

再起動するとHotSportのIPアドレスが変わります。
$ sudo ifconfig -a
wlx40a5efdb252f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.1  netmask 255.255.255.0  broadcast 192.168.11.255
        inet6 fe80::42a5:efff:fedb:252f  prefixlen 64  scopeid 0x20<link>
        ether 40:a5:ef:db:25:2f  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 1 overruns 0  carrier 0  collisions 0

SSID=ARMBIAN、パスワード=12345678に接続すると、192.168.11.104のIPアドレスが払い出されま す。
Wireless LAN adapter Wi-Fi 15:

   接続固有の DNS サフィックス . . . . .:
   説明. . . . . . . . . . . . . . . . .: Realtek 8811CU Wireless LAN 802.11ac USB NIC
   物理アドレス. . . . . . . . . . . . .: 00-13-25-AE-1D-3D
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   リンクローカル IPv6 アドレス. . . . .: fe80::ed92:aa99:b491:96cf%15(優先)
   IPv4 アドレス . . . . . . . . . . . .: 192.168.11.104(優先)
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   リース取得. . . . . . . . . . . . . .: 2021年8月3日 14:43:54
   リースの有効期限. . . . . . . . . . .: 2021年8月4日 2:43:54
   デフォルト ゲートウェイ . . . . . . .: 192.168.11.1
   DHCP サーバー . . . . . . . . . . . .: 192.168.11.1
   DHCPv6 IAID . . . . . . . . . . . . .: 1023415077
   DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-21-94-5D-B3-D4-3D-7E-47-4E-4E
   DNS サーバー. . . . . . . . . . . . .: 192.168.11.1
   NetBIOS over TCP/IP . . . . . . . . .: 有効



armbian-configによるHotSpot構築は以下の手順で行われます。

1.WiFiモジュールの初期化(固定IPの付与)
/etc/network/interfaces.d/armbian.ap.natを作成し、networking.serviceを再起動す る。
これによりWiFiデバイスに172.24.1.1の固定IPがアサインされます。

少し意外だったのは、armbianでは[network-manager.service] と [networking.service] が両方動いてい ます。
armbianでステーションモードのWiFiを構築するときは、nmcli(Nwteork ManagerのCLIクライアント)を使って
[network-manager.service]によりWiFiを初期化しますが、
APモードのWiFiを構築するときは、[networking.service]を使ってWiFiを初期化しています。
従って、[network-manager.service]の設定情報が有ると、WiFi初期化が競合します。
[network-manager.service]の設定情報を事前に削除しておく必要が有ります。
[network-manager.service] と [networking.service] ではIPアドレスを固定する手順が違います。
$ sudo systemctl list-unit-files --type=service | grep network
network-manager.service                    enabled
networkd-dispatcher.service                enabled
networking.service                         enabled
systemd-networkd-wait-online.service       disabled
systemd-networkd.service                   disabled

2.hostapdの起動
hostapdをインストールします。
[/etc/hostapd.conf]を変更し、hostapd.serviceを起動する。

3.dnsmasqの起動
dnsmasqをインストールします。
[/etc/dnsmasq.conf]を変更し、dnsmasq.serviceを起動する。



ここからはOrangePi(armbian)とは関係なく、ubuntu20.04にHotSpotを構築する話です。
ubuntu20.04ではだいぶ手順が違います。
ubuntu20.04では[networking.service]が廃止され[network-manager.service]に統一され ています。
WiFiモジュールの初期化を[networking.service]で行うことができません。

まずは以下のコマンドでWiFiモジュールがサポートされているかどうかを確認します。
この時点でアクセスポイントが表示されなければ、WiFiモジュールがサポートされていません。
$ nmcli d wifi
IN-USE  BSSID              SSID             MODE   CHAN  RATE       SIGNAL  BARS  SECURITY
        12:66:82:28:A1:CF  aterm-22fa1c-gw  Infra  1     54 Mbit/s  96      ****  WEP
        10:66:82:28:A1:CF  aterm-22fa1c-g   Infra  1     44 Mbit/s  96      ****  WPA1 WPA2
        F8:B7:97:36:DE:52  aterm-d5a4ee-g   Infra  1     44 Mbit/s  74      ***   WPA1 WPA2
        84:D8:1B:E0:E8:27  TP-Link_E828     Infra  2     44 Mbit/s  68      ***   WPA1 WPA2
        E4:7E:66:2A:D2:7C  HG8045-CA9C-bg   Infra  5     16 Mbit/s  56      ***   WPA1 WPA2
        80:22:A7:83:3C:57  aterm-f24586     Infra  11    44 Mbit/s  52      **    WPA2

次にWiFiのインタフェース名を確認します。
昔は全てwlan0でしたが、最近の新しいOSでは名前の付け方が変わっています。
$ sudo ifconfig -a
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.49  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::fa0f:41ff:feae:d4d3  prefixlen 64  scopeid 0x20<link>
        ether f8:0f:41:ae:d4:d3  txqueuelen 1000  (Ethernet)
        RX packets 11656  bytes 2750676 (2.7 MB)
        RX errors 0  dropped 1958  overruns 0  frame 0
        TX packets 4617  bytes 861694 (861.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 246  bytes 22086 (22.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 246  bytes 22086 (22.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlx7cdd90f6c6cd: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether aa:d0:6f:be:13:69  txqueuelen 1000  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

以下のコマンドでHotSpotを構築しますが、ここが難関です。
この様に表示されればHotSpotの構築は成功です。
$ sudo nmcli device wifi hotspot ifname wlx7cdd90f6c6cd ssid my-ssid
Device 'wlx7cdd90f6c6cd' successfully activated with '03cf8e56-681c-45d1-840d-63a718c46166'.
Hint: "nmcli dev wifi show-password" shows the Wi-Fi name and password.

この様に表示されるときは、WiFiモジュールがAPモードをサポートしていません。
WiFiドングルを別の物に変更する必要が有ります。
ステーションモードでは安定して動くMT7601Uもこのエラーとなりました。
$ sudo nmcli device wifi hotspot ifname wlx1cbfceaae44d ssid my-ssid
Error: Device 'wlx1cbfceaae44d' supports neither AP nor Ad-Hoc mode.

armbianでは問題なくHotSpotを構築することができるWiFiモジュールでも、この様なエラーとなる事が有ります。
armbianで使ったRTL8188EUSもこのエラーになりました。
$ sudo nmcli device wifi hotspot ifname wlx00810e003485 ssid my-ssid
Error: Connection activation failed: (11) 802.1X supplicant took too long to authenticate.

色々調べましたが解決策が見つかりません。
家中のWiFiドングルで確認してみましたが、正しく構築できたのはRT5370とRT2870/3070だけでした。
どちらもRalink Technologyの製品です。

市販されているUSB-WiFiに使われているチップはほとんどが
Ralink Technology(lsusbを実行するとRTXXXXとかMTXXXXと表示される)か
Realtek Semiconductor(lsusbを実行するとRTLXXXXと表示される)のものです。

armbianではどちらの製品でもHotSpotを構築できますが、
Ubuntu20.04ではRealtek Semiconductor(lsusbを実行するとRTLXXXXと表示される)
のドライバーでHotSpotを構築することができません。
もしかしたら、RealtekのWiFiドライバーを更新すれば動くようになるのかもしれませんが試してません。

Network Manager(nmcli)が正常に終わると、以下の様にIPアドレスが割り当てられます。
この時点で、WiFiモジュールはHotSpot(APモード)として動きます。
$ nmcli connection show
NAME            UUID                                  TYPE      DEVICE
Hotspot         aaa9ba2a-e436-4319-993d-73ce160f349c  wifi      wlx7cdd90f6c6cd
netplan-enp2s0  7ea6f90b-3495-3533-948a-ef0035687c34  ethernet  enp2s0

$ sudo ifconfig wlx7cdd90f6c6cd
wlx7cdd90f6c6cd: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.42.0.1  netmask 255.255.255.0  broadcast 10.42.0.255
        inet6 fe80::7edd:90ff:fef6:c6cd  prefixlen 64  scopeid 0x20<link>
        ether 7c:dd:90:f6:c6:cd  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 56  bytes 7516 (7.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Network Managerの設定ファイルは[/etc/NetworkManager/system-connections /Hotspot.nmconnection]です。
このファイルを変更すればパスワードなどを設定することができますが、nmcliのコマンドでも設定することができます。
わたしはこ ちらを参考に以下の様に設定しました。
使用するチャネルはスマホのWiFiモニターツールなどで、空いているところを指定します。
$ sudo nmcli con modify Hotspot 802-11-wireless.band bg
$ sudo nmcli con modify Hotspot 802-11-wireless.channel 1
$ sudo nmcli con modify Hotspot 802-11-wireless-security.key-mgmt wpa-psk
$ sudo nmcli con modify Hotspot 802-11-wireless-security.proto rsn
$ sudo nmcli con modify Hotspot 802-11-wireless-security.group ccmp
$ sudo nmcli con modify Hotspot 802-11-wireless-security.pairwise ccmp
$ sudo nmcli con modify Hotspot 802-11-wireless-security.psk my-password
$ sudo nmcli con modify Hotspot ipv4.method shared
$ sudo nmcli con modify Hotspot connection.autoconnect yes

設定を反映するためにインタフェースを再起動します。
$ sudo nmcli con down Hotspot
$ sudo nmcli con up Hotspot

SSID=my-sssid、パスワード=my-passwordのAPに接続すると、10.42.0.89のアドレスが払い出されます。
Wireless LAN adapter Wi-Fi 15:

   接続固有の DNS サフィックス . . . . .:
   説明. . . . . . . . . . . . . . . . .: Realtek 8811CU Wireless LAN 802.11ac USB NIC
   物理アドレス. . . . . . . . . . . . .: 00-13-25-AE-1D-3D
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   リンクローカル IPv6 アドレス. . . . .: fe80::ed92:aa99:b491:96cf%15(優先)
   IPv4 アドレス . . . . . . . . . . . .: 10.42.0.89(優先)
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   リース取得. . . . . . . . . . . . . .: 2021年8月5日 14:22:33
   リースの有効期限. . . . . . . . . . .: 2021年8月5日 15:22:35
   デフォルト ゲートウェイ . . . . . . .: 10.42.0.1
   DHCP サーバー . . . . . . . . . . . .: 10.42.0.1
   DHCPv6 IAID . . . . . . . . . . . . .: 1023415077
   DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-21-94-5D-B3-D4-3D-7E-47-4E-4E
   DNS サーバー. . . . . . . . . . . . .: 10.42.0.1
   NetBIOS over TCP/IP . . . . . . . . .: 有効

こ ちらのページによると、Hotspot の DHCP と DNS は NetworkManager の DNSMasq Plugin が自動的に面倒を見てくれるそうです。
もし、dnsmasq.serviceが既に起動しているときは、NetworkManagerによって起動されるdnsmasqインスタンスと 競合するので、
以下の手順でdnsmasq.serviceを停止します。
$ sudo systemctl disable dnsmasq
$ sudo systemctl stop dnsmasq

Network ManagerでHotSpotを構築すると、10.42.0.1のアドレスがアサインされますが、任意のアドレスに変更することができます。
以下の手順でIPアドレスを変更することができます。
$ sudo nmcli con modify Hotspot +ipv4.addresses 192.168.11.1/24
$ sudo nmcli con down Hotspot
$ sudo nmcli con up Hotspot

これでWiFiのアドレスが192.168.11.1に変わります。
$ sudo ifconfig wlx7cdd90f6c6cd
wlx7cdd90f6c6cd: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.1  netmask 255.255.255.0  broadcast 192.168.11.255
        inet6 fe80::7edd:90ff:fef6:c6cd  prefixlen 64  scopeid 0x20<link>
        ether 7c:dd:90:f6:c6:cd  txqueuelen 1000  (イーサネット)
        RX packets 6574  bytes 1240259 (1.2 MB)
        RX errors 0  dropped 37  overruns 0  frame 0
        TX packets 13055  bytes 11915623 (11.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

SSID=my-sssid、パスワード=my-passwordのAPに接続すると、192.168.11.89のアドレスが払い出されま す。
Wireless LAN adapter Wi-Fi 15:

   接続固有の DNS サフィックス . . . . .:
   説明. . . . . . . . . . . . . . . . .: Realtek 8811CU Wireless LAN 802.11ac USB NIC
   物理アドレス. . . . . . . . . . . . .: 00-13-25-AE-1D-3D
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   リンクローカル IPv6 アドレス. . . . .: fe80::ed92:aa99:b491:96cf%15(優先)
   IPv4 アドレス . . . . . . . . . . . .: 192.168.11.89(優先)
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   リース取得. . . . . . . . . . . . . .: 2021年8月5日 15:07:42
   リースの有効期限. . . . . . . . . . .: 2021年8月5日 17:47:38
   デフォルト ゲートウェイ . . . . . . .: 192.168.11.1
   DHCP サーバー . . . . . . . . . . . .: 192.168.11.1
   DHCPv6 IAID . . . . . . . . . . . . .: 1023415077
   DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-21-94-5D-B3-D4-3D-7E-47-4E-4E
   DNS サーバー. . . . . . . . . . . . .: 192.168.11.1
   NetBIOS over TCP/IP . . . . . . . . .: 有効

nmcliで設定できる項目は多数あります。
以下のコマンドで設定できる項目を表示することができます。
$ nmcli connection show Hotspot
connection.id:                          Hotspot
connection.uuid:                        2980e598-eac3-4174-90cf-75c6abe6287c
connection.stable-id:                   --
connection.type:                        802-11-wireless
connection.interface-name:              wlx7cdd90f6c6cd
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.autoconnect-retries:         -1 (default)
connection.multi-connect:               0 (default)
connection.auth-retries:                -1
connection.timestamp:                   1628146681
connection.read-only:                   no

NetworkManager の DNSMasq Plugin が割り当てるDHCPのアドレス範囲は以下で確認することができます。
 --dhcp-range=192.168.11.10,192.168.11.254となっていますが、これの変更方法が見つかり ません。
$ ps -ef | grep dnsmasq
nobody     12615   10097  0 15:28 ?        00:00:00 /usr/sbin/dnsmasq --conf-file=/dev/null --no-hosts --keep-in-foreground --bind-interfaces --except-interface=lo --clear-on-reload --strict-order --listen-address=192.168.11.1 --dhcp-range=192.168.11.10,192.168.11.254,60m --dhcp-lease-max=50 --dhcp-leasefile=/var/lib/NetworkManager/dnsmasq-wlx7cdd90f6c6cd.leases --pid-file=/run/nm-dnsmasq-wlx7cdd90f6c6cd.pid --conf-dir=/etc/NetworkManager/dnsmasq-shared.d

続く...