ラズパイを使ってモバイルWi-Fiの接続数足りない問題を解決する

# 概要
接続数に制限のあるモバイルWi-Fiに、Wi-Fi中継機としてラズパイを接続し、新しいWi-Fiネットワークを追加することで、家庭内のWi-Fi接続数不足を解決した。設定の際、固定IPを設定できない問題に遭遇したので、解決方法を示す。

# はじめに
最近、家のインターネット環境をモバイルWi-Fiにした。通信速度もそれなりに出ており、Amazon Videoも快適に見れる。ただし、最大接続数が5台までで少ない。スマホとPCだけなら問題ないが、Google Home等をつなぐと足りない。新しく、Wi-Fi中継器的なものを買うのも非常にもったいない。中継機を選定するにも、それなりに時間かかる。追加でWi-Fi接続したいのは、Google HomeやNature Remoやプリンタである。通信距離は１部屋の中で届けばよい。通信速度については、音楽を聴ければ良い。無線でラズパイを使ってるときの場所と通信速度を考えると、問題ないと思われる。

ということで、ラズパイのWi-Fi中継器化を試した。（ここで、「中継機」は同じネットワーク内での通信距離等の拡張ではなく、新しく無線ネットワークを追加するものとして記載。）

# 環境
Raspberry Pi 4 Model B
Raspbian Buster

Wi-Fiドングル
PLANEX
GW-USNano2


# 調査
以前、同じことを試そうとしたときに失敗したので、ある程度理解するために複数のサイトを確認した。

