Squidによる透過型プロキシの設定


Squidとは、プロキシサービスに必要な代理アクセスや分散キャッシュの機能を提供するソフトです。
このSquidを使うことにより、クライアントからのWWWサーバーへのアクセスをプロキシサーバーが一手に引き受けることによりクライアントのセキュリティを向上させ、さらにプロキシサーバーが取得したオブジェクトをキャッシュすることにより、
同様のリクエストに対するアクセスを高速化することができます。

しかしながら、プロキシサーバーは便利で強力である反面、クライアント側の設定が面倒ですので、透過型プロキシを導入することにしました。

透過型プロキシサーバーを構築するには、ipchainsSquidを組み合わせます。
すなわち、クライアントからにWWWサーバーへアクセスするため、プロキシサーバーの80/TCPポート宛にパケットが届いた場合、ipchainsのinputチェインでSquidが監視するポート3128にパケットを転送し、Squidはそれを受けて代理アクセスを行うようにします。

こうすることにより、クライアント側では特に設定を行うこともなく、プロキシを意識せずにWWWサーバーへアクセスすることができ、Squidのhttpdアクセラレータ機能によりアクセスを高速化することもできます。

それでは、この透過型プロキシを利用するための、ipchainsとSquidの設定方法を説明しましょう。

・透過型プロキシのための ipchains の設定

先に触れたようにipchainsの役割は、透過型プロキシサーバーに届いたWWWサーバー宛のパケットをSquidが監視する3128のポートに転送することです。
ただ、それだけでは自らのWWWサーバー宛へのパケットも転送してしまいますので、そのパケットは通過させるようにします。
具体的には、下記のコマンドをターミナル画面より打ち込みます。

# ipchains -A input -p tcp -d 127.0.0.0/8 www -j ACCEPT
# ipchains -A input -p tcp -d 192.168.0.0/23 www -j ACCEPT
# ipchains -A input -p tcp -d 0.0.0.0/0 www -j REDIRECT 3128

1行目及び2行目が自らのWWWサーバー宛のパケットを通過させるルールで、3行目がwwwサーバー宛のパケットを3128のポートに転送するルールです。
なお、3行目のルールを最初に設定すると、自らのWWWサーバー宛へのパケットも転送されてしまいますので、注意してください。
そして、このルールについて、サーバーを再起動したときに自動的に有効となるよう/etc/sysconfig/ipchainsに保存しておきます。

# ipchains-save > /etc/sysconfig/ipchains

なお、ipchainsのオプション等の説明については、当サイトの「ipchainsの設定」を参照してください。

・透過型プロキシのための Squid の設定

Squidの設定は、「/etc/squid/squid.conf」ファイルで行います。
基本的な設定は、デフォルトのままで使えますので、ここでは必要な部分のみ説明することにします。
なお、以下の設定は、viやgedit、emacs等のお好きなエディタで/etc/squid/squid.conf に追加してください。

まず、アクセスコントロールに関する設定を行います。
プロキシサーバーをインターネットから見える場所に置きますので、セキュリティのためにローカルネットワークからしか利用できないようにアクセスコントロールリスト ( acl ) とHTTPアクセスコントロールにより制限を設けます。
/etc/squid/squid.conf の「# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS」と書かれている行の下に、下記の太字の行を加えます。

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
acl mynetwork src 192.168.0.0/255.255.254.0
http_access allow mynetwork
http_access allow localhost
http_access deny all

これで、「192.168.0.0 〜 192.168.0.255」(すなわち、gw.e-ryocihi.netのホスト)と「192.168.1.0 〜 192.168.1.255」(すなわち、e-ryoichi-home.netのホスト)、及び「127.0.0.1」(localhost) からしかアクセスできないようになりました。

一応これだけでもプロキシサーバーとすることができますが、透過型プロキシサーバーとするために、httpdアクセラレータ機能を利用します。
httpdアクセラレータとは、クライアントからのリクエストをWWWサーバーの代わりにSquidが受け取り、要求されたオブジェクトがキャッシュされていて、かつ更新されていない場合には、キャッシュ内のオブジェクトをクライアントに返し、キャッシュされていなかったり、更新されている場合には、本来のWWWサーバーにリクエストを送り、取得したオブジェクトをクライアントに返すという機能です。

