PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやデータ分析などもやっています。

【Raspberry Pi】Raspberry Pi 3 Model BでCaptivePortalする方法

Raspberry PiでCaptivePortal

仕事でWi-Fiに接続したら何らかのコンテンツを表示することができないか?と考えて、いろいろ調べてみるとキャプティブポータル(CaptivePortal)が使えるのではないかと考えました。

そこで、今回はRaspberry PiWi-Fi機能を利用して、DHCPサーバーからIPアドレスをもらうときにスプラッシュ画面が表示されるようにしてみたいと思います。

注意

知識不足のため、iPhoneで接続したときにCaptivePortal画面が出てきません。
ただ、パソコンでは画面が出てくることを確認しています。
誰か、解決策を知っている方がいらっしゃいましたら、コメントいただけるとうれしいです。

環境

  • Raspberry Pi 3 Model B & Rasbian Jessie With Pixelで構築しています。

アップデート

ファームウェアを更新します。
$ sudo rpi-update
再起動します。
$ sudo reboot
最新状態にアップデートします。
$ sudo apt-get update
$ sudo apt-get upgrade

IPアドレス

IPアドレスを固定します。

$ sudo nano /etc/network/interfaces
以下のように書き換えます。
auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0

iface wlan0 inet static
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

#allow-hotplug wlan1
#iface wlan1 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Raspbian Jessie では、/etc/dhcpcd.confの一番下に追記します。
$ sudo nano /etc/dhcpcd.conf
interface wlan0
static ip_address=10.0.0.1
static routers=192.168.1.1
static domain_name_servers=10.0.0.1

AP

hostapdをインストールします。
$ sudo apt-get install hostapd
hostapd.confファイルを作成します。
$ sudo nano /etc/hostapd/hostapd.conf
interface=wlan0
ssid=Free Wifi
country_code=JP
ieee80211d=1
hw_mode=g
channel=11
auth_algs=1
wmm_enabled=0
hostapd設定を変更します。
$ sudo nano /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"
WPASupplicantを退避

WPASupplicantファイルが読み込まれないようにします。

$ sudo mv /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service ~/

DNSMASQ

DNSDHCPサーバーを設置します。
$ sudo apt-get install dnsmasq
dnsmasqの設定を変更します。
$ sudo nano /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,10m
no-resolv
log-queries
$ sudo update-rc.d dnsmasq defaults

iptables

$ sudo nano /etc/iptables/rules.v4
$ sudo iptables -A INPUT -i wlan0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A INPUT -i wlan0 -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -i wlan0 -p udp --dport 53 -j ACCEPT
$ sudo iptables -A INPUT -i wlan0 -p udp --dport 67:68 -j ACCEPT
$ sudo iptables -A INPUT -i wlan0 -j DROP
$ sudo iptables-restore < /etc/iptables/rules.v4
iptablesにルールが追加されているかを確認します。
$ sudo iptables --list

Nginxのインストー

$ mkdir nginx-1.8.0
$ cd nginx-1.8.0
$ 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 ~
$ sudo nano /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;

        error_page 404 http://10.0.0.1/index.html;

        location http://captive.apple.com/hotspot-detect.html {
               rewrite ^(.*)$ http://10.0.0.1/index.html last;
        }

        if ( $http_user_agent ~* (CaptiveNetworkSupport) ) { 
            return 302 http://10.0.0.1/index.html; 
        }

        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 nano /etc/php5/fpm/pool.d/www.conf
listen.owner = www-data
listen.group = www-data
listen.mode = 0666

自動起動設定

$ sudo nano /etc/rc.local

exit 0手前に追記

$ sudo /usr/local/nginx/sbin/nginx

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 nano /boot/cmdline.txt

変更箇所

rootfstype=ext4 elevator=deadline <span style="color:red">cgroup_enable=memory</span> rootwait

動作の確認
電源OFF

$ sudo shutdown -h now

パソコンで接続した場合には、自動的にブラウザが表示されてNginxのウェルカムページが表示されるはずです。

iPhoneではならず・・・。

おそらく、CaptivePortalチェックした場合にSuccessが返ってきてしまっているのではないかと考えています。
Nginx上で制御しているので、このあたりをもっと改善できればといろいろいじったのですが・・・。
結果は変わらず・・・。


DHCPサーバーからIPアドレスが得られているのがわかります。

※ 以下の記事を参考にさせていただきました。
野良Wi-Fiでコンテンツ配信2 - ディーズガレージ wiki
Raspberry Pi 2 (Raspbian: jessie) でIPアドレスを固定する - Qiita
Ubuntuでiptablesの設定をiptables-persistentで永続化する
Raspbian(jessie)の固定IPアドレス設定方法