Raspberry pi 4を無線の中継機(AP)にする手順

この記事は約26分で読めます。
スポンサーリンク

先日の「ビットコイン自動売買Botの週次結果」の記事・・・いつもは土曜日に投稿するのですが・・・

金曜日と土曜日と勘違いして投稿していた!!!お盆あるあるですね。

さて、本日は「Raspberry pi 4を無線の中継機(AP)にする手順」紹介します。

最終的な構成

Raspberry pi 4をAPアクセスポイント(中継機)として使うことができます。

[インターネット]-[ブロードバンドルータ]-192.168.1.0/24-(Wi-Fi)-[Raspberry pi(AP)]-(Wi-Fi)-192.168.2.0/24-(Wi-Fi)-[クライアント]

上記の構成が実現できます。192.168.1.0/24は私のホームネットワークで、192.168.2.0/24は今回新たに構築するRaspberry piがWi-Fiで受け付けるネットワークです。

  • クライアントはネットワーク情報(自身のIP/GW/DNS)をpiから自動的に取得(DHCP)
  • piはクライアントの通信を、自身のIPでインターネット側に送信(IP マスカレード)

前提(事前準備)

192.168.1.0/24からインターネットまでの構成は事前に完了しておく必要があります。

ホームネットワークが192.168.1.0/24である必要はありません。違う場合は、以降の192.168.1.0/24を適宜自分の環境に置き換えてください。

そもそも、なぜ作ろうと思ったか

我が家のブロードバンドルータ&Wi-Fiルータはリビングの隅に置いており、ベッドルームまで無線が届きません。

イメージ的には

リビング-扉-廊下-扉-ベッドルーム

なので、遮蔽物が多いため、ベッドルームまでWi-Fiが届かないのです。

そのため、数年前に以下のAP(中継機)を購入してベッドルーム側の扉の前に設置していました。

この製品、はっきり言って「全く使い物にならないレベル」でした。

具体的には

  • 1日に一回再起動(コンセントの抜き差し)をしないと通信が不安定になる
  • 通信が不安定になったら断続的にネットワークが止まる

デザインは気に入っていたのですが、そもそもの機能が不安定だと、ストレス溜まりまくりなのです。でも買っちゃったので、毎日コンセントを抜き差しして騙し騙し使っていました。

昨今のコロナ禍によって、ベッドルームでのリモートワークが増えました。仕事でネットワークが断続的に途切れるのは非常にまずい。

更に、以下の記事を見つけました。

TP-Link、Wi-Fi中継機によるNTPサーバーへのアクセスに関するコメントを公開
TP-Link Japanは12月20日、同社製のWi-Fi中継機がNTPサーバーへのアクセスを行っている事に関するコメントを公式Twitterアカウント公式サイト上で公開しました。TP-Link製無線LAN中継器によるNTPサーバーへのア

自社と関係ないNTPサーバーに定期的に通信してるって・・・ちょっと・・・

てな訳で、せっかくなので手持ちのRaspberry pi 4を使用してAPを作ろうと思ったのでした。

参考にさせていただいたサイト

以下のサイトが非常に参考になりました。ありがとうございます。

今回使用するUSBドングルをRaspberry piで認識させる手順を解説してくださっています。

基本的に上記の手順を踏襲しています。

購入した機材について

主な機材は以下の通り。

後はRaspberry pi 4関連のMicroSDとかUSB-Cアダプタとか。

全部合わせると1万円くらいかかるので、Raspberry pi 4を既に持ってる人じゃないとメリットないかもしれないですね。

Raspberry pi 4持ってるなら、USBドングルの800円くらいでAPが作れてしまう

Raspberry pi 4にはWi-Fiモジュールが組み込まれているのですが、それ以外に追加で1つWi-Fiモジュールが必要です。1つを上流(インターネット側)に繋いで、2つめをクライアント側に繋ぎます。

具体的な手順

では、いよいよ手順です。

事前準備

Raspberry pi 4の以下については事前に設定を済ませておいてください。

  • Raspbianのインストール
  • Raspberry pi 4に入ってるWi-Fiモジュールを使用して、上流(インターネット側)までの接続設定

上記は今回の設定とは直接関係ないので、ネットにゴロゴロと手順が転がってるはず。

WDC-150SU2MBKを認識させるまで

まずはWDC-150SU2MBKを購入します。私はAmazonで購入しました。

フラスとフリーパッケージで到着。

パッケージの前面です。このドングルは2.4GHz専用なので昨今の「超高速」とまではいきません。でも別室のクライアントレベルだと必要十分。

(これで脱中華アダプタができると思えば安い。800円くらいだし。)

パッケージの背面。

開けてみました。セットアップガイドと本体(ドングル)です。

今回はセットアップガイドは使用しません。

