12.4. 透過型プロキシサーバーの設定

通常のプロキシサーバーを構築した場合、ユーザーは使用している Web ブラウザにプロキシサーバーとポート番号の指定を行わなければなりません。Web ブラウザは設定されたプロキシサーバーに HTTP リクエストを行ない、プロキシサーバーはそのリクエストを外部の Web サーバーへ転送します。通常のプロキシサーバーはこのようにユーザー側で設定されることにより、プロキシサーバーとしての役割を果たすことができます。しかし、ブラウザ設定の手間を省きたい場合やユーザーにプロキシを使わせたいがプロキシサーバーの存在をユーザーに意識させたくないといった状況も考えられます。このようなときに利用できるのが透過型プロキシです。透過型プロキシを利用すると、ユーザーは外部の Web サーバーに直接接続しているように見えますが、実際にはゲートウェイ上で動作させたプロキシサーバーへと接続されています。

透過型プロキシサーバーは、iptables の機能を組み合わせることで実現します。インターネットと LAN を分離するゲートウェイ上で透過型プロキシサーバーを動作させれば、クライアントが Web サーバーへアクセスするためのパケット(TCP の 80 番ポート宛のパケット)を検出し、iptables で定義したルールにより Squid がリクエストを待ち受ける 3128 番ポートにパケットを転送します。そして、そのパケットを Squid が受け取り代理アクセスを行います。これにより、クライアント側では特別な設定を行わなくても Web サーバーへアクセスできるようになります。

以下では、透過型プロキシの設定について解説します。

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

透過型プロキシを有効にするには以下のタグを設定します。

http_port 3128
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

http_port port

ここでは、port に Squid の標準のポート番号である 3128 をそのまま指定しています。これは、Squid がリクエストを待ち受けるポート番号で、iptable のルールによりパケットが転送されるポート番号となります。

httpd_accel_host hostname/ip|virtual

透過型プロキシとして動作させるには virtual を指定します。

httpd_accel_port port

HTTP のポート番号である 80 を指定します。

httpd_accel_single_host on|off

既定値のまま off を指定します。

httpd_accel_with_proxy on|off

透過型プロキシとして動作させるには on を指定します。

httpd_accel_uses_host_header on|off

透過型プロキシとして動作させるには on を指定する必要があります。HTTP/1.1 のリクエストには URL で指定されたホスト名を指す Host: ヘッダが含まれています。しかし、透過型プロキシを利用する場合、HTTP リクエストに Web サーバーのホスト名を含んでいません。この値を on に変更することで、Squid は HTTP の HOST: ヘッダに基づいて HTTP 接続を行うようになります。

12.4.2. 透過型プロキシのための iptables の設定

透過型プロキシにおける iptables の役割は、Web サーバー宛のパケットを Squid がリクエストを待ち受ける 3128 番ポート(既定値の場合)に転送することです。よって、iptables を使用して以下のようなルールを定義します。iptables の詳細については、第21章を参照してください。

# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

次にパケットフォワーディングを有効にします。

# echo 1 > /proc/sys/net/ipv4/ip_forward

設定後、クライアントから Web ページを参照できることを確認します。また、/var/log/squid/access.log に書き出されるログを参照し、プロキシ経由でリクエストがフォワードされていることも確認してください。