サーバとして
・外部からの接続パケットは基本的にすべて破棄
ただし接続済み通信のパケットは許可
・内部からの接続パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・メンテナンスホストからのping、メンテナンスホストへのpingを許可
・メンテナンスホストからのssh(TCP 22)を許可
ルータとして
・Linuxサーバを経由して外部へ出ていくパケットのソースアドレスを変換
内部アドレス→外部アドレス
・内部アドレスやプライベートアドレスが外部に漏れないようにブロック
・内部から外部ネットに出ていくHTTPサービスのパケットを書き換えディスティネーションアドレスをプロキシサーバ(Linuxサーバ自身)のアドレスとサービスポート(TCP 3128)に
HTTPサービスのパケット:ディスティネーションポートTCP 80
・ソースIPが内部ネットで、ディスティネーションがプロキシサーバへの転送を許可する
プロキシサービスの利用が増加した場合、1台のホストで複数の機能(プロキシとルータ)を処理するのはパフォーマンス(スループットなど)と耐障害性の面で不利になります。ここでは、それぞれの機能を分離した場合を紹介します。
プロキシサーバは内部ネット内に設置するものとします。この方針に従い、プロキシサーバの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.