ドライバのCDも入っていましたが、こちらも使用しません。

こちらが本体です。めっちゃ小さい。

こちらをRaspberry pi 4に装着します。私のRaspberry pi 4はケースに入れていますが、別にむき出しでも大丈夫です。

何も考えずにUSBポートに差しました。青色に点灯しますが、この時点ではまだ利用できません。

差した直後に、lsusbでOS上でデバイスが認識されてるかを確認します。

pi@raspberrypi:~ $ lsusb | grep Elecom
Bus 001 Device 005: ID 056e:4008 Elecom Co., Ltd

上記の「Elecom」が表示されていたらOKです。

この時点でElecomが表示されなければ、ドライバをインストールする以前の問題です。追加のドライバーをインストールしなくてもElecomは表示されるはずです。

次に、ドングルのドライバをインストールします。こちらは上記のリンクを参考にさせて頂きました。

まずはuname -aでLinux raspberrypiのバージョンを確認。

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l GNU/Linux

4.19.118-v7l 1311となっているので、これに合うドライバを検索します。

ドライバのリンクを確認し、wgetで受信してtar解凍してinstall.shを叩くだけ。makeなどでコンパイルも不要。

wget http://downloads.fars-robotics.net/wifi-drivers/8188eu-drivers/8188eu-4.19.118-v7l-1311.tar.gz
tar xzf 8188eu-4.19.118-v7l-1311.tar.gz
pi@raspberrypi:~ $ ./install.sh
sudo install -p -m 644 8188eu.ko /lib/modules/4.19.118-v7l+/kernel/drivers/net/wireless
sudo depmod 4.19.118-v7l+

Reboot to run the driver.

If you have already configured your wifi it should start up and connect to your
wireless network.

If you have not configured your wifi you will need to do that to enable the wifi.

成功すると、以下の写真のようにUSBドングルが青色に点滅するはずです。

この時点でUSBドングルが青色に点滅していなければ、ドライバのインストールに失敗していると思ったほうが良いかもしれません。

(試しに違うバージョンのドライバをインストールしてみると、青色のランプが付かなくなりました。)

iwconfigでWi-Fiモジュールとして認識されているかを確認します。

pi@raspberrypi:~ $ iwconfig
eth0      no wireless extensions.

wlan0     IEEE 802.11  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

lo        no wireless extensions.

wlan1     unassociated  ESSID:""  Nickname:"<WIFI@REALTEK>"
          Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated
          Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

wlan0がRaspberry pi 4に組み込まれてるWi-Fiモジュールです。wlan1が今回追加したUSBドングルです。もしUSBドングルが認識されていなければwlan1が表示されないはず。

wlan1が表示されていれば、ひとまずOKです。

もしwlan1が表示されていなければ、この後の手順に進んでも意味がありません。

必ずwlan1が表示できるようにトラシューする必要があります。

必要なコンポーネントをインストールする

以下を実行し、dnsmasqとhostapdをインストールします。dnsmasqはクライアントにIPを割り振るDHCP的な機能、hostapdはWi-Fiアクセスポイントの機能みたいな感じで良いかと。

sudo apt-get install dnsmasq hostapd

この状態で、一旦リブートします。

sudo reboot

wlan1の自身のIP固定

ここまでで、再度wlanの関係をおさらいします。

  • wlan0:上流(インターネット側)のWi-Fi
  • wlan1:下流(クライアント、つまり自身がAP)のWi-Fi

wlan0の設定は特別なモノはありません。事前に設定を終わらせておいてください。この時点でRaspberry pi 4から「ping www.google.com」とかがつながらなければ、AP構成以前の問題なので治しておいてください。

さて、いよいよAP構成の手順です。

まずはwlan1の自身のIPを固定します。

/etc/dhcpcd.confの最後に、以下を追記します。

interface wlan1
 static ip_address=192.168.2.1/24
 static routers=192.168.2.1
 static domain_name_servers=192.168.2.1
 static broadcast 192.168.2.255

私の自宅の下流ネットワークは192.168.2.0/24で構成することにしました。また、自身(Raspberry pi 4)の固定IPは192.168.2.1としました。なので上記設定です。

くどいようですが、上記を構成すると、Raspberry pi 4自体は2つのIPを持つことになります。

  • wlan0(上流):192.168.1.33。これはインターネット向きのIP。事前に設定しているやつ。
  • wlan1(下流):192.168.2.1。これが今設定したやつ。

ネットでは「denyinterfaces wlan0」を入れろと書いてる記事もありましたが、私の環境では設定不要でした。というか「denyinterfaces wlan0」を入れたらネットワークモジュールが起動しなくなりました。

Raspberry pi 4をアクセスポイントとして設定

ようやくAPの設定っぽい設定です。

/etc/hostapd/hostapd.confを作成します。

