通常のプロキシサーバーを構築した場合、ユーザーは使用している Web ブラウザにプロキシサーバーとポート番号の指定を行わなければなりません。Web ブラウザは設定されたプロキシサーバーに HTTP リクエストを行ない、プロキシサーバーはそのリクエストを外部の Web サーバーへ転送します。通常のプロキシサーバーはこのようにユーザー側で設定されることにより、プロキシサーバーとしての役割を果たすことができます。しかし、ブラウザ設定の手間を省きたい場合やユーザーにプロキシを使わせたいがプロキシサーバーの存在をユーザーに意識させたくないといった状況も考えられます。このようなときに利用できるのが透過型プロキシです。透過型プロキシを利用すると、ユーザーは外部の Web サーバーに直接接続しているように見えますが、実際にはゲートウェイ上で動作させたプロキシサーバーへと接続されています。
透過型プロキシサーバーは、iptables の機能を組み合わせることで実現します。インターネットと LAN を分離するゲートウェイ上で透過型プロキシサーバーを動作させれば、クライアントが Web サーバーへアクセスするためのパケット(TCP の 80 番ポート宛のパケット)を検出し、iptables で定義したルールにより Squid がリクエストを待ち受ける 3128 番ポートにパケットを転送します。そして、そのパケットを Squid が受け取り代理アクセスを行います。これにより、クライアント側では特別な設定を行わなくても Web サーバーへアクセスできるようになります。
以下では、透過型プロキシの設定について解説します。
透過型プロキシを有効にするには以下のタグを設定します。
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 |
ここでは、port に Squid の標準のポート番号である 3128 をそのまま指定しています。これは、Squid がリクエストを待ち受けるポート番号で、iptable のルールによりパケットが転送されるポート番号となります。
透過型プロキシとして動作させるには virtual を指定します。
HTTP のポート番号である 80 を指定します。
既定値のまま off を指定します。
透過型プロキシとして動作させるには on を指定します。
透過型プロキシとして動作させるには on を指定する必要があります。HTTP/1.1 のリクエストには URL で指定されたホスト名を指す Host: ヘッダが含まれています。しかし、透過型プロキシを利用する場合、HTTP リクエストに Web サーバーのホスト名を含んでいません。この値を on に変更することで、Squid は HTTP の HOST: ヘッダに基づいて HTTP 接続を行うようになります。
透過型プロキシにおける 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 に書き出されるログを参照し、プロキシ経由でリクエストがフォワードされていることも確認してください。