squidとiptablesでトランスペアレントキャッシュを作る

トランスペアレントキャッシュは透過キャッシュとも呼ばれ、クライアントPCへの追加設定なしにインターネットキャッシュを行う技術。キャッシュとは本来は企業などで複数のクライアントがいるとき、同一のコンテンツを取得するときに毎回インターネットから取得せずにLAN上のサーバに蓄えられたデータを使うことによって回線帯域の削減や応答時間の改善を目指すもの。ただし現在ではWAN帯域削減というよりはアンチウイルスや悪質サイトのURLフィルタ、あるいは社員がどんなサイトを見に行っているかのログ取得が主な目的となっている。なのでクライアントPC1台、ユーザ1人といううちの環境ではあまり意味がないが、技術的な興味で試してみる。

squidはプロキシ・キャッシュサーバとして歴史のあるソフトウェアで、CentOS5.0にも入っている。squid自体は自分宛に来たリクエストを処理することしかできないので、iptablesの機能を使ってLANから外に出て行くHTTPの通信を強制的にsquidに転送することにする。

まず簡単なiptablesの設定を作ろう。構成は以下のようになる。

                   eth1   eth0
(Internet)-----------[ml115]------------[Client PC]
                        |dummy0
                        |
                     [proxy1]

eth0から入ってきたあて先ポート=80の通信は、あて先IPをsquidに変更し、ポート番号もsquidで使用する3128番に変更する。これを実現する設定を/etc/sysconfig/iptablesに追加する。

[root@ml115 ~]# vi /etc/sysconfig/iptables
...
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT  ←元々あったeth0からのInputを全て許可するルール
...
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.9:3128
...
-A POSTROUTING -o ppp0 -j MASQUERADE      ←元々あったppp0からのOutputを全てIPマスカレードするルール
...

[root@ml115 ~]# service iptables restart

squidの設定は、/etc/squid/squid.confに記述する。詳細なチューニングをするのでなければ変更するべきところは少なく、最低限アクセス制限の設定をする。デフォルトではlocalhostからの接続しか許可されないので、以下の設定を追加する。

[root@ml115 ~]# vi /etc/squid/squid.conf
...
acl private_net src 192.168.0.0/255.255.0.0    ←追加
http_access allow localhost
http_access allow private_net                  ←追加
http_access deny all
...
http_port 3128 transparent                     ←"transparent"を追加
...

デフォルトではキャッシュに使用するメモリは8MB、HDDは100MBとなっているが、増やしたほうがヒット率は上がる。ただある程度で頭打ちになる。

設定をしたらsquidを起動する。

[root@ml115 ~]# service squid restart

最後に、squidサーバのiptablesで、squidで使用する3128/tcpを許可する。

[root@proxy1 ~]# vi /etc/sysconfig/iptables
...
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 3128 -j ACCEPT
...
[root@ml115 ~]# service iptables restart

ここまでの設定で、クライアントPCからインターネットへのHTTPアクセスはすべてsquid経由になる。ためしにsquidのログを見ながらインターネットを見に行ってみよう。

[root@proxy1 ~]# tail -f  /var/log/squid/access.log
1195255448.391    405 192.168.0.3 TCP_MISS/200 46221 GET http://www.asahi.com/ - DIRECT/202.232.139.14 text/html
1195255448.567    175 192.168.0.3 TCP_MISS/200 862 GET http://imp.asahi.com/jserver/acc_random=71651847/SITE=TOP/AREA=BANNER/AAMSZ=728X90/OENCJP=EUC/pageid=40219793 - DIRECT/220.213.234.196 application/x-javascript
1195255448.589     21 192.168.0.3 TCP_MISS/200 26886 GET http://img.ak.impact-ad.jp/yc/ah/2007/11/071112his_onlinespbnr-1f0d3a5d6f615b03e325e5abc7e17a0654a6241b.gif - DIRECT/60.254.185.59 image/gif
1195255448.599     27 192.168.0.3 TCP_MISS/200 687 GET http://ad.jp.doubleclick.net/adj/asahi.np/top_text_1;sz=500x16;ord=3164293186689577.5? - DIRECT/210.153.90.13 application/x-javascript
1195255448.634     34 192.168.0.3 TCP_MISS/200 703 GET http://ad.jp.doubleclick.net/adj/asahi.np/top_text_2;sz=500x16;ord=6056704805117622? - DIRECT/210.153.90.13 application/x-javascript
1195255448.693     58 192.168.0.3 TCP_MISS/200 1134 GET http://imp.asahi.com/bservers/AAMALL/acc_random=78535733/pageid=40219793/AAMB1/SITE=TOP/AREA=BUTTON1/AAMSZ=80X45/OENCJP=EUC/AAMB2/SITE=TOP/AREA=BUTTON2/AAMSZ=80X45/OENCJP=EUC - DIRECT/220.213.234.196 application/x-javascript
....

実際に使ってみると、はじめて見に行くサイトはsquidの処理遅延が入るぶんやや遅くなる。2回目以降は早いが、実はブラウザもローカルにキャッシュをもっているので、効果はあまり変らないかもしれない。