Raspberry Pi で 無線ルータを作ります。
Raspberry Pi 3 や Raspberry Pi Zero W の場合は内蔵で Wi-Fi 機能が入ってますが今回はその機能を使いません。
こちらを使います。
BUFFALO WI-U2-433DM。802.11acのUSBドングルです。
RaspberryPiにWi-Fiドングルを刺して使おうとしても、不安定なことが多いのですが、これはいろいろ検証の結果、安定して使えるものです。
参考にしたサイト
環境
$ cat /etc/issue
Raspbian GNU/Linux 8 \n \l
$ uname -a
Linux raspberrypi 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
ちょっと前のRaspbian
作業
まずは、オンボードのWi-Fiを切る。
sudo iwconfig wlan0 txpower off
sudo reboot
再起動してから確認。
ifconfig
eth0 Link encap:イーサネット ハードウェアアドレス b8:27:eb:4e:68:13
inetアドレス:192.168.42.1 ブロードキャスト:192.168.42.255 マスク:255.255.255.0
inet6アドレス: fe80::8c27:2c04:1750:9b0c/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:2942 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:2993 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:452726 (442.1 KiB) TXバイト:2100986 (2.0 MiB)
eth0:1 Link encap:イーサネット ハードウェアアドレス b8:27:eb:4e:68:13
inetアドレス:169.254.12.25 ブロードキャスト:169.254.255.255 マスク:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
eth1 Link encap:イーサネット ハードウェアアドレス 98:f1:99:7f:9d:79
inetアドレス:192.168.179.2 ブロードキャスト:192.168.179.255 マスク:255.255.255.0
inet6アドレス: fe80::e3d2:ef35:8418:f30/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:3075 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:2881 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:2052042 (1.9 MiB) TXバイト:608318 (594.0 KiB)
切れてます。では8821AUのドライバをインストールしていきます。
$ git clone https://github.com/abperiasamy/rtl8812AU_8821AU_linux.git
Cloning into 'rtl8812AU_8821AU_linux'...
remote: Counting objects: 1557, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 1557 (delta 4), reused 4 (delta 4), pack-reused 1544
Receiving objects: 100% (1557/1557), 3.56 MiB | 629.00 KiB/s, done.
Resolving deltas: 100% (958/958), done.
Checking connectivity... done.
pi@raspberrypi:~/433DM $ ls
rtl8812AU_8821AU_linux
pi@raspberrypi:~/433DM $ cd rtl8812AU_8821AU_linux/
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ vim Makefile
architecture を i386をnにして、arm_rpiをyにする。
make するけどエラー。
$ make
make ARCH=arm CROSS_COMPILE= -C /lib/modules/4.9.24-v7+/build M=/home/pi/433DM/rtl8812AU_8821AU_linux modules
make[1]: *** /lib/modules/4.9.24-v7+/build: そのようなファイルやディレクトリはありません. 中止.
Makefile:1584: recipe for target 'modules' failed
make: *** [modules] Error 2
real 0m0.078s
user 0m0.020s
sys 0m0.000s
kernel source をインストール
pi@raspberrypi:~/433DM $ sudo wget "https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source" -O /usr/bin/rpi-source
--2017-11-10 09:43:04-- https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.88.133
raw.githubusercontent.com (raw.githubusercontent.com)|151.101.88.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 12672 (12K) [text/plain]
`/usr/bin/rpi-source' に保存中
/usr/bin/rpi-source 100%[=====================>] 12.38K --.-KB/s 時間 0.01s
2017-11-10 09:43:05 (830 KB/s) - `/usr/bin/rpi-source' へ保存完了 [12672/12672]
pi@raspberrypi:~/433DM $ sudo chmod 755 /usr/bin/rpi-source
pi@raspberrypi:~/433DM $ rpi-source
*** Updating rpi-source
--2017-11-10 09:43:45-- https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.88.133
raw.githubusercontent.com (raw.githubusercontent.com)|151.101.88.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 12672 (12K) [text/plain]
`/usr/bin/rpi-source' に保存中
/usr/bin/rpi-source 100%[=====================>] 12.38K --.-KB/s 時間 0.08s
2017-11-10 09:43:46 (161 KB/s) - `/usr/bin/rpi-source' へ保存完了 [12672/12672]
*** Set update tag: 0981c097215848b068a2d7ede5c348d68a8d486b
*** Restarting rpi-source
*** gcc version check: OK
ERROR:
bc is NOT installed. Needed by 'make modules_prepare'. On Raspbian, run 'sudo apt-get install bc' to install it.
Help: https://github.com/notro/rpi-source/wiki
pi@raspberrypi:~/433DM $ cd rtl8812AU_8821AU_linux/
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ make
make ARCH=arm CROSS_COMPILE= -C /lib/modules/4.9.24-v7+/build M=/home/pi/433DM/rtl8812AU_8821AU_linux modules
make[1]: *** /lib/modules/4.9.24-v7+/build: そのようなファイルやディレクトリはありません. 中止.
Makefile:1584: recipe for target 'modules' failed
make: *** [modules] Error 2
bcが無くてえら
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ sudo apt-get install bc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
bc
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
96.3 kB のアーカイブを取得する必要があります。
この操作後に追加で 195 kB のディスク容量が消費されます。
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main bc armhf 1.06.95-9 [96.3 kB]
96.3 kB を 2秒 で取得しました (45.1 kB/s)
以前に未選択のパッケージ bc を選択しています。
(データベースを読み込んでいます ... 現在 38306 個のファイルとディレクトリがインストールされています。)
.../bc_1.06.95-9_armhf.deb を展開する準備をしています ...
bc (1.06.95-9) を展開しています...
もう一度
$ rpi-source
*** gcc version check: OK
*** Using: /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz
*** Latest firmware revision: cb0b0ad6d11ddd251327303a97ba26a43e6b5b4b
*** Linux source commit: ef3b440e0e4d9ca70060483aa33d5b1201ceceb8
*** Download kernel source
--2017-11-10 09:45:21-- https://github.com/raspberrypi/linux/archive/ef3b440e0e4d9ca70060483aa33d5b1201ceceb8.tar.gz
・
・
・
HOSTCC scripts/conmakehash
HOSTCC scripts/recordmcount
HOSTCC scripts/sortextable
*** ncurses-devel is NOT installed. Needed by 'make menuconfig'. On Raspbian sudo apt-get install libncurses5-dev
*** Help: https://github.com/notro/rpi-source/wiki
makeする
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ make
make ARCH=arm CROSS_COMPILE= -C /lib/modules/4.9.24-v7+/build M=/home/pi/433DM/rtl8812AU_8821AU_linux modules
make[1]: Entering directory '/home/pi/linux-ef3b440e0e4d9ca70060483aa33d5b1201ceceb8'
CC [M] /home/pi/433DM/rtl8812AU_8821AU_linux/core/rtw_cmd.o
CC [M] /home/pi/433DM/rtl8812AU_8821AU_linux/core/rtw_security.o
CC [M] /home/pi/433DM/rtl8812AU_8821AU_linux/core/rtw_debug.o
CC [M] /home/pi/433DM/rtl8812AU_8821AU_linux/core/rtw_io.o
CC [M] /home/pi/433DM/rtl8812AU_8821AU_linux/core/rtw_ioctl_query.o
CC [M] /home/pi/433DM/rtl8812AU_8821AU_linux/core/rtw_ioctl_set.o
・
・
・
Building modules, stage 2.
MODPOST 1 modules
CC /home/pi/433DM/rtl8812AU_8821AU_linux/rtl8812au.mod.o
LD [M] /home/pi/433DM/rtl8812AU_8821AU_linux/rtl8812au.ko
make[1]: Leaving directory '/home/pi/linux-ef3b440e0e4d9ca70060483aa33d5b1201ceceb8'
数分で終わった
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ ls -alh *.ko
-rw-r--r-- 1 pi pi 1.8M 11月 10 09:55 rtl8812au.ko
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ sudo make install
install -p -m 644 rtl8812au.ko /lib/modules/4.9.24-v7+/kernel/drivers/net/wireless/
/sbin/depmod -a 4.9.24-v7+
インストールできたみたい
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ lsmod | grep 8812
rtl8812au 1282312 0
cfg80211 543027 2 rtl8812au,brcmfmac
pi@raspberrypi:~/433DM/rtl8812AU_8821AU_linux $ iwconfig
eth0 no wireless extensions.
wlan0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
eth1 no wireless extensions.
lo no wireless extensions.
wlan1 unassociated Nickname:"<WIFI@REALTEK>"
Mode:Managed 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
hostapd
Raspberry Pi の Raspbianにはhostapdがパッケージとして用意されているが、
$ sudo apt-cache policy hostapd
hostapd:
インストールされているバージョン: (なし)
候補: 1:2.3-1+deb8u5
バージョンテーブル:
1:2.3-1+deb8u5 0
500 http://mirrordirector.raspbian.org/raspbian/ jessie/main armhf Packages
バージョンが古いので
これに基づいて設定する
「Raspberry Pi / Banana Pi / Orange Pi / NanoPi などの Pi 系ボードでつくるニセアクセスポイント」
https://qiita.com/nanbuwks/items/c75f5ff8608e2060416a
なお、固定アドレスにするには記事とは異なり、以下のようにした。
IPアドレスの設定
「Raspberry Pi / Banana Pi / Orange Pi / NanoPi などの Pi 系ボードでつくるニセアクセスポイント」
https://qiita.com/nanbuwks/items/c75f5ff8608e2060416a
では /etc/network/interfaces を使って設定したが、
いまどきのRaspbianでは/etc/dhcpcd.confを使って設定する。
interface eth0
static ip_address=192.168.42.1/24
interface wlan1
static ip_address=192.168.42.254/24
としてみた。
sudo hostapd /etc/hostapd/hostapd.conf &
としてクライアントから繋ぐと・・・つながらない。
コンソールに以下のような表示が出ている。
wlan1: AP-STA-DISCONNECTED 64:80:99:6c:d8:ec
wlan1: STA 64:80:99:6c:d8:ec IEEE 802.11: associated
wlan1: AP-STA-CONNECTED 64:80:99:6c:d8:ec
wlan1: STA 64:80:99:6c:d8:ec RADIUS: starting accounting session 54EB32C50552E9B9
wlan1: STA 64:80:99:6c:d8:ec WPA: pairwise key handshake completed (RSN)
wlan1: STA 64:80:99:6c:d8:ec IEEE 802.11: disassociated
wlan1: AP-STA-DISCONNECTED 64:80:99:6c:d8:ec
wlan1: STA 64:80:99:6c:d8:ec IEEE 802.11: associated
wlan1: AP-STA-CONNECTED 64:80:99:6c:d8:ec
wlan1: STA 64:80:99:6c:d8:ec RADIUS: starting accounting session B7162712FD1494C8
wlan1: STA 64:80:99:6c:d8:ec WPA: pairwise key handshake completed (RSN)
wlan1: STA 64:80:99:6c:d8:ec IEEE 802.11: disassociated
wlan1: AP-STA-DISCONNECTED 64:80:99:6c:d8:ec
isc-dhcp-serverが動いていなかったので再起動するとつながった。
しかし今度はつながっても通信ができない。
家庭用ルータだと、無線インターフェースも有線インターフェースも1つのIPアドレスを使っているが、今回は別々のIPアドレスを使っている。ルーティングやらiptablesの設定やらをしたら今のままでも使えるのだろうけれども、1つのIPアドレスで使えるように設定してみた。
まず、/etc/dhcpcd.confを以下のように修正。
#interface eth0
#static ip_address=192.168.42.1/24
#interface wlan1
#static ip_address=192.168.42.254/24
denyinterfaces eth0 wlan1
interface br0
static ip_address=192.168.42.1/24
static routers=192.168.179.1
static domain_name_servers=192.168.179.1
次に、/etc/network/interfacesを以下のように直した。
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet manual
auto eth0:1
iface eth0:1 inet static
address 169.254.12.25
netmask 255.255.0.0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
auto br0
iface br0 inet manual
bridge_ports eth0, wlan1
bridge_stp off
bridge_maxwait 3
そうすると、うまくつながるようになりました。
まだDNSがうまく配信できないけど、今回はローカルサーバにだけアクセスさせるからこれでいいかな。