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