Raspberry Piをアクセスポイント(中継器)として使う(Bookworm Lite 64bit)

Raspberry Pi OSの最新版であるBookwormでラズパイをアクセスポイントとして使う方法をご紹介します。NetworkManagerのおかげでかなり簡単にできたと思います。
今回はラズパイは他のアクセスポイントに接続しつつ、ラズパイがアクセスポイントとしてふるまう方法を紹介します。この方法は、ラズパイを介してインターネットへ接続できる方法です。

## 想定環境

- Raspberry Pi 4 B
- Raspberry Pi OS Lite(64 bit) Bookworm
- ラズパイに対しての無線以外の接続手段（シリアル、有線LAN、モニタ+キーボードなど）

## 準備

### Raspberry Pi OSのコピー

[Raspberry Pi Imager](https://www.raspberrypi.com/software/)などを使用して、SDカードにOSイメージをコピーしてください。Imagerを使う場合、この後SDカード内のファイルを操作するため、`終わったときにメディアを取り出す`のチェックを外してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726576/472ef1e0-c398-aaf7-a2bf-f7860efe8c57.jpeg" width=400>

### SDカード内のファイルの編集

この先、設定変更のミスによりラズパイへのアクセスを失うことを防ぐため、有線接続またはシリアル接続の設定をします。キーボードとモニタをお持ちの方はそのままで大丈夫です。

#### シリアルの有効化

bootfs\/config.txtを編集します。末尾に`enable_uart=1`を追記してください。

```text:config.txt
・・・省略・・・
[all]
enable_uart=1
```

#### イーサネットポートのアドレス固定

PCとラズパイをLANケーブルで直接続する場合、以下の設定をします。有線LAN環境があり、DHCPでラズパイに割り当てられたIPアドレスを把握する術がある場合は必要ありません。職場、学校などでDHCPの情報が確認できない場合は直接続が安心です。

bootfs\/cmdline.txtを編集します。1行目末尾に`ip=192.168.200.1::0.0.0.0:255.255.255.0::eth0:off`を追記します。IPアドレスは適宜変更してほかのNWと被らないようにしてください。
```cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=4e639091-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot cfg80211.ieee80211_regdom=JP systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target ip=192.168.200.1::0.0.0.0:255.255.255.0::eth0:off
```

## ネットワークの設定

SDカードをラズパイに挿入し、電源を入れます。各々の方法でログインしてください。

### 仮想Wi-Fiインタフェースの作成

[Raspberry Pi WiFiアクセスポイント+クライアント同時使用](https://www.mikan-tech.net/entry/raspi-wifi-ap-sta)
こちらのサイトを参照し、 ___udevの設定___ までを完了させてください。出来たら再起動します

### インタフェースの確認

インタフェースが再起動しても作成されていることを確認します。`iw dev`を実行し、ap0が存在すること、MACアドレスがwlan0と同一であることを確認してください。

```shell:実行結果
pi@raspberrypi:~$ iw dev
phy#0
        Unnamed/non-netdev interface
                wdev 0x3
                addr アドレス
                type P2P-device
                txpower 31.00 dBm
        Interface ap0
                ifindex 4
                wdev 0x2
                addr アドレス
                type AP
                channel 36 (5180 MHz), width: 20 MHz, center1: 5180 MHz
                txpower 31.00 dBm
        Interface wlan0
                ifindex 3
                wdev 0x1
                addr アドレス
                type managed
                channel 36 (5180 MHz), width: 20 MHz, center1: 5180 MHz
                txpower 31.00 dBm
```

### nmcliでの設定

nmcliを用いて設定をします。
コマンド一発で設定ができます。
```
sudo nmcli connection add type wifi con-name raspi-ap ssid raspi-ap 802-11-wireless-security.psk raspberry ifname ap0 mode ap 802-11-wireless.band bg ipv4.method shared ipv4.addresses 192.168.210.1/24  ipv6.method disabled 802-11-wireless-security.key-mgmt wpa-psk 802-11-wireless-security.proto rsn 802-11-wireless-security.pairwise ccmp 802-11-wireless-security.psk raspberry autoconnect yes
```

詳しくはわかりませんが、周波数やチャンネルの設定を入れないことで、勝手に適切な設定を選んでくれるようです。

`con-name`、`ssid`、`802-11-wireless-security.psk`はお好みで変更してください。(raspi-apのパスワードがraspberryはさすがに安直すぎる気がします)

`ipv4.addresses`も環境により他のNWと被らないよう変更してください。

## 設定の確認

`nmcli device status`を実行します。

```shell:実行結果(日本語)
DEVICE         TYPE      STATE            CONNECTION
ap0            wifi      接続済み         raspi-ap
wlan0          wifi      接続済み         preconfigured
eth0           ethernet  接続済み (外部)  eth0
lo             loopback  接続済み (外部)  lo
p2p-dev-ap0    wifi-p2p  切断済み         --
p2p-dev-wlan0  wifi-p2p  切断済み         --
```

```shell:実行結果(英語)
DEVICE         TYPE      STATE                   CONNECTION
ap0            wifi      connected               raspi-ap
wlan0          wifi      connected               preconfigured
eth0           ethernet  connected (externally)  eth0
lo             loopback  connected (externally)  lo
p2p-dev-ap0    wifi-p2p  disconnected            --
p2p-dev-wlan0  wifi-p2p  disconnected            --
```

raspi-apがap0に接続されていることを確認してください。

## 疎通確認

ここまでの設定を終えると、PCなどからラズパイにアクセスできます。試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726576/287b6fe1-e64b-b411-98f1-6fc55d355e69.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726576/fc285517-5c93-b8a7-cf0c-b9776f6a489e.png" width=400>

私の環境では、802.11ac 5GHzで接続されました。おそらくラズパイ4の規格上の最速です。

参考: https://qiita.com/god19/items/f21d274b45688d9679fa

`ipconfig`を実行してみます
```powershell:ipconfig
Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::4f26:eb45:2c03:5c36%9
   IPv4 アドレス . . . . . . . . . . . .: 192.168.210.161
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: 192.168.210.1
```

`ping google.com`で、インターネットへ出られることを確認してみます。
```powershell:ping
google.com [142.250.198.14]に ping を送信しています 32 バイトのデータ:
142.250.198.14 からの応答: バイト数 =32 時間 =8ms TTL=57
142.250.198.14 からの応答: バイト数 =32 時間 =8ms TTL=57
142.250.198.14 からの応答: バイト数 =32 時間 =8ms TTL=57
142.250.198.14 からの応答: バイト数 =32 時間 =9ms TTL=57

142.250.198.14 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 8ms、最大 = 9ms、平均 = 8ms
```

無事に接続できました。

## まとめ

NetworkManagerを用いることで、追加パッケージのインストールなしでラズパイに無線接続できました。

コメント、編集リクエストお待ちしております。最後まで読んでいただきありがとうございました。

## 参考記事

https://www.mikan-tech.net/entry/raspi-wifi-ap-sta
https://raspida.com/networkmanager-wifi-ap
https://qiita.com/god19/items/f21d274b45688d9679fa