Squid + SquidGuard を導入する

本記事は最終更新日より 1 年以上経過しております。
スポンサーリンク

 Squid は Proxy Server であり、インターネットに存在するウェブサーバーとの間に噛ませることで受けとったコンテンツをキャッシュし、次回以降は Squid のキャッシュへアクセスする事でコンテンツ表示を高速化する目的で用いる。
 これは数ある用途のうちの一つであり、他にはウェブサーバーのフロントエンドとして Squid を置き、Proxy Cache を効かせてレスポンスを高速化させるような使い方もある。
 そして Squid にコンテンツフィルターとして SquidGuard も導入すると、特定 URL やドメインに対するアクセス制限を行うことが可能となる。市販のブロードバンドルーターに組み込まれているようなペアレンタルコントロールを自前で行うことが可能となる。近い将来、ネットに触れる事になるであろう我が家の長男君対策でもある。どちらかというとコンテンツフィルターが主な目的。

Squid と SquidGuard のインストール

 今回、CentOS 7 で作業を行う。インストールは yum で簡単に行える。

# yum install squid squidGuard

Squid の設定

 先ずは Squid の設定を行うのだが、これは少しの設定変更と追記で済んでしまう。
 /etc/squid/squid.conf とデフォルト設定が記述された squid.conf.default との差分を取ると次の様になる。
 行頭 – の内容を + の内容に書き換えるという事。詳しくは diff の unified についてググると良い。

# diff -u squid.conf.default squid.conf
--- squid.conf.default  2015-11-21 00:28:41.000000000 +0900
+++ squid.conf  2016-01-13 00:48:42.955750619 +0900
@@ -5,11 +5,11 @@
 # Example rule allowing access from your local networks.
 # Adapt to list your (internal) IP networks from where browsing
 # should be allowed
-acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
-acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
-acl localnet src 192.168.0.0/16        # RFC1918 possible internal network
-acl localnet src fc00::/7       # RFC 4193 local private network range
-acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
+#acl localnet src 10.0.0.0/8   # RFC1918 possible internal network
+#acl localnet src 172.16.0.0/12        # RFC1918 possible internal network
+acl localnet src 192.168.1.0/24        # RFC1918 possible internal network
+#acl localnet src fc00::/7       # RFC 4193 local private network range
+#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

 acl SSL_ports port 443
 acl Safe_ports port 80         # http
@@ -56,10 +56,11 @@
 http_access deny all

 # Squid normally listens to port 3128
 http_port 3128

 # Uncomment and adjust the following to add a disk cache directory.
-#cache_dir ufs /var/spool/squid 100 16 256
+cache_dir ufs /var/cache/squid 256 16 256

 # Leave coredumps in the first cache dir
 coredump_dir /var/spool/squid
@@ -71,3 +72,16 @@
 refresh_pattern ^gopher:       1440    0%      1440
 refresh_pattern -i (/cgi-bin/|\?) 0    0%      0
 refresh_pattern .              0       20%     4320
+
+# Customize
+request_header_access X-Forwarded-For deny all
+request_header_access Via deny all
+request_header_access Cache-Control deny all
+visible_hostname none
+forwarded_for off
+
+url_rewrite_program /bin/squidGuard

 localnet は自分の LAN で採用しているプライベートアドレスのクラスに合わせる。うちはクラス C なので 192~ のみ有効にして 3 オクテット目も合わせつつマスクを 24 に変更した。それ以外はコメントアウト。
 cache_dir は通常、コメントアウトを外して有効にするだけで OK。個人的なポリシーでキャッシュパスは変更してあるのみ。
 # Customize とコメントを入れた行から下は Proxy を経由したという痕跡を残さない設定となる。Proxy 経由とみなされると不都合な場面が希にある為だ。
 最後の url_rewrite_program では SquidGuard へのフルパスを記述する。

SquidGuard の設定

 Squid の設定ファイルがあるディレクトリと同じ階層にある squidGuard.conf を読み込むのでこれを編集するのだが、最初から存在する conf はごちゃごちゃしているから mv で避けておく。必要分だけを記述していく方が良い。

