squidを透過型プロキシとして使う時の設定
squidをubuntu上にインストールし、透過型プロキシとして使用するための設定をメモします。図のようなネットワーク構成で、ubuntu1がsquidを使用します。なお、ubuntu1にプロキシサーバに関する設定を行うことなく、ubuntu1のhttpトラフィックをsquidに介入させる設定は完了しているとします。(vyattaを使って透過型プロキシ環境を構築する参照)
Squidのインストール
ubuntuのターミナル上で下記のコマンドを実行してsquidのインストールは完了です。
sudo apt-get install squid
/etc/squid3/squid.confの修正
続いてsquidを透過型プロキシとして使うための設定です。/etc/squid3/squid.confに必要な記述を追記します。
アクセスコントロールの設定
まず、squidにクライアントPC(図中ubuntu1)のトラフィックの処理を許可するために、アクセスコントロールを設定します。具体的には、クライアントPC(図中ubuntu1)のネットワークアドレス192.168.101.0/24からのトラフィックの処理を許可するために、下記の2行をsquid.confに追記します。 「acl lan1 src 192.168.101.0/24」でsquidに届いたトラフィックの送信元が192.168.101.0/24であるネットワークを定義しています。「lan1」は適当につけた名前です。そしてここで定義した「lan1」からのトラフィックの処理をsquidに許可するために「http_access allow lan1」を追記します。
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl lan1 src 192.168.101.0/24 ←この行を追記
.
.
(中略)
.
.
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
http_access allow lan1 ← この行を追記
squidがトラフィックを待ち受けるポート番号の設定
squidが待ち受けるポート番号を3128に指定し、さらに透過型プロキシとして使う場合には「transparent」を記述します。
# Squid normally listens to port 3128
http_port 3128 transparent ← この行を追記
ログ形式の設定
/var/log/squid3/access.logに記録されるsquidのログ形式を指定します。デフォルトだと日時が累積秒数で表示されてわかりにくいので、12/Mar/2013:15:20:21のように表示されるように変更します。
# The default formats available (which do not need re-defining) are :
#
#logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
logformat squid %tl %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt ← この行を追記
キャッシュに使用するディスクサイズの設定
squidがキャッシュに使用するディスク(HDD、SSD)サイズ(MB単位)を指定します。100がディスクサイズ、16が一次ディレクトリ数、256が二次ディレクトリ数を表しています。ここのディスクサイズが大きいほど、より多くのWebコンテンツをキャッシュすることができ、キャッシュヒット率を向上させることができます。
# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid3 100 16 256
cache_dir ufs /var/spool/squid3 100 16 256 ← この行を追記
キャッシュに使用するメモリサイズの設定
squidがキャッシュに使用するメモリサイズ(MB単位)を指定します。メモリサイズもディスクサイズと同様、大きいほどキャッシュヒット率を向上させることができます。ディスクよりもメモリのほうがコンテンツを読み込む速度が速いため、メモリサイズを大きくしてメモリキャッシュヒット率を高くしたほうが、クライアントPCに対する応答速度が速くなる場合が多くなります。
#Default:
# cache_mem 256 MB
cache_mem 16 MB ← この行を追記
DNSサーバの設定
squidが使用するDNSサーバのIPアドレスを指定します。
#Default:
# none
dns_nameservers 192.168.122.1 ← この行を追記
最後に設定を反映させるためにSquidを下記のコマンドで再起動します。
sudo /etc/init.d/squid3 restart
以上でsquidの設定は完了です。
/proc/sys/net/ipv4/ip_forwardの値の修正
デフォルトでは/proc/sys/net/ipv4/ip_forwardに記述されている値が0となっており、この場合はIPフォワード機能が無効になっています。squidを動作させるにはIPフォワードを有効にする必要があるため、squidがインストールされたubuntuで下記のコマンドを実行し、ip_forwardの値を1に設定します。
echo "1" > /proc/sys/net/ipv4/ip_forward
上記を実行すると「Permission denied」とエラーが出るかもしれませんが、これはip_forwardに対する書き込み権限がないことが原因です。この場合はsuを使ってrootになってから上記のコマンドを実行するか、もしくは下記のコマンドを実行すればエラーが出ないはずです。
echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward
iptablesの設定
最後にsquid(実際にはSquidが動作するubuntu)に対して届いたhttpトラフィック(ポート番号80番)をsquidが待ち受けているポート番号である3128番宛のトラフィックに変換させるためのiptablesの設定を行います。下記をターミナル上で実行します。
iptables -t nat -A PREROUTING -s 192.168.101.0/24 -p tcp --dport 80 -j DNAT --to 192.168.101.101:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
上記では、squidにルーティングされてきたトラフィックのうち、送信元が192.168.101.0/24でありかつ宛先ポート番号が80番であるものを、DNATによって宛先アドレスを192.168.101.101(squidのIPアドレス)、宛先ポート番号を3128番(上記で設定したsquidが待ち受けるポート番号)に変換しています。この設定により、クライアントPCのhttpトラフィックをsquidに処理させることができます。
ただし、firestarterなどのファイアウォールを使用している場合は、firestarterによってsquidにルーティングされてきたトラフィックがブロックされて下記のようなエラーが出る場合もあるので、その場合はfirestarterを停止した上で上記のiptablesの設定をしてみて確認すると良いかもしれません。ただし、ファイアウォールを停止することはリスクが伴うので自己責任で安全な環境のもとで停止して下さい。なお、上記のiptableの設定を追加した後にfirestarterを停止するとリセットされて消えるので気をつけて下さい。