2012年12月30日日曜日

Cuboxでコンテンツフィルタ+キャッシュサーバを構築する。


  • スマートデバイス(Android、iOS両方)でブラウジング中に出てくる広告が超ウザい。
  • スマートデバイスのブラウザで「戻る」ボタンを押しても、キャッシュ再読み込みではなくページの再取得をしてしまう。
  • 宅内の端末が増えてきたので、adblockやFilterProxy等の設定をするのが面倒。


という問題を解消するため、Debian-Squeezeを入れたCuboxにSquidGuard+Squid+Polipoを入れて、宅内LAN用のコンテンツフィルタとキャッシュサーバを立てたので、その時のメモをまとめておく。


■TXキュー長の変更
CuboxのNIC(カードじゃないけど…)は内部でバッファを持っているので、OSのTXキュー長を"0"に設定しておく。
(ちなみにデフォルト値は"1000")
# ifconfig eth0 txqueuelen 0


■Polipoのインストール
外部サーバとの通信高速化のためPolipoを利用する。
キャッシュプロキシには後述のSquidを利用するため、Polipo側のキャッシュは利用しない。
# sudo apt-get install polipo
# nano /etc/polipo/config
うちのconfigはこんな感じ。
とりあえずIPv4にのみ対応させておいたけど、そろそろIPv6にも対応させておいたおいた方がいいかな…。
Debian-Wheezyが出たら(もしくは引っ越し後に)考えよう。
--------------------------------------------------
proxyAddress = "0.0.0.0"
allowedClients = 127.0.0.1, 192.168.1.0/24
chunkHighMark = 819200
objectHighMark = 512
diskCacheRoot = ""
localDocumentRoot = ""
disableIndexing = false
disableServersList = false
dnsQueryIPv6 = no
dnsUseGethostbyname = yes
pmmFirstSize = 524288
pmmSize = 262144
relaxTransparency = maybe
--------------------------------------------------
設定したらPolipoを再起動しておく。
# sudo /etc/init.d/polipo restart


■Squidのインストール
Squidをキャッシュプロキシとして利用する。
PolipoとSquidのどちらを親プロキシにするかは諸説あるが、今回は
クライアント → (SquidGuard) → Squid → Polipo → 外部サーバ
となるよう、Polipoを親プロキシとして設定する。
# apt-get install squid
# cp -p /etc/squid/squid.conf /etc/squid/squid.conf.org
# nano /etc/squid/squid.conf
以下はCuboxをSDカードのみで利用し、メモリキャッシュのみで運用する場合の設定例。
MicrosoftUpdateやニコニコ動画等のページ、cgi等の結果はキャッシュしないようにしている。

--------------------------------------------------
redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
redirect_children 5
redirector_bypass on
acl query urlpath_regex cgi-bin \? \.php$ \.asp$ \.shtml$ \.cfm$ \.cfml$ \.phtml$ \.php3$ \.js \.jsp
acl nocache-domain dstdomain .microsoft.com .nicovideo.jp .smilevideo.jp
always_direct allow query
always_direct allow nocache-domain
no_cache deny query
no_cache deny nocache-domain
acl all src all
(以下、acl関連は省略)
http_port 8080
cache_peer 127.0.0.1 parent 8123 7 no-query no-digest no-netdb-exchange http11 default
hierarchy_stoplist cgi-bin ?
cache_mem 256 MB
cache_dir null /var/tmp
maximum_object_size 20480 KB
access_log none
cache_store_log none
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
negative_ttl 1 minutes
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
half_closed_clients off
visible_hostname ProxyServer
nonhierarchical_direct off
prefer_direct off
never_direct allow all
tcp_recv_bufsize 65535 bytes
hosts_file /etc/hosts
ipcache_size 4096
forwarded_for off
coredump_dir none
pipeline_prefetch on
--------------------------------------------------