[Raspberry Pi 3 + USB WiFiドングルで、Wi-Fi 中継器 - Qiita](https://qiita.com/mt08/items/a00417d877836744c65c)
[[メモ] Raspberry Pi 3で、Wi-Fi アクセスポイントルータ - Qiita](https://qiita.com/mt08/items/f2e4f9d3b1ed00849e23)
[Raspberry Pi でmitmproxyを使って無線LANを中継してパケットをキャプチャする | メープルごはん's Blog](https://www.maple-rice.com/blog/raspberry-pi-mitmproxy)
[ラズベリーパイを使ったWiFiローカルサーバーの作り方 - Qiita](https://qiita.com/danjiro/items/28bb17ab3e2aaf79e572)
[RaspberryPiで無線LANアクセスポイント – Greenleaf](https://greenleaf.mydns.jp/index.php/wlan-ap-raspberrypi/)
[ラズパイを WiFi アクセスポイントにする！](https://raspi-wannabe.com/wifi_ap/)
[Raspberry Pi 3 Model Bの WiFiを無線LANアクセスポイント化 WiFiルータ化する hostapd + bridge-utils編 (ラズパイ３に内蔵の WiFiを無線LANアクセスポイントにして通信環境を設定する方法)](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_wifi_wireless_access_point/)
[Raspberry Pi 3の WiFiを広告ブロック機能付きの無線LANアクセスポイント化 hostapd + dnsmasq編 (ラズパイ３に内蔵の WiFiをアドブロック機能付きの高機能ルータにする方法（広告＋詐欺＋アダルトブロック機能付き）)](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_wifi_wireless_access_point_dnsmasq/)
[アクセスポイント | goozenlab](https://goozenlab.com/blog/2019/03/hostapd-buster/)

情報は沢山あるが、古い情報も紛れている。Raspbianのバージョン（Buster）も入れて検索する必要がある。
各記事で紹介されてる機能は、ざっと見たところ、以下の4点。

- hostapd アクセスポイント
- isc-dhcp-server DHCPサーバー
- dnsmasq DNSサーバーとDHCPサーバー
- bridge-utils ブリッジの設定

今回、大元のモバイルWi-Fiの接続数に制約があるので、そちらのルーティング機能は使えない。接続数を増やすために、ラズパイで新しくネットワークを作りルーティングすることにした。つまり、ブリッジはしない。また、Google HomeがDHCP必要だった気がするので、DHCPは必要。また、DNSは、特に必要と感じていない。

必要な機能は、下記2点と判断した。

- hostapd
- isc-dhcp-server or dnsmasq

再度、Busterを入れて検索しなおしたら、やろうとしていることを既にやってる人を発見した。感謝。
下記サイトを参考に、dnsmasqではなく、isc-dhcp-serverを使うことにした。

[hawksnowlog: RaspberryPi をモバイルルータの拡張アクセスポイントとして構築する](https://hawksnowlog.blogspot.com/2019/08/create-access-point-on-raspberrypi.html)

下記サイトも参考にした。感謝。
[ラズパイを WiFi アクセスポイントにする！](https://raspi-wannabe.com/wifi_ap/)


# したこと
## Wi-Fiドングルの確認
まず、Wi-Fiドングルが有効になってるかを確認する。
指すだけで、認識していることが確認できた。

```
pi@raspberrypi:~ $ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
...
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
...
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500、
...
wlan1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
...
```

# wlan1 (USBドングル)の接続設定
wlan1だけ、自動でモバイルWi-Fiにつなぐように設定。
何も設定しなかったら、2つ共、すでに接続したことのあるモバイルWi-Fiにつながっていた。
ここを参考に、設定した。
[Raspberry PiでWi-Fiアダプタ2本挿した時にハマったこと - Qiita](https://qiita.com/kota65535/items/3d02c7c518761476c84a)

## hostapdのインストールと設定
本節から、下記サイトを参考に実行した。
wlan0とwlan1を入れ替えて設定したかったので、そこだけ注意して同じように実行した。
[hawksnowlog: RaspberryPi をモバイルルータの拡張アクセスポイントとして構築する](https://hawksnowlog.blogspot.com/2019/08/create-access-point-on-raspberrypi.html)

指示通り実行した。エラー等は表示されなかった。

## ルーティング設定
指示通り実行した。エラー等は表示されなかった。

## dhcpサーバのインストールと設定
インストールと設定はエラー等なく完了。

DHCPサーバ立ち上げ時にエラーが発生した。以下に示す。

```
$ sudo systemctl start isc-dhcp-server
Job for isc-dhcp-server.service failed. See 'systemctl status isc-dhcp-server.service' and 'journalctl -xn' for details
```
メッセージ通りにコマンドを実行した。
`systemctl status isc-dhcp-server.service`を実行したところ、気になる部分は特になかった。

次に下記コマンドを実行すると、エラーが表示された。

```
$ journalctl -xn
...
no subnet declaration for wlan0 (no ipv4 addresses)
...
```

設定を見直したりしたが、改善せず。
ここで、いくつかのサイトを確認したが、有用な情報は得られず。
`ifconfig`しても、IPが振られてなかったことを思い出し、このことが問題と仮定して、いくつか確認した。固定IPの設定の仕方や、2つのwlanの設定を分けて書く方法に自信がなかったので、いくつかのサイトを確認しながら設定を見直したが、解決せず。
IP指定の方法を変えて確認しようと考え、`/etc/dhcpcd.conf`ではなくて、`/etc/network/interface`に固定IPの設定を書いて再起動した。`ifconfig`で再確認すると、IPが振られていた。

その状態で、再度

```
sudo systemctl start isc-dhcp-server
```
すると、エラーなく実行できた。
別の端末から指定したSSIDにつなぐとインターネットに接続できた。
再起動しても、別の端末から接続できることを確認できた。
再起動時は、上記コマンドを実行する必要はなかった。

いくつか前のRaspbianからinterfaceに固定IPの設定を書くのは推奨されていないみたいなので、あんまりきれいな解決策ではないけれど、動作を確認できたので、当分これで運用することにする。また、interfaces.dにリンクが貼られているので、そのディレクトリに書く方が、まだ良いのかもしれないが、時間をかけるメリットを見いだせないため対応を見送った。
以下に、参考のため固定IP＋αの設定ファイルを示す。

```text:interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
      address 192.168.130.1/24
      netmask 255.255.255.0
      gateway 192.168.130.1
# iface wlan0 inet manual
#       wpa-conf /etc/wpa_supplicant/wpa_supplicant_wlan0.conf

auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
      wpa-conf /etc/wpa_supplicant/wpa_supplicant_wlan1.conf

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
```

# 動作確認
ラズパイ経由でインターネットに接続し、スピードテストをしてみると、約1/5であった。時間帯や他の接続端末の状況によっても変動すると思われるが、現在、十分な速度が出ているため、特に問題ないと判断した。問題があれば、また対応する。

# チャネルの変更と確認（追記：2020/02/29）
2.4GHz帯のチャネルを確認してあいてそうなところに変更することにした。
できれば、空きの多い5GHz帯を使いたいけれど、記憶では、Google Homeが2.4GHzだけ対応だったので、そうした。両方使える方法もあるのかもしれないが、保留。性能が足りなかった場合に検討する。

まず、チャネルの確認に使うソフトを選定した。ChromebookにAndroidアプリを入れることにした。いくつか、レビューと見た目を確認して、WiFi Analyzer (open-source)にした。選定理由は、`open-source`と書かれているから。広告がない可能性が高いと判断した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/d59ed9f4-19a9-1284-f419-a07cb5d57d97.png)

チャネルを確認してみるとこのようになった。モバイルWi-Fiのチャネルとラズパイのチャネルが重なっていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/0ce84d14-99cd-38f0-863a-de19f66162da.png)


比較的、他のWi-Fiの信号電力が弱いチャネル１に変更することにした。

[参考にしたサイト](https://hawksnowlog.blogspot.com/2019/08/create-access-point-on-raspberrypi.html)にかかれている手順に従って、hostapd.confを書き換えて、下記コマンドを実行した。

```
sudo systemctl restart hostapd
sudo /etc/init.d/isc-dhcp-server restart
```

再度確認した。チャネルが移動したことがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/1dd2dafe-b8f8-cc47-40d4-410949dc29d7.png)


# 今後
今後やりたいことを以下に示す。

- チャネルを見直す（完了：2020/02/29）
- 固定IPの設定を見直す。
- 家庭内の端末をモバイルWi-FiとラズパイWi-Fiのどちらに接続するか考える。

# おわりに
一部、無理やり動作させているような部分はあるが、無事、動作することが確認できた。今回の設定に限る話ではないが、デバッグが難しい。どの機能がどの設定ファイルで動作しているかは、検索すればでてくるが、エラーが出たときの最適なデバッグフローを判断できない。今回のエラーメッセージは、直接的なものでなかったので、余計に時間がかかった。一つの解決策としては、DHCPやAPの動作を理解することで、もうすこし早くデバッグできたと思われる。今後、使う機能自身の理解に、より時間を割くことで、デバッグ時間の短縮と、応用力の向上に努めたい。ただし、毎回同じことを考えるので、根本的な解決にはなっていないかもしれない。知らない技術を使うときのデバッグ方法は、今後の課題としたい。

# 付録
現状の設定（fcitx-mozc）だと、Ctrl-Spaceで英語と日本語の入力が切り替わる。ラズパイでは日本語キーボードを使ってる。Emacs使ってると、困るので、無効化する。下記サイトに従って設定することで、無効化できた。

ラズパイでのCtrl-Space使うと入力切替を無効にする方法
[第63回 Raspbian Stretchと日本語変換（fcitx-mozc） | Device Plus - デバプラ](https://deviceplus.jp/hobby/raspberrypi_entry_063/)

また、rc.localのことを調べた。下記サイトが参考になった。
[rc.local - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/linux/usage/rc-local.md)
[linux起動時に自動的に実行するコマンド（プログラム）の設定 - Qiita](https://qiita.com/hnishi/items/6a5b8b67d807f8dfe44e)