自宅Wi-Fi環境をいじって、SNSやネトゲの縛りから解放してあげたいと思ったんだ

ことの経緯
---

- 子供がネトゲばかりで勉強しないので困ってる、と友人が言ってた。
- ずっとSNS疲れを実感してて、ネット依存の自分を見つめ直したい。
- 世の中にはネット依存の人がわんさか。

とりあえず、自宅Wi-Fi環境に**あれやこれや接続制限**をかけてみようと思いました。

しっかり利用制限するなら、ペアレンタル・コントロール・アプリの導入や、SIMデータ通信プランの見直しが有効なのは言うまでもありません。

考え方は簡単
---
Free Wi-Fiを利用する時、ユーザ認証を経て一時的にネットが使える仕組みがありますよね。Captive Portalと言いますが、早い話それと同じシステムを自宅で構築しようという試みです。

接続制限は

- 何時から何時まで使えるようにする。
- **一日何時間まで使える**ようにする。
- それらの組み合わせ
- 他にもいろいろ

といった感じになります。
**一日に何時間まで**といったルータ機能がなかなかないんですよね。


システム構成
---
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/51fc36a4-e5ac-fb0a-e645-8e3c0dd420ed.png">



- 既存インターネット・ルータ(ルータA)の下に、接続制限するルータ(ルータB)をぶら下げます。クライアント側でどちらにするか振り分けます。
- ルータB（ラズパイ+[WN-G300UA](https://www.iodata.jp/product/network/adp/wn-g300ua/)）のファームウェアは[OpenWrt](https://openwrt.org/)を使い、Captive Portalのパッケージ[CoovaChilli](https://github.com/coova/coova-chilli)をインストールします。Wi-Fi APへ接続した時に認証画面を表示し、認証サーバへ取り次ぎをします。
- 認証サーバは[IronWifi](https://www.ironwifi.com/)のサービスを利用します。機能は[FreeRADIUS](https://freeradius.org/)がベースになっています。無料で1アクセスポイント、10ユーザまで利用できます。[IronWifi - Captive Portal Demos](https://www.ironwifi.com/captive-portal-demos/)でデモできます。本当はOpenWrtでFreeRADIUSをインストールできるようですが、私には難しそうなので外部サービスを利用することにしました。



いざ実装
---

1. ironwifiの設定
---

####(A). サインアップします

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/59cef376-7a4a-9dd1-5049-f652dc5da678.png">

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/74af4d7d-bcad-fe1d-a5e0-402a970fad65.png">

**Vendor**を**CoovaChilli**にします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/be5e4af3-010f-f67d-e4ee-7c735235b02a.png">

**Region**を**Tokyo(asia-northeast1)**にします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/84791daa-3de6-9e94-b7f4-d7448463f0a2.png">

メール認証します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/03711f64-6717-904a-7cf2-581358b74a76.png">

メール認証後、メーンページが表示されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/fdc774e2-cbcb-80ad-6074-989825169d0e.png">


####(B). Networksを設定をします

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/653aea19-2d03-f459-c349-b29d9562ff0a.png">

**Name**(ネットワーク名)を入力します。ルータの識別名です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/ec4a5067-f48d-b126-3645-c7d0329e1577.png">

登録されました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/bb0b792b-c04c-9090-369c-d13f427b16e1.png">

詳細情報を確認します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/20a753b3-ae0a-5b2e-4fa8-90f1944252a8.png">

####(C). Captive Portalsを設定をします

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/660b3f90-e62c-0550-3bb0-fb7e6b6e31cc.png">

**Name**(最初に表示されるログイン・ページの名前)を入力します。
**Network**は、**(B)で登録したネットワーク名**を指定します。
**Vendor**を**CoovaChilli**を指定します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/ba1ac5b5-30fe-21cc-6fab-f5fa544d7e9d.png">

登録されました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/d81fcfef-ae57-5298-70e0-e0494a84b337.png">

詳細情報を確認します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/b14ee6c3-9023-f9d7-20f6-89e0790fe3aa.png">

**Authentication Providers**を**Local Account**にします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/46a3a419-4c32-923d-8b25-d23e14195716.png">

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/fec29762-bcc5-b8e6-3802-59b958477c38.png">

登録されました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/bd254513-d05c-1685-7b5f-e5d043628f32.png">


####(D). Usersを設定をします

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/cb45c6d5-b9e9-48f9-2d24-899f73e7bfd5.png">

**Username**(ユーザのログイン名)を入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/840d5c09-5b4b-bb8c-49e2-516608ddd347.png">

詳細情報が表示されます。
**Authentication Source**(認証方式)を**local**にします。
**Password**を設定します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/a89d08dd-7839-b1aa-71dc-ba1abc759d84.png">


ラズパイ、WN-G300UA、OpenWrt、CoovaChilliをインストールします
---

参考：

- [GitHub - coova/coova-chilli - releases](https://github.com/coova/coova-chilli/releases)
- [GitHub - coova/coova-chilli - INSTALL](https://github.com/coova/coova-chilli/blob/master/INSTALL)
- [にたまご。- Coova Chilli 1.4のインストール方法](http://ao780.hateblo.jp/entry/2018/01/12/220053)


####(A). [ラズパイとWN-G300UAとOpenWrtを、しなやかに融合させてみた（ルータモード編）](https://qiita.com/somainit/items/20803878ee36bd26ed42) の通りにインストールします

####(B). CoovaChilli 1.4をインストールします

```shell-session
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install tar grep diffutils patch
root@OpenWrt:~# opkg install libustream-openssl ca-bundle ca-certificates
root@OpenWrt:~# opkg install gcc autoconf automake libtool-bin make

root@OpenWrt:~# opkg install tcpdump kmod-tun
root@OpenWrt:~# opkg remove  wpad-mini
root@OpenWrt:~# opkg install wpad

root@OpenWrt:~# wget https://sources.lede-project.org/gengetopt-2.22.6.tar.gz
root@OpenWrt:~# tar zxvf gengetopt-2.22.6.tar.gz
root@OpenWrt:~# cd gengetopt-2.22.6

root@OpenWrt:~gengetopt-2.22.6# sh ./configure --prefix=
root@OpenWrt:~gengetopt-2.22.6# make
root@OpenWrt:~gengetopt-2.22.6# make check
root@OpenWrt:~gengetopt-2.22.6# make install

root@OpenWrt:~# cd
root@OpenWrt:~# wget https://github.com/coova/coova-chilli/archive/1.4.tar.gz -O coova-chilli-1.4.tar.gz
root@OpenWrt:~# tar zxvf coova-chilli-1.4.tar.gz
root@OpenWrt:~# cd coova-chilli-1.4

root@OpenWrt:~# wget https://raw.githubusercontent.com/openwrt/packages/master/net/coova-chilli/patches/100-fix_compile_kmod.patch
root@OpenWrt:~# wget https://raw.githubusercontent.com/openwrt/packages/master/net/coova-chilli/patches/200-fix-compile-with-musl.patch
root@OpenWrt:~# patch -p1 < 100-fix_compile_kmod.patch
root@OpenWrt:~# patch -p1 < 200-fix-compile-with-musl.patch

root@OpenWrt:~# ./bootstrap
root@OpenWrt:~# ./configure --enable-miniportal --prefix= --bindir=/usr/bin --sbindir=/usr/sbin --includedir=/usr/include
root@OpenWrt:~# make
root@OpenWrt:~# chmod 755 /usr/share/automake-1.15/install-sh
root@OpenWrt:~# make install
```

####(C). CoovaChilliの環境設定をします

```shell-session
root@OpenWrt:~# mkdir ironwifi
root@OpenWrt:~# cd ironwifi
```

Captive Portalsの設定ページからOpenWrt/CoovaChilli用設定ファイルをダウンロードします。ダウンロード・リンク名は**Defaults**と**Chilli Init Script**ですが、実際のファイル名はそれぞれ**defaults**と**chilli**になります。

1ページ目
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/52681320-e7ff-ff66-a81d-191d96d0447b.png">
2ページ目
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/df895cca-bb38-fc1d-38ea-bafc58377fca.png">

ダウンロードした**chilli**と**defaults**を環境に合わせて修正します。
その際ダウンロードしたファイルに**^M**がある場合はすべて削除します。

```shell-session
root@OpenWrt:~/ironwifi# chmod 755 chilli
root@OpenWrt:~/ironwifi# cp -p chilli chilli.org
root@OpenWrt:~/ironwifi# cp -p defaults defaults.org
root@OpenWrt:~/ironwifi# vi chilli
```

（変更前）

```shell:~/ironwifi/chilli
config_load hotspot > /etc/chilli/config
```

（変更後）

```shell:~/ironwifi/chilli
#config_load hotspot > /etc/chilli/config
```

```shell-session
root@OpenWrt:~/ironwifi# vi defaults
```

（変更前）

```shell:~/ironwifi/defaults
HS_WANIF=eth1              # WAN Interface toward the Internet
```

（変更後）

```shell:~/ironwifi/defaults
HS_WANIF=br-lan            # WAN Interface toward the Internet
```

設定ファイルを修正したものに置き換えます。

```shell-session
root@OpenWrt:~/ironwifi# mv /etc/chilli/defaults /etc/chilli/defaults.org
root@OpenWrt:~/ironwifi# cp defaults /etc/chilli/defaults
root@OpenWrt:~/ironwifi# ln -s /etc/chilli/defaults /etc/chilli/config
root@OpenWrt:~/ironwifi# mv /etc/init.d/chilli etc-init.d-chilli.org
root@OpenWrt:~/ironwifi# mv chilli /etc/init.d/chilli
root@OpenWrt:~/ironwifi# reboot
```

OS起動時に自動でプロセスchilliが自動実行されるようにします。

```shell-session
root@OpenWrt:~# /etc/init.d/chilli start
root@OpenWrt:~# /etc/init.d/chilli enable
```

####(D). スマホで動作確認をします

Wi-FiのSSID **OpenWrt** を選択し、そのパスワードを入力します。
すると **Wi-Fiネットワークにログイン OpenWrt** が表示されるのでそれを選択します。
その後IronWifiで設定したユーザ名とパスワードを入力すると通常通りネット接続できます。

|:one:|:two:|:three:|
|:--:|:--:|:--:|
|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/43b8aa45-945a-a6b9-9e7a-6f7a9079a7d0.png">|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/ed4701e4-37a0-126f-c61d-d69b2f5c88d9.png">|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/9e5093bc-8d4d-f811-2bdc-4895d86b20bb.png">|
|:four:|||
|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/1167ee03-b05c-8356-e1d5-e9e295920194.png">|||


####(E). IronWifiで接続制限をかけます

参考：

- [IronWifi - Attributes](https://www.ironwifi.com/user-guide/attributes/)

Usersの設定ページのAttributesで接続制限の設定をします。

1ページ目
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/0fc3998e-9924-8dfb-8afc-38026930c1ef.png">

2ページ目
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/bb5d739f-f4e9-9a6d-4a74-084301104f12.png">

:one:一日の接続時間を **1時間=60分=3600秒** に制限する。

|ATTRIBUTE|TABLE|OPERATOR|VALUE|
|:--:|:--:|:--:|:--:|
|Max-Daily-Session|radcheck|:=|3600|
|Session-Timeout|radcheck|:=|3600|

:two:接続時間帯を **「19:00-20:30 JST」=「10:00-11:30 UTC」** に制限する。

参考：

- [時差時間 - JST / UTC の変換と時差の計算](https://www.jisakeisan.com/?t1=jst&t2=utc)

|ATTRIBUTE|TABLE|OPERATOR|VALUE|
|:--:|:--:|:--:|:--:|
|Login-Time|radcheck|:=|Al1000-1130|

:three:時間帯 **「19:00-20:30 JST」=「10:00-11:30 UTC」** のうち、**1時間=60分=3600秒** 接続できるようにする。 

|ATTRIBUTE|TABLE|OPERATOR|VALUE|
|:--:|:--:|:--:|:--:|
|Max-Daily-Session|radcheck|:=|3600|
|Session-Timeout|radcheck|:=|3600|
|Login-Time|radcheck|:=|Al1000-1130|

結び
---
あれこれと解放されたい気持ちでいっぱいです。(=^・^=)