サーバとして
・受信パケットは破棄。ただしステートフル性を確認し、サーバから送信されたパケットに関連するものは許可
・送信パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・メンテナンスホスト(内部)からのping、メンテナンスホストへのpingを許可
・メンテナンスホスト(内部)からのssh(TCP 22)を許可
ルータとして
・転送パケットで、内部ネット→外部ネットのものは許可。外部ネット→内部ネットへの転送パケットはステートフル性を確認できたものだけ許可
・Linuxサーバを経由して外部へ出ていくパケットのソースアドレスを変換
・内部アドレスやプライベートアドレスが外部に漏れないようにブロック
透過型プロキシサーバとして
・内部ネットからのHTTPプロキシ(TCP 3128)を許可
・内部ネットからLinuxルータに入ってくるパケットのうちHTTPサービスのものを次のように変換
失火うディスティネーションアドレスをプロキシサーバ(Linuxルータ)のアドレスに変換
ディスティネーションポートをHTTPプロキシサービスのTCP 3128に変換
(※無数のパケットの中からHTTPサービスのパケットだけを区別するには、
ディスティネーションポートがTCP 80であるかどうかで判断する)
1台のLinuxサーバをルータとして機能させるとともに、HTTPプロキシサーバとしても機能させます。テンプレート5をベースに、透過型プロキシサーバとして必要な機能を加えます。
3〜8行目で環境に合わせた値を設定します。今回は新たに6行目を加えています。HTTPプロキシサーバのサービスポート番号を指定します。
6 proxy_port='3128'
HTTPプロキシサービスに対し、内部ネットからのアクセスのみを許可します。アクセスを制限することで外部ネットの不特定多数のユーザーに利用される危険性を排除します。アクセス制限の解除方法は、第2回を参考にしてください。
49 /sbin/iptables -A INPUT -p tcp --syn -m state --state NEW -s $internal_net -d $my_internal_ip --dport $proxy_port -j ACCEPT
内部ネットのクライアントは、デフォルトルータがLinuxルータになっているため、外部へ出るパケットはすべてLinuxルータを経由します。そこでパケットがLinuxルータを通過する際に、ディスティネーション(あて先)ポートを調べ、TCP 80番のものをHTTPプロキシのサービスポートであるTCP 3128番に書き換えます。これで、ユーザーに意識させることなくプロキシサーバを利用できるようになります。
なお、Linuxルータ自身がWebサーバにアクセスできるよう、Linuxルータ発のパケットに関しては、ディスティネーションアドレス/ポートを書き換えないようにします。
58 /sbin/iptables -t nat -A PREROUTING -i eth1 -s ! $my_internal_ip -p tcp --dport 80 -j DNAT --to-destination $my_internal_ip:$proxy_port -t nat natテーブルを使用 -A POSTROUTING PREROUTINGチェインを使用し、内部ネットからLinuxルータに入ってくるパケットを書き換える -j DNAT DNATを使用し、ディスティネーション(あて先)アドレスを書き換える s ! $my_internal_ip ソースアドレスがLinuxルータの内部ネット側(eth1)アドレス以外のものを対象にする(Linuxルータ発のパケットに関しては、ディスティネーションアドレス/ポートを書き換えないようにするため) --to-destination $my_internal_ip:$proxy_port 書き換え後のディスティネーションアドレスとポート番号
shスクリプトの用意ができたら、前回までのようにshスクリプトを実行します。クライアントからWebアクセスを行い、Squidのアクセスログに接続ログが残っていることを確認します。
PREROUTINGチェインの「REDIRECT」を使って、パケットをリダイレクトし、透過型プロキシを実現することもできます。テンプレート7の58行目を次の1行に置き換えます。
58 /sbin/iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port $proxy_port -j REDIRECT リダイレクト(向け直し)の使用 --to-port $proxy_port リダイレクト先のポート
テンプレート7の「-j DNAT」では、パケットのディスティネーションIPアドレスとポート番号を書き換えることができました。しかし「-j REDIRECT」は、ホスト自身の別サービスポートにしかリダイレクトできません。そのためLinuxルータとHTTPプロキシサーバが同一のホストで動作していない場合は、REDIRECTも使用できません。
Copyright © ITmedia, Inc. All Rights Reserved.