privoxyとiptablesで透過型HTTPプロクシ

privoxy正規表現ベースのアクセス制限や強力なフィルタ機能のあるHTTPプロクシだ。iptablesと組み合わせると透過型プロクシとして設定することもできる。

今回は透過型プロクシを使って、特定ホストに対してのみHTTPリクエストが可能なように設定してみる。この例では内部ネットワークが 192.168.0.0/16 で、その中のPCでゲートウェイとして設定されているのが透過型プロクシを処理するマシンとなる。

/etc/privoxy/config

privoxyの待ち受けアドレスとポート番号を適当に設定する。

listen-address 0.0.0.0:1499

一般的なHTTPプロクシは「GET http://host/path...」というリクエストを受け取るのだが、透過型プロクシでは「GET /path..(改行)Host: host」のような、通常のリクエストを受け取る。

privoxyはaccept-intercepted-requestsを有効にすると、通常のHTTPリクエストに対しても Host ヘッダの情報を利用して中継処理を行うようになる。

accept-intercepted-requests 1

iptablesの設定

iptables の nat テーブルの PREROUTING チェインに、内部ネットワークから外部のポート80へのリクエストをマシン内部にリダイレクトするよう設定する。

iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to-ports 1499 

アクセス制限

次のようなアクションファイルを書いて、whitelist.actionという名前で保存する。

# 全てのURLをブロックする
{ +block }
/

# 除外するURL
{ -block }
.debian.org
.recaptcha.net

/etc/privoxy/config でアクションファイルを参照するよう設定する。

actionsfile whitelist.action