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)