interface=wlan1
driver=nl80211
ssid=MY-LAB
hw_mode=g
channel=3
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=Password

重要なのは以下の3点です。

  • interface:APにするWi-Fiインターフェース。今回はwlan1。wlan0じゃないですね。
  • ssid:クライアントに表示するSSID。上記構成だと、例えばiPhoneとかでWifiを検索すると「MY-LAB」が表示される。
  • wpa_passphrase:クライアントがWi-Fiを使用するときに入力するパスワード。

つまり、ssidとwpa_passphraseを、自分の好きなモノに設定してください。

次に、 /etc/default/hostapdを修正します。

# file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz
#
#DAEMON_CONF=""
DAEMON_CONF="/etc/hostapd/hostapd.conf"

# Additional daemon options to be appended to hostapd command:-

15行目くらいが上記です。DAEMON_CONFを先程作成したhostapd.confにします。

DHCPっぽい設定

Raspberry pi 4がAPになる設定ができてきました。

次はDHCPっぽい設定です。クライアントがRaspberry pi 4にアクセスしたときにIPを割り振るためです。

/etc/dnsmasq.confを修正します。

interface=wlan1
dhcp-range=192.168.2.2,192.168.2.100,255.255.255.0,24h

AP設定のときと同じくinterfaceにwlan1を設定します。

dhcp-rangeは、割り振るIPのレンジです。192.168.2.1は自身のIPなので、192.168.2.2から指定します。終わりは適当。24hはリース期間。このままでいいです。

ポートフォワード、IPマスカレード設定

デフォルトでは自分に着信したパケットをルーティング(素通り)しないので、ポートフォワード設定を行います。

/etc/sysctl.confを修正します。

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6

上記のnet.ipv4.ip_forward=1にします。

あとは、上記のサイトの通り、以下を実行。

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

次にIPマスカレード設定です。Raspberry pi 4に着信したパケットを、自身送信元としてインターネットに通信します。これによって192.168.1.0/24側の追加設定(192.168.2.0/24へのルーティング設定など)が不要になります。

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

なのですが、こちらは/etc/rc.localに入れてしまって、再起動時に必ず実行されるようにしました。(後述)

hostapdのunmask設定

上記リンクを参考に、以下のコマンドを実行します。

sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd

これをやらないと「ip a」とかでwlan1の固定アドレスが表示されないはず。

起動時のサービスなど設定

/etc/rc.localの最後に以下を追記します。

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sh -c "iptables-save > /etc/iptables.ipv4.nat"

service dnsmasq stop
sleep 8
service dnsmasq start
iptables-restore < /etc/iptables.ipv4.nat
sleep 3
service hostapd restart

exit 0

ポイントは「exit 0」の前に追記することです。上記の「exit 0」は既に記述されてるはず。

トラシューとか

ここまで正常に設定が完了すると、Raspberry pi 4をAPとして使用できるはずです。iPhoneとかから「MY-LAB」が表示されて、パスワードを入れるとネットとつながるはず。

でも、はじめから全て設定を正常に完了するのは困難かと。かなりの設定を行ったので。

なので、ここからは考えられる限りのトラシューをしてみます。

Raspberry pi 4からインターネットに繋がるか

これができないと、いくらAP設定を頑張ってもインターネットに繋がりません。

当然ですね。

pi@raspberrypi:~ $ ping www.google.com
PING www.google.com(nrt13s48-in-x04.1e100.net (2404:6800:4004:80e::2004)) 56 data bytes
64 bytes from nrt13s48-in-x04.1e100.net (2404:6800:4004:80e::2004): icmp_seq=1 ttl=116 time=7.18 ms
64 bytes from nrt13s48-in-x04.1e100.net (2404:6800:4004:80e::2004): icmp_seq=2 ttl=116 time=7.99 ms

googleとかに繋がっていなければ、まずは上流の(今回はwlan0)の設定を見直してください。DNSに問題があるかもしれないので、はじめはIPアドレスでのpingを試したほうが良いかもです。

pi@raspberrypi:~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether dc:a6:32:ab:b1:eb brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:ab:b1:ec brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.33/24 brd 192.168.1.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 240f:3e:3896:1:e718:532:8dc6:935e/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 294sec preferred_lft 294sec
    inet6 fe80::8497:d4d5:1478:aa5/64 scope link
       valid_lft forever preferred_lft forever

wlan0がしっかりIPを持っていて、インターネット側のG/Wに繋がるかも確認すること。インターネット側のGW(私の場合は192.168.1.1)へのPINGも確認するべき。

USBドングルの動作確認

OS上で認識しているか。

pi@raspberrypi:~ $ lsusb | grep Elecom
Bus 001 Device 003: ID 056e:4008 Elecom Co., Ltd

