野良Wi-Fiでコンテンツ配信2

提供: ディーズガレージ wiki
移動先: 案内検索
ホットスポットAP
ホットスポットAP
ホットスポットAP
ホットスポットAP
ホットスポットAP
  • 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

変更履歴

  • 2015.12.21 公開

参考

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/