背景
うちの子供には学校からiPadが配布されています。学校側で夜8時から朝7時までは使用できない設定にして配布されているのですが、もっときめ細かい制限をかけたいと思っていました。例えば娯楽系のサイトは19時から20時までの間だけsafariで閲覧でき、勉強に利用するサイトはいつでもアクセス可能としたいのです。
市販の無線ルーターには特定のサイトへのアクセスを制限したり、特定の時間帯だけ接続を許可したりする機能がある機種もありますが、サイト毎・時間毎の両方の制限を実現することはルーターだけでは困難です。そこでRaspberry Piを無線ルーター化して、特定のサイトへのアクセスを特定の時間だけ許可する仕組みを作製してみました。
動作の概要
ルーター化したRaspberry Piでdnsmasqを実行してDNSサーバーとし、制限をかけたい時間帯は指定されたサイトが正しく引けないようにします。DNSシンクホールのようなものです。
こちらのサイトで、同じような仕組みを作製されている事例がありました。こちらの例では作者ご本人が特定の時間帯に特定のサイトにアクセスできなくなるように設定変更に手間がかかるようにされていますが、今回の目的にはそこまでガチガチの制限を掛ける必要はありませんでした(子供が自分でDNS設定を変えるという知識を得るまで大丈夫です)。
動作環境
機種 | OS | 動作 |
Raspberry Pi 3B | Raspberry Pi OS Lite (32-bit) (Bookworm) | × |
Raspberry Pi 3B+ | Raspberry Pi OS Lite (32-bit) (Bookworm) | ◯(注:32-bit OSです) |
Raspberry Pi 4 | Raspberry Pi OS Lite (64-bit) (Bookworm) | ◯ |
作業手順
OSインストールと最新化
macでRaspberry Pi Imager (v1.8.5) on macでmicro SDカードをEraseする。
Raspberry Pi OS Lite (64-bit) 2024-07-04リリース (Debian Bookworm)のイメージをmicro SDカードに焼く。このときwifiの設定は行ないません。
micro SDカードをRaspberry Piに挿入し、有線LANポートにLANケーブルを挿して、ケーブルの反対側をルーターのLANポートに接続します。
Raspberry Piの電源を入れ、macからRaspberry Piにsshで接続します。
ソフトウェアの最新化を行います。
$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot
無線LANをアクセスポイントとして設定する
bookwormでは、ネットワーク関係を司っているのはNetworkManagerです。NetworkManagerを使用して、Raspberry Piをアクセスポイントとして設定していきます。以下の設定ではHome-raguratedというssidでアクセスポイントを作成しています。好きな名前に変更してください。また、パスワードは以下の例ですと「password」の箇所になりますので、必ず変更してください。
$ sudo nmcli con add con-name hotspot ifname wlan0 type wifi autoconnect true ssid "Home-regulated" wifi-sec.key-mgmt wpa-psk wifi-sec.proto rsn wifi-sec.pairwise ccmp wifi-sec.psk "password" 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared ipv4.address 192.168.20.1/24
iPadの設定アプリからwifiを選択して、今作成したアクセスポイントに接続できるか確認します。
アクセス制限ファイルの作成
dnsmasqの設定ファイルに制限したいサイトを正しくない形で記述することで、サイトのIPアドレスが引けないようにします。設定ファイルは本来の場所とは別の場所においておき、cronによって制限したい時間帯だけ設定ファイルへのシンボリックリンクを作成することで目的を達成します。dnsmasqのDNS設定ファイルは/etc/etc/NetworkManager/dnsmasq-shared.d/
以下に配置します。dnsmasqはNetworkManagerの子プロセスとして自動的に起動されています。
任意の場所(例えば/home/pi/dns/
)にscratch.conf
などの名前で、DNSを引けないようにしたいサイトを記述した設定ファイルを次のような内容で作成します。
address=/sceatch.mit.edu/
同じ時間帯に複数サイトを制限したい場合は、次のようにします。
address=/www.instagram.com/
address=/x.com/
に上で作成したファイルへのシンボリックリンクを/etc/NetworkManager/dnsmasq-shared.d
/に作成します。
$ sudo ln -s /home/pi/dns/scratch.conf /etc/NetworkManager/dnsmasq-shared.d/scratch.conf
その後、NetworkManagerを再起動します。
$ sudo systemctl restart NetworkManager.service
iPadのsafariからscratch.mit.edu
にアクセスできなくなったことを確認します。(アクセスポイントが一度ダウンするので、自動的に別のwifiアクセスポイントに接続されてしまうかもしれません。)
時間帯アクセス制御
前の項目で作成したシンボリックリンクを時間によって削除、再作成することで特定の時間帯だけアクセスできないように制御することが可能となります。cronを使用して実現します。次のコマンドでcrontabを設定してください。初めてcrontab -eを実行する際にはどのエディタを使用するか聞かれます。nanoが最も簡単に操作できます。
$ crontab -e
以下のcrontabの例では、goraku.confに記載したサイトは16時から19時まで許可して、scratch.confに記載されたサイトは17時から20時まで許可します。
0 16 * * * sudo unlink /etc/NetworkManager/dnsmasq-shared.d/goraku.conf && sudo systemctl restart NetworkManager.service
0 19 * * * sudo ln -s /home/pi/dns/goraku.conf /etc/NetworkManager/dnsmasq-shared.d/goraku.conf && sudo systemctl restart NetworkManager.service
0 17 * * * sudo unlink /etc/NetworkManager/dnsmasq-shared.d/scratch.conf && sudo systemctl restart NetworkManager.service
0 20 * * * sudo ln -s /home/pi/dns/scratch.conf /etc/NetworkManager/dnsmasq-shared.d/scratch.conf && sudo systemctl restart NetworkManager.service
(16時や19時などのタイミングでwifiアクセスポイント自体がdown→upされるため、20秒間ほどネットワークが切断されます。)
無線の省電力制御の無効化
無線の省電力設定をoffにすることで、接続が安定します。
$ sudo iw dev wlan0 set power_save off
但し、再起動すると再び有効になってしまうため、crontabの@rebootを使用して起動時に省電力制御を無効化しておきました。
$ crontab -e
crontab設定に以下の1行を追加します。
@reboot sudo iw dev wlan0 set power_save off