認識してなかったら物理的に差しなおす。

OS上でWi-Fiモジュールとして認識されてるか。

pi@raspberrypi:~ $ iwconfig
eth0      no wireless extensions.

wlan0     IEEE 802.11  ESSID:"aterm-a421cd-a"
          Mode:Managed  Frequency:5.22 GHz  Access Point: 6C:E4:DA:4F:C7:77
          Bit Rate=135 Mb/s   Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=49/70  Signal level=-61 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:28  Invalid misc:0   Missed beacon:0

lo        no wireless extensions.

wlan1     IEEE 802.11bg  ESSID:"MYODEN-LAB"  Nickname:"<WIFI@REALTEK>"
          Mode:Master  Frequency:2.422 GHz  Access Point: 04:AB:18:88:02:8C
          Bit Rate:54 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=69/100  Signal level=29/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

wlan1がなければ、ドライバーのインストールで失敗している可能性が高い。

私は試しに別のリビジョンのドライバを入れてみましたが、それだとiwconfigの表示もされませんでしたし、ドングルが青色に点滅しませんでした。

wlan1(下流側Wi-Fiデバイス)のIP設定

wlan1にIPが割り振られているか。

pi@raspberrypi:~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether dc:a6:32:ab:b1:eb brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:ab:b1:ec brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.33/24 brd 192.168.1.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 240f:3e:3896:1:e718:532:8dc6:935e/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 292sec preferred_lft 292sec
    inet6 fe80::8497:d4d5:1478:aa5/64 scope link
       valid_lft forever preferred_lft forever
4: wlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 04:ab:18:88:02:8c brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global noprefixroute wlan1
       valid_lft forever preferred_lft forever
    inet6 fe80::2f81:2a8f:d994:3f46/64 scope link
       valid_lft forever preferred_lft forever

私の場合はwlan1に192.168.2.1が割り振られています(自分でdhcpd.confで固定設定した)。もしここでwlan1が表示されていなければ、以下の可能性が高い。

  • そもそもUSBドングルが認識されてない
  • /etc/dhcpcd.confの設定不備
  • hostapdのunmask処理がされていない

特に3つめで私は一瞬ハマりました。これやってないとip aで見えないようです。

インストールしたサービスの稼働確認

サービスの稼働を確認する。

pi@raspberrypi:~ $ sudo systemctl status hostapd
● hostapd.service - Advanced IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP Authenticator
   Loaded: loaded (/lib/systemd/system/hostapd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-08-15 19:35:46 JST; 16h ago
  Process: 1012 ExecStart=/usr/sbin/hostapd -B -P /run/hostapd.pid -B $DAEMON_OPTS ${DAEMON_CONF} (code=exited, status=0/SUCCESS)
 Main PID: 1013 (hostapd)
    Tasks: 1 (limit: 4915)
   Memory: 608.0K
   CGroup: /system.slice/hostapd.service
           └─1013 /usr/sbin/hostapd -B -P /run/hostapd.pid -B /etc/hostapd/hostapd.conf
省略

Activeであることを確認。

pi@raspberrypi:~ $ sudo systemctl status dnsmasq
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-08-15 19:35:43 JST; 16h ago
  Process: 939 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)
  Process: 940 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=0/SUCCESS)
  Process: 949 ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf (code=exited, status=0/SUCCESS)
 Main PID: 948 (dnsmasq)
    Tasks: 1 (limit: 4915)
   Memory: 1.6M
   CGroup: /system.slice/dnsmasq.service
           └─948 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local
省略

こちらもActiveであることを確認。

Active出ない場合は、上記の設定ファイルの不備の可能性が高い。

クライアントがAPに繋がっても、インターネットに接続できない

例えばiPhoneでAPが見えて、パスワードも入れれて、左上にWi-Fiマークが表示(扇マーク)されてもインターネットにアクセスできない場合です。

当然ながら、上記を再度見直しましょう。特に「そもそもRaspberry pi 4がインターネットにアクセスできるか」は再確認。

次に、クライアントからRaspberry pi 4にアクセスできるかを確認します。

ping 192.168.2.1

上記を「クライアント」からやってみて、接続できるかを確認します(Raspbery pi 4からではなく)。

これで応答があるのにインターネットに接続できないということは「Raspberry pi 4にはアクセスできるのに、Raspberry pi 4が着信したパケットを上流に転送していない可能性が高い」ってことです。

となると、PortforwardかIPマスカレードの設定の可能性が高いので、そちらを再度確認してください。

まとめ

今回は「Raspberry pi 4をWi-FiのAP(中継機)にする」方法を紹介しました。

使用した機材は以下の通り。

速度・ネットワークの安定稼働って視点で、TP-LINKの時よりも劇的に改善しました。

コメント

タイトルとURLをコピーしました