Raspberry Pi上のNetBSDに無線LANアクセスポイントを構築してみる

[NetBSD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/netbsd) 1日目の記事です。今日はRaspberry Piで無線LANのアクセスポイントを構築する話をしようとおもいます。

## Raspberry Piで無線LANアクセスポイント？ 

過去のAdvent Calendarで、PCルータを構築する記事がありました。それならPCルータに無線LANアクセスポイントの機能を組み込めばよいのでは？と思うかもしれません。

 * [NetBSD+Raspberry PiでPCルータを作る(カーネルビルド編)](https://qiita.com/furandon_pig/items/35164d2ccc4e1dda160e)(2015/12/23)
 * [NetBSD+Raspberry PiでPCルータを作る(ユーザランド設定編)](https://qiita.com/furandon_pig/items/a6f53de431eb19ea2154)(2015/12/03)

実のところ、これら一連の記事で紹介したPCルータはThinkpad X40という、(だいぶ昔の)ノートPC上に構築しており、搭載されている無線LANアダプタの[ath(4)](https://man.netbsd.org/ath.4)(Atheros IEEE 802.11 driver)が利用可能です。

じつは当初、無線LANアクセスポイントをPCルータに組み込んでみたのですが、運用を開始するとカーネルパニックが頻発するという現象に遭遇してしまいました…(NetBSD-9の場合)。そのため、手元に余っていたRaspberry Pi model B(初代バーション)上に無線LANアクセスポイントを構築した、という話になります。また、結果的に有線LANと無線LANのネットワークを分離できたというメリットもありました。

## 無線LANアクセスポイントの構築

### 使用する無線LANデバイス

今回は無線LANアダプタとして[TL-WN725N](https://www.tp-link.com/jp/home-networking/adapter/tl-wn725n/)を利用します。NetBSDでは[urtwn0(4)](https://man.netbsd.org/urtwn.4)として認識されます。

```
[     3.062574] urtwn0 at uhub1 port 2
[     3.062574] urtwn0: Realtek (0x0bda) 802.11n NIC (0x8179), rev 2.00/0.00, addr 4
[     3.202878] urtwn0: MAC/BB RTL8188EU, RF 6052 1T1R, address 54:af:97:68:aa:8b
[     3.202878] urtwn0: 1 rx pipe, 2 tx pipes
```

### /etc/ifconfig.urtwn0の設定

`/etc/ifconfig.urtwn0` には以下を記述します。無線LAN側のネットワークとして `172.16.151.0/24` が利用されます。

```
172.16.151.1 netmask 255.255.255.0 up
```

### hostapdの設定

無線LANアクセスポイント機能を提供するデーモンとして、[hostapd](https://w1.fi/hostapd/)を利用します。

`/etc/hostapd.conf` に以下を記載します。

| 設定項目 | 設定値 | 備考 |
| --- | --- | --- |
| interface | `urtwn0` | |
| ssid | `nbsdadvcal2024` | |
| channel | `0` | チャンネルが自動的に設定されるようになる |
| wpa_passphrase | `mypassphrase` | |

```
# 無線LANアダプタのデバイス名を設定します。
interface=urtwn0

logger_syslog=0
logger_syslog_level=0
logger_stdout=1
logger_stdout_level=1
debug=2
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel

# SSIDを設定します。
ssid=nbsdadvcal2024

country_code=JP
# hw_modeの値は、ifconfigの出力から確認する。
hw_mode=b

# channelに0を設定するとチャンネルが自動的に選択される。
channel=0

wpa=1

# WPAのパスワードを設定します。
wpa_key_mgmt=WPA-PSK

# パスフレーズを設定します。
wpa_passphrase=mypassphrase

auth_algs=1
wpa_pairwise=CCMP
rsn_pairwise=CCMP
wpa_group_rekey=600
wpa_strict_rekey=1
wpa_ptk_rekey=600
eapol_key_index_workaround=7
eap_reauth_period=0
```

### hostapdの起動

一通りの設定が完了し、あとは `hostapd` を起動するだけです。

```sh
$ # SSIDを設定します。
$ sudo ifconfig urtwn0 ssid nbsdadvcal2024
$
$ ifconfig urtwn0
urtwn0: flags=0x8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ssid nbsdadvcal2024
        powersave off
        bssid 54:af:97:68:aa:8b chan 2
        address: XX:XX:XX:XX:XX:XX
        media: IEEE802.11 autoselect hostap (autoselect mode 11b hostap)
        status: active
        inet6 fe80::56af:97ff:fe68:aa8b%urtwn0/64 flags 0 scopeid 0x2
        inet 172.16.151.1/24 broadcast 172.16.151.255 flags 0
$
$ # hostapdを起動します。
$ sudo /usr/sbin/hostapd -td /etc/hostapd.conf
```

### どこまで実用になる？

無線LANアクセスポイントは構築できましたが、ハードウェアは初代Raspbery Pi model Bということもあり、どこまで実用になるのでしょうか？私の環境では、スマートフォンを無線LANに接続し、SNS(Twitter(現:X))を閲覧したり、自作のWebアプリの動作確認といった、比較的シンプルな用途での利用にとどまっているのですが、たまにデーモンが止まったりして再起動対応する以外は別段困ったりはしていません。ただ、複数人で無線LANを利用するようなケースだとちょっと厳しいかもしれません…。

## まとめ

NetBSDで無線LANアクセスポイントを構築する手順を紹介しました。Raspberry PiのようなSBC(Single Board Computer)もマシンパワーが向上しており、欲しい機能を自由に組み込んだお手製の無線LANアプライアンスを作ってみるのも面白そうです。