Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

余っていたRaspberry Pi 3A+と、これまた余っていたUSB型無線LAN子機で、Wi-Fiの中継機にしようと簡単に考えていたら、2日間ほどハマってしまった。

断言はできないけど、どうやらWi-Fiしか持たない3A+の場合、無線と無線のブリッジ接続ができませんでした。

ちょっと何言っているのか分からないでしょう。大丈夫、私もよく分かっていません。

回避策として、3A+にルーター機能を持たせ、別空間アドレスを排出する形で中継機としては実現できました。

大きくハマったポイントは2つ。

  1. 該当の無線LAN子機のドライバをあてること
  2. 4つの設定ファイル(conf)の設定

ネットワーク系は自分の中では得意な方なのですけど、知識と経験不足からハマりましたね。使うUSB型無線LAN子機にもよる部分があります。

結果的にはアクセスポイント(AP)化したラズパイを上流(インターネット)へ繋いだだけに過ぎないというオチになりました。

でも、実用的なのでポイントを押さえてご紹介しておきます。

用語の説明

自分でもよく間違えるため、使う用語を説明というか明示しておきます。

3A+搭載のWi-Fiwlan0
USB型無線LAN子機wlan1
eth0なし
家庭内LAN側のIPアドレス範囲192.168.0.1〜
3A+側LAN側のIPアドレス範囲192.168.2.1〜
アクセスポイント(AP)化USB型無線LAN子機に接続

主に編集するconfファイル

細かく設定していく中でconfファイルを触ります。特に必須なconfファイルは次です。

/etc/network/interfaceswlan0などのネットワークI/F設定
/etc/dhcpcd.confインターネットに繋げるDHCPサーバの設定
/etc/hostapd/hostapd.confアクセスポイントと認証サーバーの設定
/etc/dnsmasq.conf軽量のDHCPとキャッシュDNS サーバーの設定

今回の環境

