家のインターネットで子供に有害なサイトをブロックする
近年インターネットが要因のひとつとなっている事件をよく見聞きします。いろんな人が子供たちを事件から守るように力を注いでくれていますが、他人任せにはできません。自分でできることはしようということで、家で無料でできるインターネットの制限を紹介したいと思います。
ここではWindowsPCを持っていてIPv4でネットワークに接続している事を前提としています。それとは別に古いPCやラズベリーパイなどがあるとより高度な設定ができます。
この仕組みではケータイ回線からの通信制限はできません。しかし幸いケータイにはプリインストールの機能やGoogle ファミリーリンク等のアプリが充実しておりますのでそちらをご利用ください。
ルーターやプロバイダのパスワードは極秘に
家庭のネットワークを制限する前に重要なことがひとつあります。それはルーターの管理パスワードやプロバイダの接続情報はお子さんにも漏らしてはいけないということです。
ルーターの管理パスワードが漏れてしまえば、設定を消されてしまったり穴を作られてしまいかねません。またプロバイダ(インターネット接続)のパスワードが漏れてしまえばルーターを差し替えることですべての設定を回避されてしまいます。昨今では中古ならワンコインで買えてしまうほどの値段でルーターが売られています。
簡易的にURLフィルタリングをする
ルーター等のネットワーク機器を製造販売しているCiscoという会社が運営しているopenDNSサーバーを利用すると、無料で簡単に有害なサイトをブロックできます。
DNSサーバーがよくわからない方に説明をしますと、DNSサーバーとはドメイン名をIPアドレスに変換するインターネット上のサービスです。
たとえばドメイン名google.comには172.217.161.206というIPアドレスが割り振られています。ブラウザのアドレス欄にhttps://google.comと入力したり、アドレスのリンクをクリックしたとき、google.comのIPアドレスは何? という問い合わせがブラウザからインターネットに対して行われ、得られた172.217.161.206というIPアドレスを使ってブラウザはページを表示します。その際、問い合わせを受け付けて答えを返すのがDNSサーバーです。
通常DNSサーバーはプロバイダにより提供されていますが、これをCiscoが提供しているDNSサーバーであるopenDNSに変更するだけで有害サイトを表示させなくできます。
openDNSは目的のサイトが有害なサイトだった場合IPアドレスを教えません。なので、ブラウザにURLを入力したりアドレスリンクをクリックしても、それに結びついているIPアドレスがわからないのでアクセスできなくなるという仕組みです。
有害の判断をすべてopenDNSにゆだねるなら、家のルーターの設定にその記述を加えるだけで実現ができます。次のような設定をするとアクセスしてきた端末にたいして、ルーターはopenDNSサーバーを利用するように伝えます。サンプルとしてBuffalo製のWXR-1750DHPの画面を表示しています。
訂正:家庭向けopenDNSのアドレスは208.67.222.123と208.67.220.123です。208.67.222.222は同様のサービスであるCisco Umbrellaのアドレスです。
もし対象がスマホとかでなく、家庭にあるPC1台だけの場合はPCのネットワーク設定にこのDNSを設定することでも同じ効果を得られます。(ただし管理者権限で共用していたりすると変更されてしまいます)
BINDを使った複合DNS
openDNSのフィルタだけでは事足りない場合があります。例えば「2ちゃんねるは子供には有害な情報が多いからみせたくない」という場合です。
この場合は、別途DNSサーバーを用意してopenDNSがしているのと同じように表示させたくないドメインに対してIPアドレスを返さない設定をします。サーバーといっても使っていない古い世代のPCでかまいません。小型PCのラズベリーパイでも利用可能です。ただしルーターとおなじように常時電源をONにしておく必要はあります。
DNSサーバーとして使うために、古いPCにフリーOSのDebianをインストールします。
DebianOSが起動するようになったら、そこへDNSサーバーアプリであるBINDをインストールします。DNSサーバーBINDのインストールと設定はにつきましては別記事を参考にしてください。ラズベリーパイの場合もBINDのインストール方法や設定方法はDebianとほぼ同じです。
BINDの追加設定
構築するDNSサーバーのIPアドレスは固定にする必要があります。家のネットワークに接続できるIPアドレスで家のルーターにあるDHCPサーバーが配布するものと重ならいようにしてください。
named.conf.optionの修正
別記事にあったBINDの設定例では、管理外のドメイン名の問い合わせ先をgoogleのpublic DNSサーバー(8.8.8.8)に接続してありますので、それをopenDNS(208.67.222.123)に変更します。
表示禁止ドメインの追加
openDNSで設定されていない、表示させたくないURLをドメイン単位で設定します。ドメインはhttp(s)://の後から最初の/までと考えてください。たとえば2ちゃんねるの場合、www.2ch.scとなります。
また一致の判定は右から.(ドット)単位でチェックします。ですので、2ch.scとすればwww.2ch.scだけでなく、some.2ch.scも表示しなくなります。
shスクリプト
BINDの記述方式に従ってゾーンファイル(禁止ドメイン)を記入すればいいのですが、shスクリプト(実行可能ファイル)を使うことで、設定入力を半自動化させます。これにより変更や追加が容易になります。
まず、アクセスさせたくないドメインを「/etc/bind/blackurls」に1行ずつ入力してください。先頭1字が#の時はコメントとします。
$ su ... # nano /etc/bind/blackurls
#2チャンネルを表示しないようにします 2ch.sc 5ch.net #ひま部ならこうなります himabu.com
次に、blackurlsファイルから実際のBINDのゾーンデータ(禁止ドメイン設定データ)を作成するスクリプトを作成します。
スクリプトファイルは次のようになります。BIND9の初期設定で「/etc/bind/db.empty」という空のゾーン明細ファイルがあるのでそれを利用しています。設定のパス等は自身の環境に合わせて書き換えてください。スクリプトファイルの名前は「makeblacklist.sh」としました。
#!/bin/bash
#bind用のブラックリストファイルが存在していたら一旦削除
if [ -e zones.black ]; then
rm zones.black
fi
if [ ! -f blackurls ]; then
#ブラックリストが存在しない場合は終了(ファイルが存在しない場合のエラーを回避するために空のファイルを作成)
echo "#no entry">>zones.black
echo not found blackurls
exit 1
fi
#行数チェックの変数
counter=0
while read line
do
if [ ${line:0:1} != "#" ]; then
echo "zone ¥"${line}¥" { type master; file ¥"/etc/bind/db.empty¥"; };">>zones.black
counter=$counter+1
fi
done < blackurls
if [ $counter = 0 ]; then
#出力対象が存在しない場合にエラーを回避するために空のファイルを作成
echo "#no entry">>zones.black
fi
#DNSサービスを再起動させて変更を反映させます
systemctl restart bind9
これに実行権限を付けて実行します。ここでは管理者のみ実行権限を付与しています。
# chmod 744 makeblacklsit.sh # ./makeblacklist.sh
スクリプトファイル実行時、ファイルがある場所と現在いる場所が同じ場合は「./」の入力が必要になります。
アクセスを防ぎたいサイトの増減に合わせて、blackurlsを編集し、それをmakeblacklist.shで反映させます。
ゾーン情報の外部ファイル読み込みの設定も記述しておきます。
# nano /etc/bind/named.conf.local
の最終行に次の1行を追加します。
include "/etc/bind/zones.black";
念のためエラーチェックをしておきましょう。「zones.black」ファイルがないとエラーになるので、一度作成スクリプトも実行しています。
# /etc/bind/makeblacklist.sh # named-checkconf -z
最終設定
最後に、先ほど紹介した家のルーターの設定で接続端末に案内するDNSサーバーのアドレスを、構築したDNSサーバーのIPアドレスに変更してください。個別に指定したものは、家のDNSサーバーから「見つからない」という答えが返り、そうでないものはopenDNSの応答を採用します。
子供のメンタルケアも忘れずに
筆者の専門外ですが、何も言わずに制限をかけてしまうのも問題だと思われます。子供には子供のコミュニケーション環境があります。悪用される可能性があるSNSだからといって盲目的に遮断してしまうようなことはせず、対話したうえで決めるのがいいと思います。
拡張設定
この設定だと、保護者のPCもファイアウォールに引っかかってしまいます。それを避けたい場合は、このあとの「裏話」にあるように、端末毎にDNSサーバの設定を変更してください。
また、ラズベリーパイでインターネットフィルターを作成の記事では、今回の設定を応用して一部をアプリ化して日本語ドメインにも対応させましたので、興味があれば読んでみてください。
裏話
本当は、ルーターから告知するDNSサーバのアドレスを変更するだけでは不十分です。使用者がこの仕組みに気づいてしまえば、端末側で使用するDNSサーバーを変更することができます。
その対策としてBaffaloの製のルーターの多くに備わっているIPフィルターを使って、openDNS宛て以外のDNSデータ通信(UDP 53番ポート)を拒否するように設定する方法を紹介しておりました。
しかし、手持ちのBaffalo製品においては、IPアドレス変換(NAT)環境下のDNS通信がIPフィルターの対象外となっているような現象に遭遇しました。(家庭用ルーターの域を超えた使い方ですので、不具合だという気はありません)
また、時間制限ができかつIPフィルターが使える他社製品にはNEC Aterm WG2600HP3等があります。こちらの挙動の確認する機会がありましたらまた紹介させていただきます。
追記:NEC Aterm PA-WG2600HP4
上記のルーターの後継機?であるNEC Aterm PA-WG2600HP4を触らせてもらうことがあったので、IPフィルターを試してみました。WAN側の「out」に対する設定で次のように設定したら、許可指定したDNSサーバー以外のDNSサーバーへのアクセスを防ぐことができました。
順位 | ACT | 方向 | プロトコル | 送信元 | ポート | 送信先 | ポート |
45 | 通過 | out | TCP | any | any | 208.67.222.123/32 | 53 |
46 | 通過 | out | UDP | any | any | 208.67.222.123/32 | 53 |
47 | 破棄 | out | TCP | any | any | any | 53 |
48 | 破棄 | out | UDP | any | any | any | 53 |
ただしこちらのルーターは、ルーティング(経路設定)ができないようです。