ウチではeSATA接続のSSD上にキャッシュを配置しているため、実際には"cache_mem"をコメントアウトし、以下の設定を有効にしている。
--------------------------------------------------
cache_dir coss [cache_dir]/cache_s  128 block-size=512 max-size=16384  membufs=4
cache_dir coss [cache_dir]/cache_m 1024 block-size=512 max-size=131072 membufs=8
cache_dir aufs [cache_dir]/cache_l 4096 16 64
maximum_object_size 1024 MB
--------------------------------------------------
redirect_programにSquidGuardを指定しているため、サービス再起動等はSquidGuardのインストール後に行う。



■SquidGuardのインストール
コンテンツフィルタとしてSquidGuardを利用する。
# apt-get install squidGuard
# cp -p /etc/squid/squidGuard.conf /etc/squid/squidGuard.conf.org
フィルタ用のブラックリストは用意されていないため、別途取得して展開しておく。以下はその取得例。
# cd /tmp
# wget http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist
# tar zxvf bigblacklists.tar.gz
# cd blacklists
# cp -Rf * /var/lib/squidguard/db/
# cd /var/lib/squidguard/db
# chown -R proxy:proxy db
フィルタリングしたいブラックリストをSquidGuardに設定する。
# nano /etc/squid/squid.conf
ウチの設定はこんな感じ。
good と local は、自前で用意したホワイトリストとブラックリストを設定している。存在しない場合は設定自体の削除が必要。
usersとdefaultの設定を分ける必要は無いけど、まぁ将来の拡張用ということで。

--------------------------------------------------
dbhome /var/lib/squidguard/db
logdir /var/log/squid
src users {
    ip 192.168.1.0/24
}
dest good {
    domainlist good/domains
    urllist good/urls
}
dest local {
    domainlist local/domains
    urllist local/urls
    expressionlist local/expressions
}
dest antispyware {
    domainlist antispyware/domains
    urllist antispyware/urls
}
dest ads {
    domainlist ads/domains
    urllist ads/urls
}
dest spyware {
    domainlist spyware/domains
}
acl {
    users {
        pass good !local !antispyware !ads !spyware all
        redirect http://[CuboxAddress]/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
    }
    default {
        pass good !local !antispyware !ads !spyware all
        redirect http://[CuboxAddress]/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
    }
}
--------------------------------------------------
ここまで来たら、一旦SquidGuardの設定をチェック。

# squid -f /etc/squid/squid.conf -z
問題が無いようなら、SquidGuardで設定したブラックリスト、ホワイトリストをBerkleyDB化してSquidを再起動する。
# squidGuard -d -C all
# service squid reload
# /etc/init.d/squid restart
あとはクライアント側からCuboxの8080ポートをプロキシに設定すれば設定完了。
とりあえず、Squidのみの状態で一週間、Polipoも入れた状態でさらに一週間使ってるけど、特に問題らしい問題も発生していないので、安定してると言えるかと。

Cuboxの今後の課題(というか、やりたいこと)は…

  • Privoxy+Ziproxyでフィルタリングの強化&高速化
  • IPv6対応
  • 透過プロキシ化
  • DNSキャッシュサーバを構築して高速化
  • L2TP/IPSecのVPNサーバを構築

くらいかなぁ。
RaspberryPiと違って、NICが1000Baseに対応してるのと、AES復号化に使える専用コプロセッサを積んでるのはCuboxの強みだしね。

RaspberryPiは、ひとまずMPDサーバとか、宅内WebAPサーバとして使っていくことにしよう。
…丁度よく、「月刊Stereo」2013年1月号付録のUSB-DAC『LXU-OT2』も確保してあることだし!

【2015/04/11追記】CuboxからRaspberryPi2にキャッシュサーバを移行したため、興味のある方はそちらもご覧ください。
キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(1)

1 件のコメント:

  1. YOU should be using OUR Blacklists!

    We are the worlds leading publisher of Squid 'Native ACL' formatted blacklists, that allow for web filtering directly with Squid proxy. Of course we also offer alternative formats for the most widely used third party plugins, such as DansGuardian and Squidguard. And while our blacklists are subscription based, they are as a result of our efforts, of a much higher degree of quality than the free alternatives.

    We hope to serve you,

    --
    Signed,

    Benjamin E. Nichols
    http://www.squidblacklist.org

    返信削除