環境としては、少し古い状態です。

  • Raspberry Pi 3A+
  • Raspberry Pi OS lite(64bit)Legacy(Debian GNU/Linux 11 bullseye)kernel 6.1.21-v8+
  • USB型無線LAN子機(ELECOM WDC-150SU2M

なお、使ったUSB型無線LAN子機のドライバは既にインストール済みとして進めます。

このドライバは、ソースからコンパイルしないとならないのに、情報が古い物しかなくてかなり手間でした。長くなるため別の記事とします。

使用する無線LAN子機は、ドライバがスムーズに導入できる方が良いでしょう。

2024年時点でもインストールできたので、チャレンジしたい人は同じ製品で試してみてください。

必要な物をインストール

とりあえず必要になるソフトウェアをインストールしていきます。

OSがLite版なので、他にも足りないのがあるかも知れません。概ねこれだけ。

sudo apt update && sudo apt full-upgrade

sudo apt install hostapd dnsmasq

sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent

手順、流れは以前に公開した記事を参考にしてください。私も忘れていて読みました!?

単独で確認

最初は、USB型無線LAN子機を接続しないで確認すると進めやすいかと思います。Raspberry Pi 3A+だけでインターネットに接続できる状態から始めます。

操作は全てSSH接続経由で行えます。

ネットワーク部分を編集するため、間違えるとSSH接続が切れることもありますし、間違えなくてもリスタートしたりすれば一時的にタイムラグが生じます。

キーボードとモニターが接続されていれば安心でしょう。

確認するコマンド

私もエンジニアではないため、その都度コマンドで確認しながら進めています。今回だと大体3+3個くらいのコマンドで変化を見たり確認することになるでしょう。

ネットワークI/Fの確認をする。

ip a
iwconfig
ifconfig

各サービスのステータスでエラーを確認する。

sudo systemctl status networking.service
sudo systemctl status hostapd.service
sudo systemctl status dnsmasq.service

Raspberry Pi 3A+の場合、有線LANのポートはありません。(eth0がない)

例えば、ip aコマンドのなら、最初はloとwlan0が表示されていればOKです。

これから追加する無線LAN子機がwlan1になるという前提です。

ネットワークインターフェイス(I/F)のwlan0とwlan1が逆になってしまうことがあります。ESSIDで確認しましょう。

■Pi 5は8GBモデルがオススメ

/etc/network/interfacesの設定

先に/etc/network/interfacesを設定しておきます。

このタイミングでUSB型無線LAN子機を繋いで設定していきます。

現行のRaspberry Pi OSだと、NetworkManagerが採用されていますが、LegacyOSなのでDHCPをそのまま使っています。

恐らくineterface内は3行しか記載されていないと思いますので、その下に追記します。

*既に記載されている3行
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source /etc/network/interfaces.d/*

他のdhcpcdやdnsmasqにもいえますが、決まった場所に新規で書いて読み込ませることができます。今回は直接書き込んでいきました。

新規に作成する手段は、元に戻す時に楽ですよね。

sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet dhcp

auto wlan1
allow-hotplug wlan1
iface wlan1 inet manual

ここのwlan0が3A+がインターネットに繋ぐインターフェイスです。今回は固定アドレスにしていません。dhcpから払い出します。固定化するなら/etc/dhcpcd.confに記載しないとなりません。

wlan1はUSB型無線LAN子機として設定するインターフェイスです。

allow-hotplug wlan1は、autoの代わりに設定したらエラーだったため、併記しています。

更にwpa-conf /etc/wpa_supplicant/wpa_supplicant.confを追記したのですけど、どうやらwpa_supplicantは全部のネットワークI/Fで読み込まれるみたいで、追記したら重複のエラーが出てしまったので省きました。なくても良いみたい。

wlan1をmanualとしているのは、hostapdで設定するからです。ちなみにwlan1は固定アドレス化しました。

/etc/dhcpcd.confの設定

次にdhcpcd.confに追記していきます。

ここではwlan1だけ固定アドレス化し、wpa_supplicantを使用しない設定にしています。

sudo nano /etc/dhcpcd.conf
interface wlan1
static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
nohook wpa_supplicant

次のhostapd.confでESSIDとか設定しますので、これでOKでした。

IPアドレスのセグメントは自分の環境に合わせてください。固定で2.2としています。最終的に接続できたら、このIPアドレスの接続と表示されれます。

はてな? はてな?
ルーターじゃないんだけどな。ピアツーピアだと2.1と出る。

dhcpcd.confはこれでOKです。

/etc/hostapd/hostapd.confの設定

hostapdは、インストールしてもマスクされ有効になっていません。

sudo systemctl unmask hostapd && sudo systemctl enable hostapd

confファイルを設定した後、startさせます。

sudo nano /etc/hostapd/hostapd.conf
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=wlan1
driver=nl80211
hw_mode=g
channel=1

wmm_enabled=1
country_code=JP
ieee80211ac=0
ieee80211d=1
ieee80211h=1
local_pwr_constraint=3
spectrum_mgmt_required=1

macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

ssid=wifi_ap
wpa_passphrase=wifinopass

この設定は、RSN(WPA2)の設定です。

USB型無線LAN子機によって異なります。最下部でSSIDやパスフレーズを設定しています。

この内容でアクセスポイント化したラズパイへスマホなどと繋ぐことになります。私はht_capab=は設定せずに利用しています。

使用しているUSB型無線LAN子機のスペックを詳しく知らないと設定するのが困難です。最低限の設定から変更してみましょう。

channelは被らないようにしてください。channel=0なら自動で割り当ててくれます。

WPA2の基本はこれ。

macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=YourPassPhrase
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

hostapd Linux documentation page — Linux Wireless documentation

オプションはセットになっている場合も多く注意が必要です。

#ht_capabを設定するならセットで

wme_enabled=1
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40]

各オプションの解説は、次のサイトがとっても分かりやすかったです。

Qiita

hostapd.conf 覚書 - Qiita /usr/share/doc/hostapd/examples/hostapd.conf.gz に記載されているコメントの日本語訳。 定義 AP(Access Point): 無線/有線 LAN サービスを提供するサーバーマシン。 STA…

WPA3(SAE)の例

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
driver=nl80211
ssid=WPA3
country_code=EN
channel=6
beacon_int=100
dtim_period=1
fragm_threshold=2346
rts_threshold=2347
hw_mode=g
ieee80211n=1
max_num_sta=16
wmm_enabled=1
ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][RX-STBC1][MAX-AMSDU-7935][DSSS_CCK-40]
ignore_broadcast_ssid=0

auth_algs=1
wpa=2
wpa_key_mgmt=SAE
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ieee80211w=2
sae_groups=19 20 21
sae_require_mfp=1
wpa_passphrase=1234567890

先程コマンドでマスクを外し有効にしたので、ここでhostapdをスタートさせておくか、dnsmasq.confを設定した後、最後にラズパイを再起動して適用させます。

デフォルトに設定

/etc/default/hostapdにあるDAEMON_CONF=に書き換えたconfファイルを指定し、コメントを外して有効にしておく。

DAEMON_CONF="/etc/hostapd/hostapd.conf"

/etc/dnsmasq.confの設定

次はdnsmasqです。

Rレッド Rレッド
この設定は少し自信がありません。
sudo nano /etc/dnsmasq.conf
bind-dynamic
no-dhcp-interface=wlan0

# DHCP経由で提供されるIPアドレス範囲を予め設定しておく
dhcp-range=192.168.2.2,192.168.2.20,255.255.255.0,24h

# ローカルDNSドメイン
domain=lanlan
# ルーターにするエイリアス
address=/gw.lanlan/192.168.2.1

interface=をwlan1やenp0s1などと設定するとexistエラーなので、省いたら上手くwlan1で動きました。

no-dhcp-interfaceに3A+側のwlan0を指定することで、wlan1へ動的バインドできている?と解釈しています。

このdnsmasqの設定も細かくたくさんあるため、あくまでも今回のWi-Fi <–> Wi-Fiでの設定で試行錯誤の末の内容です。

詳しい方がいらっしゃたら教えてください。

DNSドメイン以下2行は、無くても動作すると思います。

iptablesとIPv4フォーワーデイング

iptablesにポートルーティングとして、今回の上流であるwlan0を指定するとAP側もインターネットへ繋がるようになります。

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

# 保存する
sudo netfilter-persistent save

IPv4フォーワーデイングは、新たにconfファイルを作って保存します。

sudo nano /etc/sysctl.d/routed-ap.conf
# Enable IPv4 routing
net.ipv4.ip_forward=1

名前解決で困ったら

今回は設定しませんでしたが、名前解決でGoogleのネームサーバを追加している人も居るでしょう。

名前解決しないno-resolvと併記すると、名前解決できなかった時だけ指定されたネームサーバへ見に行くと読みました。

但し、resolv.conf を上書きするのを防いでから行う必要があるとのことです。(sudo chattr +i /etc/resolv.conf

今回はパスして記載していません。

no-resolv
# Google's nameservers, for example
server=8.8.8.8
server=8.8.4.4

https://wiki.archlinux.jp/index.php/ドメイン名前解決#.2Fetc.2Fresolv.conf_.E3.81.AE.E6.9B.B8.E3.81.8D.E8.BE.BC.E3.81.BF.E4.BF.9D.E8.AD.B7

3A+はイレギュラーだった

Raspberry Pi 3A+は、有線LANのポートが無い中でブリッジ接続やバインド接続するのに、これまでと少し勝手が違いました。

調べた中で、ブリッジ接続で有効かな?と思ったオプションもありました。でも、ダメだった。

OSがサポートしていないというエラーだったので、Raspberry Pi OSだけの問題なのかDebianがそうなのか分かりませんでした。

有線LANのポートを上流(インターネット接続)として、それをラズパイ内蔵のWi-Fiや、USB型無線LAN子機へブリッジしたりバインドするのはスムーズにこれまでもできました。

レイヤーの話など難しいので今回はパスし、仕方ないのでアクセスポイント化したという次第です。

もし、Wi-Fi 間でのブリッジ接続ができればまだ簡単だっただけに消化不良でした。またWi-Fi同士のブリッジは試してみたいと思います。

結果オーライということで、Wi-Fiの拡張用に電波が届くギリギリの所へ3A+を配置し、快適に使えています。

費用面では既製品に敵わなくなりましたが、遊んでいた3A+を再利用できて満足です。恐らくZero系でもできると思います。

3A+の使い道に困っているなら、Wi-Fi中継機というのはいかがでしょうか。

Rグリーン Rグリーン
お客さん用に最適かも