Raspberry Piで
Wifiルータを作る
2016-07-15
サイボウズ・ラボ
西尾泰和
今回の目的
Raspberry PiをWifiアクセスポイントにする。
DHCPサーバもRaspberry Pi上で動かす。
そしてそのネットワークへのアクセスを、
既存のWifiにルーティングする。
その手順を一歩一歩確認しながらやることで
ネットワークの知識を深める。
2
前回のあらすじ
Wifiに接続できるチップESP8266EXについて
解説した。
しかし会社のWifiに接続できなかった。
3
おさらい
前回の資料:
Wifiにつながるデバイス(ESP8266EX, ESP-WROOM-02, ESPr Developerなど)
http://www.slideshare.net/nishio/wifiesp8266ex-espwroom02-espr-developer
ESP8266EX
Espressif Systemsの出しているWifiチップ
802.11 b/g/n、WPA/WPA2
Arduinoスケッチを書きこめる
4
http://espressif.com/en/products/hardware/esp8266ex/overview
おさらい
ESP-WROOM-02
ESP8266EXとアンテナとをセットにして
日本の技適マークを取得した、
日本で合法的に使えるWifiモジュール。
550円@秋月電子
5
http://akizukidenshi.com/catalog/g/gM-09607/
おさらい
APに接続してPING
AT+CWJAP=“ssid”,“password”
WIFI CONNECTED
WIFI GOT IP
OK
AT+PING=“www.google.com”
+6
OK
6
おさらい
HTTP
AT+CIPSTART=“TCP”,“www.google.com”,80
でGoogleのサーバの80番にTCP接続し
HTTPヘッダを送ればレスポンスが返ってくる
7
おさらい
ここまでのまとめ
Wifiのアクセスポイントに接続できる。
TCPでコネクションを張れる。
HTTPヘッダを送ってやれば
レスポンスが返ってくる。
8
おさらい
APにつながらないケース
AP接続後にDHCPでIPアドレスを得るのに
失敗している。
9
AT+CWJAP=“****”,“****”
WIFI CONNECTED(この後10秒以上)
WIFI DISCONNECT
+CWJAP:1
FAIL
理想と現実
理想:各種デバイスが既存のオフィスインフラ
(Wifiアクセスポイント)につながって
手軽に通信できる。
現実:DHCPに失敗してつながらない。
10
今回の目的(再掲)
Raspberry PiをWifiアクセスポイントにする。
DHCPサーバもRaspberry Pi上で動かす。
そしてそのネットワークへのアクセスを、
既存のWifiにルーティングする。
その手順を一歩一歩確認しながらやることで
ネットワークの知識を深める。
11
手順
• Raspberry Pi 3にWifiドングル追加
• IPアドレス固定
• hostapdでアクセスポイント化
• isc-dhcp-serverでDHCPサーバ化
• ルーティングの設定
12
Wifiドングル
BUFFALO 無線LAN子機 WLI-UC-GNM
Raspberry Pi 2を買ったときにWifi化のために一
緒に買ったWifiドングル
13
購入時にはまったく意識してなかったが「パソコン用
の無線LAN子機として使える子機モードと、パソコン
を無線LAN親機にしてゲーム機などを接続できる親機
モードの2つのモードに対応」「インターネット接続
状況を自動で判別してモード切替」とのこと。
https://www.amazon.co.jp/dp/B003NSAMW2/
IPアドレス固定
USBに刺すと/etc/network/interfacesに勝手に
設定が書き加わって設定済みのAPにつなぎに
行ってしまう。固定IPに書き換えておく。
終ったら ifdown wlan1 で一旦OFFにする
14
#iface wlan1 inet manual
# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface wlan1 inet static
address 192.168.10.1
netmask 255.255.255.0
アクセスポイント化
sudo apt-get install hostapd
/etc/hostapd/hostapd.conf に設定を置く
15
interface=wlan1
ssid=MyPi
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=raspberry
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
サンプルはdriverの設定が含まれており、デバイスに合わせてどう設定すべきか?
→「削除してもOK」という意見があり、試したら確かにその通りだった
他のデバイスではhostpadへのドライバの追加などが必要かもしれない
参考文献
How to Set up a Raspberry Pi as a
Wireless Access Point
https://www.maketecheasier.com/set-
up-raspberry-pi-as-wireless-access-
point/
実行
sudo hostapd -dd /etc/hostapd/hostapd.conf
(-dd: デバッグメッセージ多めで実行)
→アクセスポイント一覧で見えた
16
ESP8266でも一覧で見える:
AT+CWLAP
+CWLAP:(3,"MyPi",-41,"00:24:a5:a3:24:96",6,11,0)
接続しようとするとエラーになる:
AT+CWJAP="MyPi","raspberry"
WIFI CONNECTED
+CWJAP:1
FAIL
WIFI DISCONNECT
↑アクセスポイント一覧に
見えているが接続はエラーになる
DHCPサーバ化
sudo apt-get install isc-dhcp-server
/etc/dhcp/dhcpd.conf を編集:
option domain-name,
domain-name-serverのコメントアウト
authoritative のコメント外す
17
DHCPサーバ化
/etc/dhcp/dhcpd.confに下記を追記:
18
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.10 192.168.10.20;
option broadcast-address 192.168.10.255;
option routers 192.168.10.1;
default-lease-time 600;
max-lease-time 7200;
option domain-name "local-network";
option domain-name-servers 8.8.8.8, 8.8.4.4;
}
←先ほど設定した固定IPと
整合するように注意
詳細はこちら
How to Set up a Raspberry Pi as a Wireless Access Point
https://www.maketecheasier.com/set-up-raspberry-pi-as-wireless-access-point/
DHCPサーバ化
/etc/default/isc-dhcp-serverを編集:
INTERFACES="wlan1”
↑参考文献では有線LANとWifiを想定しているけ
ど今回はWifiが2つなのでこう変える必要がある
19
DHCPサーバ起動
sudo service isc-dhcp-server start
ESP8266で接続すると正しくIPが得られる:
20
AT+CWJAP="MyPi","raspberry"
WIFI CONNECTED
WIFI GOT IP
OK
AT+CIFSR
+CIFSR:STAIP,"192.168.10.11“
OK
PCから接続してみる
コマンドプロンプトでipconfigするとIPアドレス
がDHCPサーバから配られているのがわかる
21
接続固有の DNS サフィックス . . . . .: local-network
リンクローカル IPv6 アドレス. . . . .: (略)
IPv4 アドレス . . . . . . . . . . . .: 192.168.10.13
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.10.1
GUI上は「インターネット接続なし」
「制限あり」という表現になる
NAT(Network Address Translation)
wlan1と、インターネットに接続しているwlan0
との間でIPパケットの転送を行う
/etc/sysctl.confにnet.ipv4.ip_forward=1と加筆
IP転送を開始:
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
具体的に何をどこに転送するか指定:
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --
state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
22
インターネットに接続できた
23
AT+PING="www.google.com"
+3
OK
普通にTwitterができた
ESP8266からPINGが通った
予期せぬメリット
普段、ホテルや出先など「周りのネットワーク環
境が変わる」という状況でRasPiをいじるために
USBシリアル変換でシリアルコンソールに接続し
て使っている。
でもRasPiが固定IPでAPになるなら、PCからAPに
つないで、sshでログインするのもよいかも。
物理的なケーブルが必要なくなる。
24
補足
もちろんSSIDとパスワードは変更しました。
ついでにステルスSSIDにしておく:
ignore_broadcast_ssid=1
25

Raspberry Piで Wifiルータを作る