しいしせねっとわーく

Wi-Fiアクセスポイントを作るよ

RaspberryPiは3BからWi-Fiを搭載しているのでRaspberryPi 4 Model Bをアクセスポイントとして活用してみてもいいかと思ったのでなんとかしてみるテスト。IPv6も通るように。

接続計画

2019-12-08

RaspberryPi をWi-Fi APにしようとして出てくるのは大抵がルータにする記事で、時にはNATを設定してみたり、NAPT(IPマスカレード)の設定をしたりしていますがネットワークアドレスは別々になってしまいます。一方、市販のWi-Fiルータを使うと、ブリッジという機能で同じネットワーク上にEthernetとWi-Fiの子機が繋がります。

2つの役割を持っていますね。

一般的なご家庭用ルータには3つぐらいモードがありますがつぎのような感じ

機器によってAPモードや子機モードはルータ機能が生きているものとブリッジ機能だけのものがあります。モバイル系はルータ機能がオフにできないものが多いかもしれません。

とりあえず複雑怪奇です。

構成

RaspberryPiの記事でよく見るのはルータを設定するものです。ネットワークが別々になるのでDNSやDHCPも設定しているようです。誰も設定をつついてみたりはしませんよね…。だがサブネットワーク管理とか面倒くさいので却下。市販のルータと同じようにEthernetとWi-Fiを同一ネットワークとして設定する道を選びます。

Internet -るーた- LAN1 -- RaspberryPi A-- Wi-Fi -- RaspberryPi B -- LAN2 -- PCなど

こういうふうに作ってLAN1とLAN2を同じ1つのネットワークにしてみます。

RaspberyPi AをWi-Fi ブリッジにしてアクセスポイントにする、まではあります。RaspberryPi Bでその逆まではできるはずですが、チャレンジ。(注: できません)

Aには他の子機も繋ぐ予定です。るーたのWi-FiにBのWi-Fiで繋いでみる実験もするかもしれません。

参考

ブリッジ機能のみを設定できればデータ量は増えますがアドレスを専用に振る必要もなくGoogle Homeなども見通せて楽です。

ifconfig にwi-fi APが出てくれば、あとはブリッジの設定で繋ぐだけなので他のサイトを参考にできます。簡単。

構築

今回用意したもの

OS はRaspbian でNOOBS使わずFormatterも使わずbalenaEtcherで直接書き込む形だけです。有線、無線両方が使える環境ですが、有線でDHCP有りの環境にRaspberryPiを足してインターネットに繋がる想定。周辺機器はご自由に。

起動画面またはraspi-config で国地域を設定することでWi-Fiが利用可能になります。ホスト名、piのパスワードも設定、sshも有効にします。

ホスト名を設定すると ホスト名.local というあれで接続できるようになるかもしれません。ならないこともあります。

有線(Ethernet)無線(Wi-Fi)両方でルータに接続すると個別にIPアドレスが振られてどちらからもアクセスできました。有線(Ethernet)に繋ぐと無線(Wi-Fi)が無効になったりということはありません。

# ifconfig

でIPv4, IPv6で大量のアドレスが振られていることを確認しましょう。

# ip address

というのもあるのかな

とはいっても両方使うわけでもないので無線(Wi-Fi)側をAP(アクセスポイント)にして家中で電波が届けばいいかなというテストをしてみます。

# iw list

ではWi-Fiのいろいろが出てくるらしいです。

Supported interface modes: に AP というのがあるのだけ確認します。(謎

Wi-Fi AP作る ネットワークを仮想化してブリッジに繋ぐのか

# apt-get install bridge-utils

でブリッジ使えるユーティリティをインストールします。

# brutl show

とかいろいろできるごたごたは省略して

/etc/network/interfaces に次のを追加する(最低限記述すればいいところを探る)

auto eth0 iface eth0 inet static address 0.0.0.0 auto wlan0 iface wlan0 inet static address 0.0.0.0 auto br0 iface br0 inet dhcp bridge_ports eth0

/etc/dhcpcd.conf にも

denyinterface eth0
interface br0

を追加した。どこかが要らない気もするがあとで。

br0というブリッジをつくってeth0 を繋いでいるだけ。wlan0はhostapd の方で追加されるので同一ネットワークとして認識される予定。

IPアドレスはルータからDHCPで取得する。IPv6のアドレスの振り方も何故か変わった。

eth0 のMACアドレス ether の値を新しいIPv6アドレスに置き換えて接続するか、raspberrypi.local (ホスト名.local)に接続する。

再起動してみよう。IPアドレスは変わってしまい、Wi-Fiは繋がらなくなるようなので注意。

hostapd は使え

ルータにする場合でもブリッジにする場合でも、とりあえずWi-Fi APにするので hostapd というのを入れます。

# apt-get install hostapd

/etc/hostapd/
/etc/default/hostapd
/usr/share/doc/hostapd/

このあたりが設定ファイルとドキュメント、サンプル。

設定ファイルをコピーしたかったのですが、設定が多すぎるので他のひとが書いたものを参考にします。複数設定を作ることもできます。

2.4GHz用と5GHz用と2つつくっておきます。RaspberryPiの内蔵Wi-Fiでは同時に1つしか使えません。

5GHz帯用

/etc/hostapd/hostapd5.conf

interface=wlan0
bridge=br0
driver=nl80211
ssid=任意
country_code=JP
hw_mode=a
ieee80211d=1
ieee80211h=1
ieee80211n=1
wmm_enabled=1
ht_capab=[MAX-AMSDU-3839][HT40-][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]
ieee80211ac=1
vht_capab=[MAX-AMSDU-3839][SHORT-GT-80]
vht_oper_chwidth=0
channel=36
auth_algs=1
ignore_ht=0
wpa=2
wpa_passphrase=任意(8文字以上くらい)
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_group_rekey=86400
max_num_sta=3
macaddr_acl=0

2.4GHz帯用

/etc/hostapd/hostapd24.conf

interface=wlan0
bridge=br0
driver=nl80211
ssid=任意
country_code=JP
hw_mode=g
ieee80211d=1
channel=6
auth_algs=1
ignore_broadcast_ssid=0
disassoc_low_ack=1
ieee80211n=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
require_ht=0
wpa=2
wpa_passphrase=任意(8文字以上くらい)
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_group_rekey=86400
max_num_sta=3
wmm_enabled=1
macaddr_acl=0

細かいことはまだよくわからないので説明は省略します。ssidとwpa_passphraseを適度に設定します。

使いたい方を /etc/default/hostapd の DAEMON_CONFに追加します。

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

# systemctl unlock hostapd
# systemctl enable hostapd
# systemctl start hostapd

で動くはずです。

速度は5GHz帯は150Mbpsで繋がりました。日本の制限で帯域が狭いのかいろいろ謎です。

Wi-Fiクライアント側中継器

次はWi-Fi子機として動作し、Ethernetに繋がった機器を無線LAN側の親に中継する機能を持ったRaspberryPiを作ってみます。

参考

IP forwardの設定

/proc/sys/net/ip_v4/ip_forward に1を書き込みます。どこで書き込んでもいいのですが /etc/sysctl.confにある net.ipv4.ip_forward=1 のコメントを外すだけがいいようです。

再起動して有効にするまではテストで書き込んでもいいかもしれません。

確認

# sysctl net.ipv4.ip_forward

フラグ立て

# sysctl -w net.ipv4.ip_forward=1

# echo 1 > /proc/sys/net/ipv4/ip_forward

どっちでも可。この処理はAP側では不要なはずです。

dhcp-helper を入れてみます。