USB-Wifi ドングルを使って5GHzのAPをつくる
USBのWifiドングルを使ってアクセス・ポイントを構成できないのかとずっと疑問に思っていた。色々と調べているとMediatekのチップでLinuxからAPになれることがわかった。
また、5Ghzでアクセス・ポイントを構成するには、一部のカーネル機能を使わないといけないので、OpenWRTやKaliのようなWifi制御を扱えるOSを選ぶ必要がある。とくに5Ghzは、航空無線とのバッティングがあるの細かい部分でややこしい。
今回選んだのは次のUSB Wifi である。NetGear, Inc. A6210が、5GHZのAPになれるし、11acでつながるし速度も十分にでるし、日本のAmazonで手軽に買える。2020年に購入し放置していた。その当時はx86のドライバしかWRTで提供がなかったのでアップデートを待っていた。
今回の構成は、Raspi-UbuntuにLXDでOpenWRTを起動し、USBドライブをパススルーする予定だった。
USBデバイスをパススルーしなくても、Raspi自体がNetGear, Inc. A6210のmt76x2u
ドライバをロードしてくれたので、ネットワークデバイスとしてパススルーして試すことにした。
lxd の準備
sudo snap install lxd sudo lxc init sudo lxc launch images:openwrt/22.03 wrt-01
wrt の準備
## ネットワーク疎通確認を兼ねてbashを入れる。 sudo lxc exec wrt-01 -- opkg update sudo lxc exec wrt-01 -- opkg install bash
ネットワークデバイスをパススルー
Raspi(LXDホスト)でwlan1として見えている A6210を、LXDゲスト(wrt)にwlan0として譲渡する。
lxc config device add wrt-01 wifi nic nictype=physical parent=wlan1 name=wlan0 lxc config device remove wrt-01 wifi # 削除できることを確認。 lxc config device add wrt-01 wifi nic nictype=physical parent=wlan1 name=wlan0
ついでの作業用にeth0もMacVLANでパススルー
lxc config device add wrt-01 myvlan nic nictype=macvlan parent=eth0
作業用eth0 にDHCPからLANアドレスを割り当てておく
ip link set eth1 up udhcpc -i eth1
wifi 関連のモジュールを入れる。
ネットワークメニューに config/wireless
を出すために必要
sudo lxc exec wrt-01 -- opkg install wpad-wolfssl
lxdでストレージに余裕があるため、フルパッケージ版wpad-wolfsslを選んだ。
もしWRTだけでやるなら
LXDを経由せずに、WRTをベアメタルで使うのであれば、ドライバをインストールしないと動かないと思う。 適当にドライバを入れる。A6210はmt76x02なので、mt76関連を入れておけばいいはず。細かい一致を調べるのはまた今度。
opkg find *mt76* | cut -d ' ' -f 1 | xargs opkg install opkg install wpad-wolfssl
今回は実験だけのつもりなので、適当に関連モジュールをインストールした。
正確にやるには、kmod-mt76x02-usb
関連を入れておけばいいと思う。
OpenWRT の22.03 からサポートされている。以前はX86のDevにしかなかったのだが、いまはarmやmipsにも配布されている感謝しかない。
動作チェック
再起動をして、ネットワークデバイスがロードされる。
bash-5.2# iw dev phy#1 Interface wlan0 ifindex 15 wdev 0x100000001 addr 9c:c9:eb:21:fa:53 type managed txpower 18.00 dBm multicast TXQ: qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets 0 0 0 0 0 0 0 0 0
再起動を何度か繰り返したり、デバイスのパススルーを追加削除を何度か繰り返してたら認識した。LXD経由だとちょっと不安定。
LXDのホスト側でWifiデバイスを完全に開放した状態で、再起動すると起動した。
lxd stop wrt-01 ## 無線デバイスを解放 rfkill unblock all lxd start wrt-01
メニューに出てきた
出てきた!
Wrt on LXD でもWirelessメニューを出せた。ちょっと感動した。時代は進歩した。ソフトウェアのサポートが充実している。
APとして設定して接続
iperf3で負荷を与えてみる。
iperf3 かけててたら XHCI が死んだ。
bash: /sbin/service: /bin/sh: bad interpreter: I/O error bash-5.2# exit Error: Command not executable takuya@raspi-ubuntu:~$ sudo ps -bash: /usr/bin/sudo: Input/output error
io error でUSBまるごと死んだ。
これは、USBドライバが、Raspiまるごと死んだということだろう。
つかったRaspi4は、USBーHDDでusb3.0を使っていて、USBのWifiアダプタもUSB3.0でつないでいるので、バスパワー不足になったのだろうか。USB通信の通信量が多すぎたのだろうか、USB3.0がまるごとダウンしてしまった。SDカードでやれば動くかもね。USB−HDDのbtrfs が死んだ。USB3に指すと巻き込みで死ぬ。
usb2.0とusb3.0で分けて試す。
2.0/3.0のポートで分けて試すことにした。LXDに渡したWifiドングルでも安定して動作する。
USB3.0のとき、5GHzのAPを使うと、450Mbps前後の速度が出たが、USB2.0であれば、同じく5GHzのAP設定でも、150Mbpsが限界だった。USB自体の速度限界までは使い切れないようだ。3.0だと不安定だったが2.0だと比較的安定した。LXDを経由して通信量やSSL関連でRaspi4には荷が重いのかもしれない。
SDカードなら動くかもしれない。
SDカードをつかってUSBを使わずにWifiドングルがUSB3.0を占拠すれば、もっと安定して動くかもしれない、そのうち試したい。
今回試したUSB-Wifi
Linuxルータが5GHzでAPになるのは航空無線DSP関連があるので常用は憚られる。ちゃんと国の設定を行っていれば問題にはならないんだけど。。。
X86マシンであればPCI-EのデバイスでもっとかんたんにAP作れる。今回はRaspi4を前提にしたのでUSBで試したが、いまのWRTであれば問題なくAPを作れることがわかった。これさえあれば、次々とAPを購入したり、WRTファームを焼きかえなくてもいい。USBデバイスで5GHzのWifi-APを作れるとわかった。GNUの自由が手に入ることがわかった。