ラズベリーパイでインターネットフィルター作成
以前紹介した、家のインターネットで子供に有害なサイトをブロックするでは古いPCとDebianを使いURLドメイン単位でお子さんのインターネットの閲覧禁止サイトを設定しました。
PCだと置き場所をとるのに加え電気代もそれなりなので、それを改善するために小型格安PCのラズベリーパイを使ってみます。
今回はWeb経由の設定ツールを紹介・配布したいと思います。またBIND(DNS)の日本語ドメイン対応もします。
Windows10のパソコンを持っていることを前提に記事を書いていますが、8や7、Mac等でも同等のことはできると思います。
ラズベリーパイの設定
ラズベリーパイをもってない人はラズベリーパイ購入時の注意がこちらに書いてありますので、購入前の参考にしてください。
そちらでもインストールの説明をしていますが、わかりやすいように最初から書きます。
ラズベリーパイ公式ダウンロードサイトからRaspbian Buster Lite(OSのイメージ)をダウンロードします。
CUIで動かしますのでMicroSDカードは8Gあればたりると思います。
間違ったドライブをフォーマットしてしまわないように注意しながらSDメモリカードフォーマッターをつかって、MicroSDカードをフォーマットします。
前回は別の書き込みアプリを使いましたが、今回は公式が案内するようにbalenaEtcherを使ってディスクにイメージを書き込んでみました。これも書き込み先を間違わないように注意してください。
前回使ったツールだと書き込みが終わった直後「このディスクはフォーマットされていません……」というメッセージがましたがbalenaEtcherはメッセージが出る前にディスクをアンマウントしてくれるようです。このあたりが公式が推奨するゆえんでしょう。
MicroSDカードをラズベリーパイに差し込み電源を入れます。login:の後にpi、そのご聞かれるパスワードは「raspberry」です。パスワード入力時は何も画面が反応しませんが正常です。
ネットワークの設定は/etc/dhcpcd.confに記述します。
$ sudo nano /etc/dhcpcd.conf
nanoの編集モードを終了するにはctrlキー(キーボード左下)を押しながらxボタンを押します。変更がある場合はYesと入力すると上書き保存します。保存せずに終了したい場合はNoと入力してください。
から次の表記の部分をコメントアウトを解除して(先頭の#を消して)、環境にあった値を入力してください。
- static ip_address=192.168.1.254/24
家のネットワークに接続できるIPを設定します(同じネットワークに入るように設定します)。ルーターでDHCPを使っている場合は、それが割り当てるIPアドレスとかさならないように注意してください。
- static routers=192.168.1.1
家のルーターのIPアドレスを設定します。
- static domain_name_servers=192.168.1.1
ラズベリーパイが使うDNSサーバを記入します。不明な場合はopenDNSである208.67.222.123を指定してください。
Windowsからsshでアクセスできる設定にします。
$ sudo touch /boot/ssh
一旦ラズベリーパイを再起動します。
$ sudo sytemctl reboot
Windowsからアクセスするためにはtera term(無料)等のアプリを使います。ダウンロードは窓の杜他よりダウンロード可能です。
Tera Termのhostの部分に先ほどラズベリーパイに設定したIPアドレスを入力します。
ユーザー名pi、パスワードraspberryでログインします。Tera Termで初回接続する際、メッセージが出ますが、接続先が間違っていないかの確認なのでOKを押して進めてください。
一旦ラズベリーパイのアップデートをします。アップデートの量やネットの込み具合にもよると思いますが時間がかかります。筆者の場合は1時間ぐらいかかりました。Tera Termのウインドウを閉じるとそこで処理が終わってしまうので注意してください。
$ sudo apt update ... $ sudo apt -y upgrade ... $ sudo apt -y dist-upgrade
OSの設定を日本語環境に修正します。
$ sudo raspi-config
選択はキーボードの↑↓キー、それで移動できない場所にはTABキーで順に飛びます。ESCキーで戻ります。
- Localisation Options→Change Locale を ja_JP.UTF-8 に
- Localisation Options→Change Timezone→Asia Tokyo に
- Localisation Options→Change Wi-Fi Country→JP に
- Localisation Options→Change Keybord Layou→日本語キーボードに
「キーボードのモデル」は何でもいいと思われます。筆者は「サンワサプライSKB-KG3」にしています。次のキーボードのレイアウトで「日本語(OADG 109A)」を選択、移行の選択先頭「キーボード配置のデフォルト」「コンポーズキーなし」のものを選択します。実機でのキーボード操作でチルダ(~)や、パイプ(|)が出れば問題ないと思います。不具合がでたらその時再調整してください。
設定の反映には再起動が必要です。再起動後、Tera Term等では日本語が表示されますが実機操作時だけは□□と日本語部分が文字化けすると思います。これは英語表記に戻すことで回避します。戻し方は次のコマンドを使います
$ LANG=C
ユーザー名と、パスワードを変更します。いったん仮の管理ユーザを作り、元のユーザー名を変更、パスワード変更という流れになります。
仮のユーザを作ります。
$ sudo useradd -M willdel $ sudo gpasswd -a willdel sudo $ sudo passwd willdel ...パスワードを入力... $ sudo systemctl reboot
仮のユーザーwilldelでログインします。その後でユーザー名piを変更します。ここではnanbuにしていますが好きな名前に置き換えてください。
$ sudo usermod -l nanbu pi $ sudo usermod -d /home/nanbu -m nanbu $ sudo groupmod -n nanbu pi $ sudo systemctl reboot
変更後のユーザー名でログインします。パスワードは元のままなのでraspberryとなります。ログインしたら仮のユーザーを削除します。
$ sudo userdel willdel
現在のユーザ(ここではnanbu)のパスワードを変更します。
$ sudo passwd nanbu ...(設定するパスワード)...
この方法はこちらの記事を参考にさせていただきました。ありがとうございました。
ラズベリーパイに必要アプリをインストールする
ここから先sudoコマンド実行時にパスワードを聞かれることがあります。本来はsudo実行時にパスワードを求められる方が普通なののですが、もし入力が面倒くさいのなら次のファイルの中身を修正します。
$ sudo nano /etc/sudoers.d/010_pi-nopasswd
と入力し、エディタの入力で先頭の「pi」となっている個所を、変更後のユーザー名にすると元通り使えます。何かを間違えると以降sudoが使用できなくなりますので注意してください。その場合はこちらの通りに対処してください。
DNSサーバーのBIND9とそれをWeb経由で管理するためにapache2ウェブサーバと、php7をインストールします。
$ sudo apt update ... $ sudo apt -y install bind9 apache2 php7.3 dnsutils
apacheとPHPはほぼそのままで使えますが、BINDは初期設定が必要ですので次のようにしてください。
$ sudo nano /etc/bind/named.conf.options
で現れた画面で、ファイル編集します。
options { directory "/var/cache/bind"; listen-on { 192.168.1.254; }; allow-query { localhost; 192.168.1.0/24; }; forwarders { 208.67.222.123; }; recursion yes; //dnssec-validation auto; //listen-on-v6 { any }; }
Listen-onはラズベリーパイのIPアドレス、allow-queryには家のネットワーク、fowardersにはopenDNSのアドレスを入力してください。recursionはyesにしてください。listen-on-v6はコメントアウトするか削除してください。IPv6の通信は想定していません。
Webベースのアプリから設定を変更できるように次の設定も加えます。
$ sudo nano /etc/bind/named.conf.local
で最後の行に
include "/etc/bind/zones.black";
を加えます。この記述をするとzones.blackファイルがないとエラーになるので仮でファイルを作成します。
$ sudo touch /etc/bind/zones.black
日本語ドメインのBIND設定
前回は日本語(マルチバイト)ドメインが存在することをすっかり忘れてBINDの説明をしていました。すみません。
日本語ドメインをBINDに設定する際は、ドメインをピュニコード(Punycode)という形式に変換しないといけません。
Japan Registry ServicesのページにPunycode変換・逆変換するツールが公開されています。今回のプログラムでは対応しましたが、前回のように手入力でファイルを編集する際は日本語ドメインは案内先のページ等でPunycode化した値を取得して記述するようにしてください。
参考までに、Punycode化は.の位置で区切ってぞれぞれに対して行います。
日本語ドメインに関連して、PHPにおいて日本語を使えるようにするには、mbstringという拡張ライブラリを有効にしないといけません。
mbstringライブラリが有効になっているかどうかは。phpinfo();を表示させてみるとわかります。mbstring関連の表記がでてこなければライブラリは読み込まれていません。うまく動かない場合は、ライブラリが読み込まれているのか、それとも設定方法に落ちがあるのかの切り分けができます。
標準ではインストールされていないので、次のコマンドでインストールします。
apt -y install php-mbstring
mbstring関連の設定を変更します。
$ sudo nano /etc/php/7.3/apache2/php.ini
- mbstring.language = Japanese のコメントを外す
- mbstring.internal_encoding のコメントを外して =UTF-8に
PHP内部の文字コードをUTF-8に指定しています。
- mbstring.http_input = のコメントを外して =autoに
Webブラウザからの入力文字コードが何かを指定します。環境によってかわりますのでautoにします。
- mbstring.http_output = のコメントを外して =UTF-8に
PHPが出力する文字コードをUTF-8にします。
- mbstring.encoding_translation のコメントを外して =Offに
- mbstring.detect_order = のコメントを外して=UTF-8,SJIS,EUC-JP,JIS,ASCIIに
自動判別時の文字コードチェック順です。UTF-8が優先されるようにしています。
- mbstring.func_overload = のコメントを外して=0に
オーバーロードは0を設定しておいた方が安全です。
ちなみに、Windows環境でPHPのmbstringライブラリを適用させるにはphp.iniの次の項目を編集する必要があります。
- ※extension_dir="ext" のコメントを外して拡張ライブラリのディレクトリを明示する(ext)
mbstringの設定をしても動かないという時はこのディレクトリの指定が間違ってないか、またphp_mbstring.dllが指定しているディレクトリに存在するかもチェックしてみてください。 それらが問題ないという場合は、いちど絶対パス(c:/php/ext等)で試してみてください。
- ※extenstion mbstring のコメントを外してライブラリを有効にする
- mbstring.language = Japanese のコメントを外す
- mbstring.internal_encoding のコメントを外して =UTF-8に
- mbstring.http_input = のコメントを外して =autoに
- mbstring.http_output = のコメントを外して =UTF-8に
- mbstring.encoding_translation のコメントを外して =Offに
- mbstring.detect_order = のコメントを外して=UTF-8,SJIS,EUC-JP,JIS,ASCIIに
- mbstring.func_overload = のコメントを外して=0に
自作アプリのファイル説明
Webベースで禁止URLリストを作成、反映させるスクリプトはこちらからダウンロードしてください。
ファイルの説明
- filter.php
筆者が作成したフィルタリング設定・反映ツールです。管理ユーザー(初期:cat)とパスワード(初期:222)の設定が含まれているので該当部分に好きなユーザー名とパスワードを入力してください。
- punycode.php
Copyright (c) 2011 Takehito Gondo Punycode変換用のPHPライブラリです。MITライセンスで利用できます。
- makeblacklist.sh
BINDに設定を反映させるためのスクリプトです。
- blackurls
表示させないドメインを記憶しておくファイルです。apacheサーバーが記述できる状態で存在しないといけないので同梱しています。apacheサーバーユーザー(www-data)に所有権を移し、読み込み、書き込み権限を与えてください。単なるテキストファイルなので、権限さえ指定すれば自作したものでも使用可能です。
USBメモリを使ってラズベリーパイにファイルをコピーする
展開したファイルを、ラズベリーパイのWebサーバ公開領域(デフォルトは/var/www/html)にコピーします。
コピーの方法は何でもいいですがここではUSBメモリを使ってラズベリーパイにファイルをコピーします。記事内では、展開したファイルをUSBメモリのcopyディレクトリに入れています。ラズベリーパイへでのUSBの抜き差しは念のため電源は切って行うようにしてください。
USBファイル内のデータをラズベリーパイで操作するには次のようにします。
$ sudo mkdir /mnt/usbm $ sudo mount /dev/sda1 /mnt/usbm $ sudo cp /mnt/usbm/copy/* /var/www/html/ $ sudo umount /mnt/usbm
まず「mkdir」で、usbメモリのファイルをマウントするディレクトリを作ります。マウントとはディスクを読み出せるように準備することで、マウントさせるとUSBメモリの中身は/mnt/usbmディレクトリを指定することで読み出すことができます。WindowsでいうとF:¥とかW:¥フォルダを作ってそこにUSBの中身を表示させているといったような意味あいです。
次に「mount」でUSBメモリの中身を読み出します。/devディレクトリにはラズベリーパイが認識した機器の一覧(のようなもの)が入っています。その中のUSBメモリに相当するものはsda、sda1です。sdaはUSBメモリ全体をさし、sda1としてUSBの1番目のディスク領域を指します。
sd以降の文字はは可変で、ラズベリーパイがUSBメモリを認識した順番でsda、sdb...と変更されます。またディスク内が細分化(パーテーション化)されていたら1(sda1)、2(sda2)...と変化していきます。
mountコマンドでSDカードの1番目の領域を、先に作成しておいた/mnt/usbmディレクトリにマウントします。
マウントが終わると通常のファイルと同じように扱えるので、cpコマンドで/mnt/usb/copy(USBのcopyディレクトリ)から、ラズベリーパイの/var/www/html/ディレクトリにコピーします。
コピーが終わったらUSBメモリをアンマウントします。アンマウントすると/mnt/usbmディレクトリの中は空になります。
各種ファイル
/var/www/html内にあるファイルの所有権とアクセス権をapache2の起動ユーザに変えます。
$ cd /var/www/html $ sudo chown www-data:www-data * $ sudo chmod 644 * $ sudo chmod 744 makeblacklist.sh
Web連携するためにblackurlsファイルは前回とは違ってweb公開領域(/var/www/html)に作ります。このファイルを書き込み可能にします。makeblacklist.shファイルもそれに合わせてファイルの場所を変更して記述してあります。
Webサーバはmakeblacklist.shスクリプトを実行できるように設定します。debianではvisudoを実行するのですが、ラズベリーパイではファイル構成をみると設定ファイルを個別に設けるのが正しそうです。sudo関連のファイルの記述を間違えるとリカバリが大変です。visudoから処理をした方が安全です。
sudoが使えなくなったりログインパスワードを忘れた場合
sudoersの記述を間違えたり、ログインパスワードを忘れたりしたら、シングルユーザーモードでログインして復旧作業をします。シングルユーザーモードとはWindowsでいうセーフモードみたいなもので、ログインするとすべて管理者権限で操作ができます。ただしTeraTerm等外部からの接続はできず、実機での操作のみとなります。
シングルユーザーモードでラズベリーパイを起動するには、MicroSDカードを別の端末から読み取り、編集します。WindowsでMicroSDカードを読み取ろうとすると、「フォーマットしますか?」という問いがでると思いますが、いいえにしてください。ここでは読み取れる領域のみ使います。
ルートドライブにあるcommandline.txtを編集します。行の最後に半角スペースを入れた後「rw init=/bin/sh」(「」部は不要)を追加します。この表記でシングルユーザーモードにログインされるようになります。
ラズベリーパイにMicroSDカードを戻して起動します。表示が止まったらENTERを押すと#がでてコマンドが打てるようになります。このモードでは、ラズベリーパイのキーボードの設定が日本用になっていないので注意してください。アンダーバー(_)はシフトを押しながら「ほ」で出ます。
sudoersの設定を間違えたなら修正します。パスワードを忘れた場合は、passwd nanbu(ユーザー名)で新しくパスワードを作成してください。
復旧作業が終わったら、もう一度MicroSDカードを別の端末で読み取り「rw init=/bin/sh」の部分を削除します。その後再度ラズベリーパイにMicroSDカードをセットして起動します。
Windowsで操作すると、MicroSDカードにSystem Volume Informationというフォルダを作られてしまいます。動作に問題ないと思われますが気になるなら削除してください。
復旧の方法はこちらのページを参考にさせていただきました。ありがとうございました。
閑話休題
sudoersの設定は次のようにします。/etc/sudoers.d/に書き込んだファイルを作るか、visudoで表示されたエディタに次の記述をします。一度失敗してこりたので筆者は後者を選択しました。
www-data ALL=(ALL) NOPASSWD: /var/www/html/makeblacklist.sh
Webページの都合上改行されて表示されてしまうかもしれませんが、各項目はスペースで区切って、改行なしで入力してください。
Webサーバにパスワードなしで、管理者権限でのmakeblacklist.shの実行を許可しています。ラズベリーパイでインストールした際はWebサーバのユーザはwww-dataとなると思いますが、自身の環境に合わせて書き換えてください。
完成
稼働が確認できたら、ルーターが案内するDNSサーバーの設定を今回作成したラズベリーパイDNSのアドレスにします。筆者の環境(Buffalo WXR-1900DHP3)ですと、「詳細設定」→「LAN」→「DHCP設定拡張表示」→「DNSサーバの通知」で設定します。
ブラウザにhttp://ラズベリーパイDNSサーバのIPアドレス/filter.phpを入力して、稼働をチェックしてください。冒頭で紹介したような画面が表示されます。
現状で設定がされていればそのリストが表示されます。削除や追加をし設定反映を押すと、前回の記事で紹介したコマンドを自動で実行します。
コメント(メモ)を入れたい場合はコメントを選択、日本語(マルチバイト)ドメインの時は日本語ドメインを選択してください。
ひとつ注意いただきたいのは、ドメイン名の重複があるとBIND側でエラーを起こします。Webアプリ側では正常終了しますがDNSサーバーは使えない状態になります。