連載
» 2005年05月17日 00時00分 公開

習うより慣れろ! iptablesテンプレート集(2):natテーブルを利用したLinuxルータの作成 (5/6)

[鶴長鎮一,@IT]

テンプレート9
透過型プロキシの実現(ルータとサーバを分離)

テンプレート9の想定環境

サーバとして
・外部からの接続パケットは基本的にすべて破棄
 ただし接続済み通信のパケットは許可
・内部からの接続パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・メンテナンスホストからのping、メンテナンスホストへのpingを許可
・メンテナンスホストからのssh(TCP 22)を許可
ルータとして
・Linuxサーバを経由して外部へ出ていくパケットのソースアドレスを変換
 内部アドレス→外部アドレス
・内部アドレスやプライベートアドレスが外部に漏れないようにブロック
・内部から外部ネットに出ていくHTTPサービスのパケットを書き換えディスティネーションアドレスをプロキシサーバ(Linuxサーバ自身)のアドレスとサービスポート(TCP 3128)に
 HTTPサービスのパケット:ディスティネーションポートTCP 80
・ソースIPが内部ネットで、ディスティネーションがプロキシサーバへの転送を許可する

 プロキシサービスの利用が増加した場合、1台のホストで複数の機能(プロキシとルータ)を処理するのはパフォーマンス(スループットなど)と耐障害性の面で不利になります。ここでは、それぞれの機能を分離した場合を紹介します。

テンプレート9の解説

 プロキシサーバは内部ネット内に設置するものとします。この方針に従い、プロキシサーバのIPアドレスとポート番号を10、11行目で定義します。

10 proxy_ip=192.168.0.100
11 proxy_port=3128

 テンプレート8ではLinuxルータでTCP 3128の解放を行いましたが、テンプレート9ではプロキシを別サーバにしたためその必要はありません。

 なお、プロキシサーバを外部ネットに設置する場合は、テンプレートを修正する必要があります。

 続いて、63〜65行目を見てみます。

63 iptables -t nat -A PREROUTING -i eth1 -s ! $proxy_ip -p tcp --dport 80 -j DNAT --to $proxy_ip:$proxy_port
64 iptables -t nat -A POSTROUTING -o eth1 -s $internal_ip -d $proxy_ip -j SNAT --to $my_internal_ip
65 iptables -A FORWARD -s $internal_ip -d $proxy_ip -i eth1 -o eth1 -p tcp --dport $proxy_port -j ACCEPT

 63行目で、パケットのあて先をプロキシサーバに変えています。

 63行目だけでも透過型プロキシが成立しそうに思えますが、実際には64、65行目が必要になります。テンプレート9の場合、HTTP要求を出す端末はデフォルトルータへパケットを送っているため、戻ってくるパケットもデフォルトルータ経由であることを知っています。つまり、Linuxルータでディスティネーションポートを変更していますが、戻りパケットはLinuxルータからになります。

 63行目だけでは、端末はデフォルトルータに要求を送っているにもかかわらず、応答パケットはプロキシサーバから返ってくることになり、不整合が生じます。この不整合を調整するのが64行目の役割です。具体的には、「端末から出たHTTP要求に対する応答がLinuxルータから戻るように」、要求パケットのソースIPをLinuxルータのアドレスに書き換えます。プロキシサーバはHTTP要求に対する応答をLinuxルータに行い、その後Linuxルータから端末へ戻されます。その過程で行われるパケットのFORWARD(eth1からeth1への)を65行目のように解放します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。