RaspberryPiで野良Wi-FiのCaptivePortal
- iPhoneとiPadでしかデバック確認していません。
- 同時接続数をしばしば聞かれます。Wi-FiのUSBドングルは通常同時接続数10台程度です。dnsmasqのDNSリース期間を数十秒~数分にし、コンテンツはスマートフォン向けの一般的な手法で最初に全て読み込ませています。うまくいけばこれでサーバサイドの強制切断を繰り返し同時接続数を数倍~数十倍に増やせる理屈ですが検証してません。
- captive.apple.comを10.0.0.1に内部で書き換えて誘導しています。通常の公衆無線LANで使用する場合にキャッシュクリアされcaptive.apple.comまで到達できるか確認していません。
- CaptivePortalの調整はnginx.conf内だけで処理しています。アクセスログを見ると一連のアクセス動作の最後のCaptiveNetworkSupportのUserAgentでHTTPステータスコード200を返せばログイン状態になると思われます。また、ログインできてない状態でtarget="_blank"は無効になるようです。
- CaptivePortalをログイン状態にハックした場合、全てのhttpアクセスが見かけ上成功した状態なわけで、誤認識対処を整理する必要があります。現状のログインしてないがコンテンツをログイン画面に流し込む方法が邪道のようで正攻法のように感じます。
- SSIDの1クリックでコンテンツまで到達してしまいます。(雛形サンプルでは1クッション入れてます。)appleがCaptivePortal内のプログラム動作許可範囲をどうされてるか分かりません。結果危険な仕組みの使い方ヒントにもなってしまいそうです。責任は一切持てません。ご注意願います。
環境
RaspberryPi2 ModelBでシステムを構築し、完成したmicroSDカードをRaspberryPi A+またはPi Zeroに挿すことで動作するものを目指してみます。
RaspberryPi2 ModelBにWi-Fi、LAN、モニター、キーボード、マウスを取り付け、動いてる状態から進めてみます。
OSは2015-05-05-raspbian-wheezy.img
ファームウェア更新
$ sudo rpi-update
再起動
$ sudo reboot
最新状態にアップデート
$ sudo apt-get update
$ sudo apt-get upgrade
再起動
$ sudo reboot
IPの固定
設定
$ sudo leafpad /etc/network/interfaces
上書き
auto lo
iface lo inet loopback
iface wlan0 inet static
address 10.0.0.1
netmask 255.255.255.0
broadcast 255.0.0.0
パワーマネジメント機能解除
手持ちのアダプタはしばらく放っておくと反応が悪く感じます。
パワーマネジメント機能を持つアダプタがあるようです。機能をOFFにしてみます。
検証中
無線LANアクセスポイントの設定
インストール
$ sudo apt-get install hostapd
ドライバの確認
$ /sbin/lsmod
Module Size Used by
:
mac80211 622304 3 rt2x00lib,rt2x00usb,rt2800lib
:
以降使用するアダプタ(ドライバ)によって手順が変わる
今回は、mac80211ベース
8192cuの場合はこちら”様を参考
ダウンロード
$ wget http://w1.fi/releases/hostapd-2.0.tar.gz
$ tar xvf hostapd-2.0.tar.gz
コンパイルに必要なのでインストール
$ sudo apt-get install libnl-genl-3-dev libssl-dev
hostapdに移動、defconfigを.configとしてコピー、.configにCONFIG_LIBNL32=yを追加してからコンパイル
$ cd hostapd-2.0/hostapd
$ cp defconfig .config
$ echo CONFIG_LIBNL32=y >> .config
$ make
コンパイルされたhostapdでオリジナルのバイナリを置き換え
$ sudo mv /usr/sbin/hostapd{,.orig}
$ sudo mv hostapd /usr/sbin/
hostapd.confの設定
$ cd ~
$ sudo leafpad /etc/hostapd/hostapd.conf
新規作成
interface=wlan0
driver=nl80211
ssid=スマホDEバーチャル
country_code=JP
ieee80211d=1
hw_mode=g
channel=11
auth_algs=1
wmm_enabled=0
hostapdの設定
$ sudo leafpad /etc/default/hostapd
書き換え
DAEMON_CONF="/etc/hostapd/hostapd.conf"
WPASupplicantを無効
とりあえずホームディレクトリに移動
$ sudo mv /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service ~/
自動起動設定
$ sudo update-rc.d hostapd defaults
DNSとDHCPの設定
インストール
$ sudo apt-get install dnsmasq
設定
$ sudo leafpad /etc/dnsmasq.conf
末尾に追記
log-facility=/var/log/dnsmasq.log
address=/#/10.0.0.1
interface=wlan0
dhcp-range=10.0.0.10,10.0.0.254,2m
no-resolv
log-queries
自動起動設定
$ sudo update-rc.d dnsmasq defaults
iptablesの設定
インストール
IPv4 ルールは<はい>、IPv6 ルールは<いいえ>
$ sudo apt-get install iptables-persistent
設定
$ sudo leafpad /etc/iptables/rules.v4
上書き
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i wlan0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i wlan0 -p tcp --dport 80 -j ACCEPT
-A INPUT -i wlan0 -p udp --dport 53 -j ACCEPT
-A INPUT -i wlan0 -p udp --dport 67:68 -j ACCEPT
-A INPUT -i wlan0 -j DROP
COMMIT
自動起動設定
$ sudo update-rc.d iptables-persistent defaults
webサーバの設定
インストール
$ mkdir nginx-1.8.0
$ cd nginx-1.8.0
nginx v1.8.0 stable version
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar -zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0
$ sudo apt-get install curl build-essential libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev
$ ./configure
$ make
$ sudo make install
$ sudo apt-get install php5-fpm
$ cd ~
nginx.confの書き換え
$ sudo leafpad /usr/local/nginx/conf/nginx.conf
上書き
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
root /usr/local/nginx/html;
index index.php index.html index.htm;
server {
listen 80;
server_name localhost;
if ( $http_user_agent ~* (CaptiveNetworkSupport) ) {
return 302;
}
location /hotspot-detect.html {
rewrite ^(.*)$ /index.html last;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
}
}
}
PHPパーミッションエラー回避
$ sudo leafpad /etc/php5/fpm/pool.d/www.conf
変更部分
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
自動起動設定
$ sudo leafpad /etc/rc.local
末尾のexit 0手前に追記
sudo /usr/local/nginx/sbin/nginx
雛形の用意
バックアップ
$ sudo mv /usr/local/nginx/html/index.html ~/index.html_bak
$ sudo mv /usr/local/nginx/html/50x.html ~/50x.html_bak
ダウンロード
※このデータはライセンスがありますのでご注意ください。お試し程度でご利用ください。
sample-contents.zip
解凍しディレクトリに登録
$ cd ダウンロード
$ unzip yaroWiFi_sample-contents.zip
$ sudo cp -R sample-contents/. /usr/local/nginx/html/
$ sudo rm -rf sample-contents
OSの調整
syslogにavahiのwarning出てるのでサービス停止
$ sudo service avahi-daemon stop
$ sudo update-rc.d -f avahi-daemon remove
kernel lacks cgroups or memory controller not avaiable, not starting cgroups [warn]
$ sudo leafpad /boot/cmdline.txt
変更箇所
rootfstype=ext4 elevator=deadline <span style="color:red">cgroup_enable=memory</span> rootwait
動作の確認
電源OFF
$ sudo shutdown -h now
LAN、モニター、キーボード、マウスを取り外す
Wi-Fiだけにして電源ON
スマートフォン、タブレットなどでWi-Fiに接続してみる
問題なければRaspberryPi A+またはPi ZeroにmicroSDカードとWi-Fiを取り付け電源ON
参考
http://pancakeparfait.blog.fc2.com/blog-entry-6.html
http://andrewmichaelsmith.com/2013/08/raspberry-pi-wi-fi-honeypot/
http://blog.tonybox.net/blog/2013/03/31/doctor-who-style-wi-fi-with-sentient-captive-portal/
更新履歴
- 2015.12.21 公開