具体的な設定は、「# HTTPD-ACCELERATOR OPTIONS」に下記の太字部分を追加します。
なお、私の修正方法は、デフォルトの内容をそのまま残し、修正する内容を新たに追加する方法をとっています。

# HTTPD-ACCELERATOR OPTIONS
# -----------------------------------------------------------------------------

# TAG: httpd_accel_host
# TAG: httpd_accel_port
# If you want to run Squid as an httpd accelerator, define the
# host name and port number where the real HTTP server is.
#
# If you want virtual host support then specify the hostname
# as "virtual".
#
# If you want virtual port support then specify the port as "0".
#
# NOTE: enabling httpd_accel_host disables proxy-caching and
# ICP. If you want these features enabled also, then set
# the 'httpd_accel_with_proxy' option.
#
#httpd_accel_host hostname
#httpd_accel_port port

#for transparent proxy
httpd_accel_host virtual
httpd_accel_port 80



# TAG: httpd_accel_with_proxy on|off
# If you want to use Squid as both a local httpd accelerator
# and as a proxy, change this to 'on'.
#
#httpd_accel_with_proxy off

#for transparent proxy
httpd_accel_with_proxy on


# TAG: httpd_accel_uses_host_header on|off
# HTTP/1.1 requests include a Host: header which is basically the
# hostname from the URL. Squid can be an accelerator for
# different HTTP servers by looking at this header. However,
# Squid does NOT check the value of the Host header, so it opens
# a big security hole. We recommend that this option remain
# disabled unless you are sure of what you are doing.
#
# However, you will need to enable this option if you run Squid
# as a transparent proxy. Otherwise, virtual servers which
# require the Host: header will not be properly cached.
#httpd_accel_uses_host_header off

#for transparent proxy
httpd_accel_uses_host_header on

以上で、透過型プロキシサーバーの設定が完了です。
Squidのデーモンであるsquidは、

# /etc/init.d/squid start

で起動します。

・Squidのキャッシュマネージャについて

Squidは、「/var/log/squid/access.log」、「/var/log/squid/cache.log」、「/var/log/squid/store.log」の3種類のログを作成します。
これらのログを分析し、Squidの統計情報を出力するのが、キャッシュマネージャと呼ばれるCGIプログラムであり、Red Hat Linuxでは「/usr/lib/squid/cachemgr.cgi 」としてインストールされています。

ただし、このままではCGIプログラムであるcachemgr.cgiを実行して、その内容をブラウザで見ることができません。
そこで、自らのWWWサーバー上ですでにCGIが使えるように設定しているディレクトリに、cachemgr.cgi専用のディレクトリを作成し、そこにcachemgr.cgi をコピーします。

# mkdir /○○○○/cgi-bin/squid
# cp /usr/lib/squid/cachemgr.cgi  /○○○○/cgi-bin/

   (注)mkdir の「/○○○○」のディレクトリは、Apacheで指定している DocumentRoot のディレクトリです。

そして、Apacheの設定ファイルである /etc/httpd/conf/httpc.conf でセキュリティを守るため、外部からはアクセスできないように修正を行います。
具体的には、次の記述を加えました。

<Directory "/○○○○/cgi-bin/squid">
AllowOverride None
Options ExecCGI
Order deny,allow
Deny from all
Allow from 192.168.0.0/255.255.254.0
</Directory>

以上で準備が整いましたので、httpd に設定ファイル(/etc/httpd/conf/httpd.conf) の再読み込み(/etc/init.d/httpd reload) を行い、ブラウザからURL( http://192.168.0.2/cgi-bin/squid/cachemgr.cgi )を指定して、キャッシュマネージャにアクセスします。
   (注) URLの「 192.168.0.2 」は、Squidを稼動させているサーバーのアドレスです。

キャッシュマネージャにアクセスすると、次のような画面が表示されます。




本来、「Manager name」と「Password」の欄には、セキュリティを守るために何らかの登録を行い、認証することになっていると思うのですが、当サーバーでは空白でも、適当な値を入力しても、「Continue」をクリックすると、次の画面が表示されます。
少し、やばい感じがします。(~_~;)



この画面の各項目をクリックして表示される内容については、今のところ「ふ〜ん、そうなの。(+_+)」という状態です。

ということで、今回のところは、ここまでにしておきます。(~_~;)
このページをご覧になっている方で、何か知っていることがあれば、メールやBBSで教えてください。
よろしくお願いします m(__)m