子どもとインターネット (一般の家庭内 LAN で手軽に子どもの通信を管理する)
2024年03月06日 水曜日
皆さんは、子どものインターネットの利用ルールってどのように決めているでしょうか。
文部科学省が提唱した GIGA スクール構想が実現され、今や小学校に入学すると 1人 1台、学校からノートパソコンやタブレットが配布される時代です。来年度 4月に小学校へ入学するお子さんをお持ちの親御さん、共通の悩みなのではないでしょうか。
登場人物
- 私
- 世界の悪と戦う一児の父親。
- 家庭内情報システム部 DX 担当部長、(兼)24時間パソコンなんでもお助けサポートセンター・カスタマーサクセス主任、(兼)白物家電お掃除担当
- 妻
- 150cm のロングヘアを持つ、どこにでもいる主婦。
- 髪を伸ばし続けた結果、ついに自身の身長を超えた。→ 前回
- 子
- 電車大好き小学生
- 2歳のイヤイヤ期が終わらないと思ったら、最近そのまま反抗期に突入した。どこに行ったエンジェル・フォー。
基本スタンス
まず、私の基本スタンスはこうです。
- インターネットは素晴らしい技術。いつでも知りたいことが調べられるし、いつでも世界中と繋がれる。自由に使って欲しい。(そして、お父さんはそういう技術に触れていたいと思って IIJ を目指したのだ)
- ただし、世界中と繋がるということは悪い人とも繋がる。世の中にワルい大人がいるように、インターネットにも悪い人がいる。(そして、お父さんは会社で毎日そういった悪と戦っているのだ)
- 困ったことがあった時にお父さんが助けられるよう、家の通信は記録(ログ)を取っている。普段は見ないが、仮にあなた(子ども)が困ったときに助けられるようにしているし、仮にあなたがインターネットで悪いことをしたら、調べればすぐ分かるようになっている。
- だからルールを守って、最大限に活用して欲しい。
このうち、3. だけは少し事前準備が必要です。
いずれ子どももパソコンを使う時代になるだろうとは思っていたものの、こんなに早く訪れるとは思っていませんでしたが、子どもが生まれた約 10年前、自宅のサーバに DNS サーバ(bind)と、プロキシサーバ(squid)を導入し、必ずこのサーバ経由でインターネットに出るように設計していました。さらに宅内の DHCP は MAC アドレスに紐づく固定 IP アドレスとしています。(※1)
しばらくこの状態で自宅の LAN を運用していましたが、特別何かをするではなく、何もしない平穏なプロキシサーバとして動いていました。
チャレンジタッチを契約したい
子どもが小学 2年生になったとき、妻がこう言いました。
「チャレンジタッチ」とは、ベネッセコーポレーション社が提供している電子教材で、毎月インターネットから教材をダウンロードし、専用のタブレット上で国語・算数などの演習問題を解いていくスタイルになっています。このときに決めた約束はこうです。
- ルールはとにかくシンプルにして自主性に任せる。
- 1. を守れなかった場合は、ルールを追加する。
- 2. を守れなかった場合は、さらにルールを追加する。
- それでも守れない場合は、技術的な制限を加える。
- それでも守れない場合は、さらに厳しい技術的な制限を加える。
- 守れるようになったら、逆の順序で少しずつルールを緩和する。
ルール1「自主性に任せる」
最初は最大限自主性に任せることにしました。
講座を契約する時に親子 3人で相談をして「1日 1学習コンテンツを計画的に進めよう」という点、「あまり長時間使うと目に良くないから目を休めよう」とだけ決めました。
しかし、学習コンテンツは進めるのですが、それはせいぜい 5分あれば終わるもの。しばらく日が経つと、時間も忘れて、たっぷり付属のゲームで遊び続けていました。声掛けはするものの、声掛けの基準がないと、こちらも注意しづらいものです。
ルール2「1日 1時間」
元々、チャレンジタッチには、電源を入れてから 30分が経過すると「30分たったよ! 休憩しよう!」というポップアップが出るようになっています。
小学 3年生にもなり、これを見て「あぁもう 30分か、休憩しよう」と、なれば何も苦労することはなかったのですが、我が子は颯爽と無視してダイアログを閉じ、付属のゲームで遊び続けていました。何度注意しても直そうとしません。
そこでルールを追加することにします。
ルール3「許可制にする」
「チャレンジタッチは妻の許可がないと使えない」というルールにしました。
宿題を先に済ませ、学校の支度など、その日にすべきことを終わらせてから、利用許可を求めなさいとするのです。すべてのタスクが終わっていることを確認し、妻が許可したらチャレンジタッチを触って良い、ということになりました。
しかし、これも最初だけで、3日目には親の目を盗んでコッソリチャレンジタッチを持ち出し、隠れて付属のゲームをするようになりました。全く効果がありません。
ルール4「使える時間帯を制限する」
さて、この記事の本題はここからです。
小学 4年生になって、チャレンジタッチは小学校に行く前の 30分、帰ってきてからの 30分くらいでいいよね、という約束を子どもとしました。しかし、そんなことは忘れ、朝の支度もせずにダラダラとゲームを続けていたり、帰宅して宿題もせずに電子図書館で電車の本を読み続けていました。何度注意しても直そうとしません。
そこで、言うことを守らないので「自動制限システムを導入する」と言って、技術的な制限を少し入れることにしました。
チャレンジタッチがインターネットに繋がるのは、次の時間帯のみとします。
- 平日は 06:00 〜 07:55 (登校のため家を出る時間) と、15:00 〜 20:00 まで。
- 休日は制限なし (ただし夜は 21:00 まで)
どうやら学習教材以外の一部のお楽しみコンテンツや、電子図書館にはインターネット接続が必須のようで、こうすることで上記の時間しか見れないようになります。学習教材はオフラインでも使えますので影響ありません。学習の取り組みメールもちゃんと届きます。
これは自宅のプロキシサーバに、通信を制御する iptables を cron で仕込んでおくだけで簡単に実現できます。
制限用の parental_control_block.sh と、解除用の parental_control_allow.sh を作成し、次のように仕込んでおきました。
これで時間に応じて自動的に繋がるようになったり、繋がらなくなったりできます。
- 制限用: https://github.com/ikoga/parental_control_set/blob/main/parental_control_block.sh
- 制限解除用: https://github.com/ikoga/parental_control_set/blob/main/parental_control_allow.sh
# crontab -l # Weekday 00 06 * * mon-fri /home/koga/bin/parental_control_allow.sh 55 07 * * mon-fri /home/koga/bin/parental_control_block.sh 00 15 * * mon-fri /home/koga/bin/parental_control_allow.sh 00 20 * * mon-fri /home/koga/bin/parental_control_block.sh # Weekend 00 06 * * sat,sun /home/koga/bin/parental_control_allow.sh 00 21 * * sat,sun /home/koga/bin/parental_control_block.sh # Monthly update 00 00 25 * * /home/koga/bin/parental_control_allow.sh
なお、一点注意が必要なのは、毎月 25日は教材の更新日になっており、深夜・早朝に自動で教材のアップデートが掛かります。この日だけ、日付が変わったらインターネットに出れるように空けておく必要があります。(※2)
もし、制限中にアクセスしようとすると、システムログに “PARENTAL_CONTROL:” という文字列が出てくるので、調べればすぐ分かります。
# fgrep PARENTAL_CONTROL: /var/log/firewall
2023-11-23T14:52:58.005179+09:00 server kernel: [8795060.436510][ C3] PARENTAL_CONTROL: IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=192.168.11.XX DST=192.168.11.XX LEN=83 TOS=0x00 PREC=0x00 TTL=64 ID=7639 DF PROTO=TCP SPT=56092 DPT=8080 WINDOW=1499 RES=0x00 ACK PSH URGP=0
ルール5「20分使ったら、3時間使えなくする」
ルール4 でしばらく運用していましたが、今度は使える時間内でダラダラ遊ぶことが増えました。さらに厳しい制限を入れると何度も予告し注意しても、直そうとしないばかりか、使い始めた時間にウソを付くようになりました。
よろしい、ならばこちらも本気を出そう。
小学 5年生からは、こういうルールにすることにします。
- 電源を入れてから 20分使うと、その後 3時間はインターネットに繋がらなくする
- 電源が入ったときと、電源が切れたときにメールで親に通知が届く
これは少しトリックが必要です。
そこで次のようなシェルスクリプトを書いてデーモンのように動かし続け、チャレンジタッチ端末の状態をポーリングし、オンラインになってから 20分後に制限用の iptables が発動するようにしました。
実行中の様子:
# /home/koga/bin/kids_admin.sh | tee -a /var/log/home/kids_admin.log 10/12/23 18:17 INFO: pinging 192.168.11.XX ... Device is down, waiting for next polling ... 10/12/23 18:22 INFO: pinging 192.168.11.XX ... Device was waking up at 18:22, will be shut at 18:42 10/12/23 18:42 INFO: Time is up at 18:42, shutting the target device (192.168.11.XX) 10/12/23 18:42 INFO: The next allowed time is 21:42 10/12/23 21:42 INFO: Too late night, good night, keep closing (略) 10/16/23 07:37 INFO: pinging 192.168.11.XX ... Device was waking up at 07:37, will be shut at 07:57 10/16/23 07:57 INFO: Time is up at 07:57, shutting the target device (192.168.11.XX) 10/16/23 07:57 INFO: The next allowed time is 10:57 10/16/23 10:57 INFO: Ok, it is allowed
メール通知と同時に、デバイスの電源が入っている時間帯を可視化するために、手っ取り早い MRTG を使いました。MRTG からシェルスクリプトを呼び出すことができますので、これを 5分間隔くらいで実行するように cron に仕込みます。ローカルの Postfix に sendmail コマンドで渡しているので、事前に ISP のアカウントで SMTP 認証してメールを送信できるよう、Postfix の設定をしておく必要があります。
まずは MRTG のインストールします。(openSUSE は Build Service 内 server:monitoring のレポジトリにあります)
# zypper addrepo https://download.opensuse.org/repositories/server:monitoring/15.5/server:monitoring.repo # zypper refresh # zypper install mrtg
kidsmonitor.cfg (MRTG の設定):
WorkDir: /home/www/mrtg Target[kidsmonitor]: `/etc/mrtg/kids_monitor.sh` MaxBytes[kidsmonitor]: 100 Unscaled[kidsmonitor]: dwmy Options[kidsmonitor]: gauge, absolute, growright YLegend[kidsmonitor]: UP status ShortLegend[kidsmonitor]: (%) LegendI[kidsmonitor]: Touch Status LegendO[kidsmonitor]: GIGA PC Status Legend1[kidsmonitor]: Touch Status Legend2[kidsmonitor]: GIGA PC Status Directory[kidsmonitor]: Title[kidsmonitor]: UP Status PageTop[kidsmonitor]: <H1>Kids Tablet Status</H1> <table> <body bgcolor=white background=../line.png> <tr><td>Touch:</td> <td>Challenge Touch by Benesse corp.</td></tr> <tr><td>GIGA-PC:</td> <td>PC for children educated in public elementary schools</td></tr> </table>
crontab に設定:
# crontab -l */5 * * * * /usr/bin/mrtg /etc/mrtg/kidsadmin.cfg >/dev/null 2>&1
30分くらいで書いたので中身は適当ですが、これがなかなか効果を発揮したようで、しばらくはちゃんと時間を守って使うようになりました。こんな感じで電源を入れた時間帯も可視化されています。
(ある日の土曜日の様子。緑がチャレンジタッチ、青の実線が GIGA スクール端末の利用時間)
メール通知も届いています。
よしよし。
ルール6「YouTube は繋がらなくする」
ここまできてチャレンジタッチが使えない、と分かった子どもは、今度は小学校で配布されたノート PC に目をつけました。
じつはこっちは学校側である程度強い Web フィルタリングが掛かっているようで、インターネットの閲覧が制限されています。調べ学習のときでも見れないページが多く、最初は見向きもしなかったのですが、YouTube に制限が掛かっていないことに気づいたようなのです。学校からの連絡をパソコンで確認する必要もあり、こちらは特に制限をしていませんでした。
子どもは小学校からの連絡を確認していると見せかけ、宿題もせずに親の目を盗んでは、たっぷり YouTube でプラレールの動画を見ていました。気づいたらもうお風呂、夕飯、そして寝る時間です。先にやることを済ませてから見ればいいのに、我が子ながら、まったく懲りないやつである。
本当はこんなことしたくないのですが、宿題が進まないのでは仕方ありません。インターネットの出口をすべて squid で終端していますので、ここでコンテンツフィルタを掛けることにします。そう宣言した途端、「私のパソコンは大丈夫なの!?」と妻が鬼の形相で聞いてきたので、必要なときに見れるよう #妻のパソコン やスマホは YouTube に接続できるものとし、小学校の PC のみ制限します。
これは SquidGuard を使うことで実現できます。
YouTube 関連のドメインを丸ごとブロックリストに入れて、squid で遮断するようにします。
SquidGuard をインストールして、禁止ドメインを設定。
# zypper install squidGuard # vim /var/lib/squidGuard/db/deny/domains youtube.com googlevideo.com
SquidGuard で制限対象の端末を設定します。
# vim /etc/squidguard.conf dbhome /var/lib/squidGuard/db logdir /var/log/squidGuard # define clients src kids { ### 禁止したいクライアント一覧を書く、スペース区切り、CIDR 表記もできる ### ip (子どもの端末の IP アドレス) ip (テスト用の IP アドレス) } # Deny rules dest deny { domainlist deny/domains urllist deny/urls } acl { kids { ### kids で定義された IP アドレスは deny で定義されたもの以外は通す、deny にマッチしたら指定サイトへリダイレクト ### pass !deny all redirect http://192.168.11.144/blocked_access.html?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u } # allow default default { pass any } }
設定ファイルを書いたら、SquidGuard の DB を生成します。
# squidGuard -d -C all 2023-11-23 15:46:24 [23428] INFO: New setting: dbhome: /var/lib/squidGuard/db 2023-11-23 15:46:24 [23428] INFO: New setting: logdir: /var/log/squidGuard 2023-11-23 15:46:24 [23428] init domainlist /var/lib/squidGuard/db/deny/domains 2023-11-23 15:46:24 [23428] INFO: create new dbfile /var/lib/squidGuard/db/deny/domains.db 2023-11-23 15:46:24 [23428] init urllist /var/lib/squidGuard/db/deny/urls 2023-11-23 15:46:24 [23428] INFO: create new dbfile /var/lib/squidGuard/db/deny/urls.db 2023-11-23 15:46:24 [23428] INFO: squidGuard 1.6.0 started (1700721984.210) 2023-11-23 15:46:24 [23428] INFO: db update done 2023-11-23 15:46:24 [23428] INFO: squidGuard stopped (1700721984.412)
FATAL なエラーが出ていなければ OK。忘れずに squid の設定ファイルに、SquidGuard を読み込むように追記します。
# vim /etc/squid/squid.conf (末尾に追記) url_rewrite_program /usr/sbin/squidGuard
最後に Squid を再起動。
# tail -F /var/log/squidGuard/squidGuard.log # systemctl restart squid.service
SquidGuard 側に FATAL なエラーが出ていないことを確認します。FATAL なエラーが出ると以下のような出力があり、ドヤ顔で制限していると思いきや、すべて素通しになっているので、ログは注意して確認します。
2023-11-23 15:27:40 [19773] ERROR: Going into emergency mode
この状態で小学校の PC から YouTube に接続しようとすると、即時で遮断され、squid の access.log には次のような記録が残ります。
192.168.11.X - - [23/Nov/2023:15:52:18 +0900] "CONNECT http:443 HTTP/1.1" 500 0 NONE_NONE:HIER_NONE
HTTP で接続すると、真っ赤な画面で「目的外の利用を検知しました。このアクセスは記録されています。やろうと思っていたこととちがう場合は保護者のかたに伝えましょう。」という、警告メッセージを表示する専用の Web ページも用意しました。
禁止ドメインに接続しようとしてブロックされた画面
が、昨今の Web アクセスは HTTPS で常時 TLS なので、このメッセージを見ることはありません。まぁ目的は達成できているので良いことにします。
さて、ここまで読んだ有識者のなかには、「まだ抜け道があるのでは?」とお思いかもしれません。
しかし、ここまでやって突破するようになったら、私は「大したものだ、おまえも成長したな」と褒めてあげることに決めています。そうやってエンジニアは成長しますからね。
一方、うちの子どもはというと、今度は普通にブロックのおもちゃで遊び始めるようになりました。
一周回ってスタートに戻る。
用意するもの
最後に、このような環境を構築するために準備が必要なものをまとめます。
- ホームルータ
導入済みのルータが、特定 IP アドレス以外は外に出られないよう出口を制御できる機能があれば、新規に購入する必要はありません。また、この機会にルータを刷新しても良いでしょう。 - Linux が動くサーバ
Windows のサポートが切れた、一昔の古い PC の再利用でも OK。最近なら Raspberry pi などでも良さそうです。PC なら openSUSE がオススメです。(宣伝) - 本記事
つまり実質無料です。
後日談
さすがに懲りたのか、YouTube は学校で見ているのか分かりませんが、現在は以下のように落ち着きました。しかし、まだ数か月の運用実績なので油断できません。お父さんは、いつでも厳しくも緩くもするつもりです。
- ルール2 の「1日 1時間」まで緩和 (キッチンタイマーを使って自己管理する)
- ルール5 で追加した親へのメール通知は引き続き届く (嘘を付いてもバレる)
- YouTube のブロックは継続 (一時的に解除して欲しいときはお父さんに言う)
脚注
- 家庭内 LAN のネットワーク構成は、2023年度入社した新卒メンバーのと比較したら、極めてシンプルな構成です。[↑]
- 仮に 25日にアップデートできなかったとしても心配ありません。チャレンジタッチ端末がオンラインになったタイミングでアップデートが掛かりますので、そのときに子どもが少し待たされるだけです。[↑]