# cd /etc/squid
# mv squidGuard.conf squidGuard.conf.default

 そして新たに squidGuard.conf を vi なり emacs なり好きなエディタで作成、次のような記述を行う。

dbhome /var/lib/squidGuard/db
logdir /var/log/squidGuard

src admin {
    ip    192.168.1.2-192.168.1.10
}

dest deny {
    domainlist deny/domains
    urllist    deny/urls
}

acl {
    default {
        pass !deny all
        redirect http://example.com/error.html
    }

    admin {
        pass any
    }
}

 1~2 行目はアクセス制限を行う為のデータベースを用意するパスとログファイルのパスの定義。
 src ブロックでは admin と定義を名付け、指定した IP アドレスは管理者アクセスとして扱い、フィルタを適用しないようにする。ハイフンを入れて IP アドレスの範囲指定も行える。
 dest ブロックは定義名を deny とし、内にあるドメインリスト、URL リストに記載されている宛先へのアクセスを拒否する定義を行う。
 acl のブロック内では default で定義名 deny 以外の宛先は全て許可する。該当する物は redirect に示される URL へリダイレクトされる。この URL は Yahoo! トップや Google なんかにしておくのも良いだろう。acl 内 admin ブロックは管理者とみなす定義名 admin の IP アドレスからのアクセスは無条件パスという事になる。

 次にアクセス制限を行うデータベースを作成する。
 先ず始めにディレクトリを掘ってカレントを変えておく。

# mkdir -p /var/lib/squidGuard/db
# cd /var/lib/squidGuard/db

 ここで domainlist deny/domains と示されるように、さらに deny とディレクトリを掘っておく。
 取り敢えずテストなので適当に DB を作成して反映させる。

# echo "2ch.net" > domains
# echo "2ch.net" > urls
# squidGuard -C all
# systemctl start squid

動作テスト

 設定に問題が無ければあとは Squid が動作しているサーバーの IP アドレスをブラウザから Proxy のアドレスとして入力してあげる。ポートは今回の場合だと 3128 になっているから合わせて指定する。
 以後、そのブラウザから外部ウェブサーバーへのアクセスの間には Squid が挟まるようになる。
 先程設定した SquidGuard のテストだと 2ch.net を取り敢えず指定してあげたので、2 ちゃんねるにアクセスしても redirect で指定した URL に飛ばされるハズ。
 我が家では LAN 向けのホストにエラーメッセージを用意してあるので、そこへ Redirect する方法をとった。
13_squidguard

将来的なこと

 うちの長男君は今年で 10 歳になる。もうあとどの位か分からないけど、ネットに興味を持っているからインターネットにもっと触れて来ると思う。
 しかし、親としては一般的に有害とされる様なサイトへのアクセスは極力行わせたくないし、直接の監視を行うことも難しい。だったら最初からアクセス出来ないネットワークにすればいいというお話しであるわけで、Squid + SquidGuard に頼ることとなった。
 そしてもっと先の話。スマートフォンなどのモバイル端末を子供が持つようになった時、取り敢えず自宅内では Wi-Fi を強制させて Squid を通すようにしてしまえば親としても安心である。
 ただ、「こっそり見ちゃおう」なんて言う子供らしさにまで制限をしてしまうのも、如何な物かと葛藤しそうな所だが。
 ネットに毒されやすい子供のうちは、こう言った制限も取り敢えずは必要と思うので、制限するコンテンツのポリシーは行き当たりばったりで変えていこう。
 ネット社会だからこそ、親の躾け、責任としてネットの事も面倒をみないといけない時代なのかなと思う。

 なんて、横道に逸れすぎた。

キャッシュの削除

 動作テストが終わったら取り敢えずキャッシュは削除しておいた方が良い。この記事の設定通りだと

# systemctl stop squid
# rm -fr /var/cache/squid/
# systemctl start squid

 なんて感じでやってしまえば OK。
 それとブラウザのキャッシュも削除しておかないと、自分でかけたコンテンツフィルターに掛かったままになるので要注意。

スポンサーリンク