iptables

第4回 natテーブルを利用したLinuxルータの作成・2
(DNATで透過型プロキシサーバを実現)


鶴長 鎮一
2010/3/11


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

 サーバとして
  受信パケットは破棄。ただしステートフル性を確認し、サーバから送信されたパケットに関連するものは許可
  送信パケットは基本的にすべて許可
  ループバックアドレスに関してはすべて許可
  メンテナンスホスト(内部)からのping、メンテナンスホストへのpingを許可
  メンテナンスホスト(内部)からのssh(TCP 22)を許可

 ルータとして
  転送パケットで、内部ネット→外部ネットのものは許可。外部ネット→内部ネットへの転送パケットはステートフル性を確認できたものだけ許可
  Linuxサーバを経由して外部へ出ていくパケットのソースアドレスを変換
  内部アドレスやプライベートアドレスが外部に漏れないようにブロック

 透過型プロキシサーバとして
  内部ネットからLinuxルータに入ってくるパケットのうちHTTPサービスのものを次のように変換
      ディスティネーションIPアドレスプロキシサーバのアドレスに変換
      ディスティネーションポート番号をHTTPプロキシのポート番号(TCP 3128)に変換
  ソースIPアドレスが内部ネットのもので、ディスティネーションIPアドレスが
プロキシサーバのパケットに対し、転送を許可
(※無数のパケットの中からHTTPサービスのパケットだけを区別するには、
ディスティネーションポートがTCP 80であるかどうかで判断する)
 

  テンプレート8の表示(このウィンドウで開く)
テンプレート8の表示(別ウィンドウで開く)
テンプレート8(template08.sh)のダウンロード

テンプレート8の解説

 HTTPプロキシサーバをさらに効率よく稼働させるには、Linuxルータから分離し、専用サーバを用意します。Linuxルータとプロキシサーバを分離しても、透過型プロキシサーバとして稼働させることはできます。テンプレート7をベースに、HTTPプロキシサーバを分離した場合の設定を解説します。

 なおプロキシサーバは内部ネットに設置されるものとし、外部ネットの不特定多数のユーザーから利用されないよう、適切にアクセス制御が行われているものとします。

 3〜9行目で環境に合わせた値を設定します。プロキシサーバのIPアドレスとポート番号を6、7行目で定義します。

    6  proxy_port='3128'
    7  proxy_ip='192.168.0.1'

 Linuxルータとプロキシサーバが同一だったテンプレート7では、クライアントがLinuxのルータのHTTPプロキシサービスを利用できるよう、LinuxルータのTCP 3128番に対するアクセスを許可しました。しかし今回はLinuxルータとHTTPプロキシサーバが分離しているため、その必要はありません。

 テンプレート7と大きく異なるのは、透過型プロキシを実現している59〜61行目です。

    59  iptables -t nat -A PREROUTING -i eth1 -s ! $proxy_ip -p tcp --dport 80 -j DNAT --to $proxy_ip:$proxy_port
    60  iptables -t nat -A POSTROUTING -o eth1 -s $internal_net -d $proxy_ip -j SNAT --to $my_internal_ip
    61  iptables -A FORWARD -s $internal_net -d $proxy_ip -i eth1 -o eth1 -p tcp --dport $proxy_port -j ACCEPT

 内部ネットからLinuxルータに入ってくるパケットのうち、ディスティネーション(あて先)ポートがTCP 80番であるHTTPサービスのパケットをDNATで変換します(59行目)。HTTPプロキシサーバにパケットが転送されるよう、ディスティネーションアドレスやポート番号をプロキシサーバのものに書き換えます。なおHTTPプロキシサーバ自身がWebサーバにアクセスできるよう、サーバ発のパケットに関しては、ディスティネーションアドレス/ポートを書き換えないようにします。

 59行目だけでも透過型プロキシが成立しそうですが、実際には60、61行目が必要になります。

 今回、HTTPリクエストを送出するクライアントは、デフォルトルータであるLinuxルータへパケットを送っているため、レスポンスパケットもLinuxルータから送られてくることを期待しています。59行目だけでは、レスポンスパケットはプロキシサーバから戻され、クライアントは意図しないサーバからレスポンスパケットを受け取ることになります。従ってこのままではパケットの送受信が成立しません。

 そこで、クライアントから出たHTTPリクエストに対するレスポンスが、Linuxルータから戻るように、60行目を追加します。LinuxルータからHTTPプロキシサーバへ送信されるパケットを変換し、ソースIPアドレスをクライアントのアドレスからLinuxルータのアドレスに書き換えます。これでプロキシサーバはHTTPリクエストに対するレスポンスをLinuxルータへ戻すようになります。レスポンスを受け取ったLinuxルータはクライアントへ転送します。

 Linuxルータを挟んで、クライアントとHTTPプロキシサーバとの間でパケットが転送されるよう、61行目でパケットの転送(FORWARD)を許可します。

次回予告

 以上、iptablesのDNATを使った透過型プロキシサーバの構築方法を解説しました。前回紹介したSNATとIPマスカレードを組み合わせれば、高機能なLinuxルータとして活用できます。さらにDHCPサーバやDNSサーバも同時に稼働させれば、市販のブロードバンドルータに劣らない仕組みが構築できます。

 次回は、外部ネットからLinuxルータの内部ネットに限定的にアクセスできる「DMZ」を可能にする方法や、サーバの負荷を分散する方法を解説します。

3/3
 

Index
習うより慣れろ! iptablesテンプレート集 改訂版
第4回 natテーブルを利用したLinuxルータの作成・2
  Page 1
はじめに
DNATで透過型プロキシサーバを実現する
HTTPプロキシサーバの準備
  Page 2
テンプレート7
透過型プロキシの実現
(Linuxルータをプロキシサーバとして併用する)
  Page 3
テンプレート8
透過型プロキシの実現
(Linuxルータからプロキシサーバを分離)

次回予告

連載 習うより慣れろ! iptablesテンプレート集


 Linux Squareフォーラム セキュリティ関連記事
連載:習うより慣れろ! iptablesテンプレート集(全4回)
初心者にとって、iptablesは難しい。そこで、学習の第1歩としてテンプレートを自分の環境に適応させることから始めよう
連載:ゼロから始めるLinuxセキュリティ(全11回)
奥が深いセキュリティ対策の世界をゼロから解説。ホストレベルのセキュリティからファイアウォール、IDSの構築、ログ管理方法まで、システム管理者必見
特集:WebDAV時代のセキュリティ対策[前編]
WebDAVのメソッドは便利な反面、セキュリティホールとなり得る。しかし、適切な対策を講じることでメソッドの危険性は取り除くことができる
特集:FreeS/WANによるIPSecの導入と運用[前編]
LinuxでIPSecを利用するには、「FreeS/WAN」というIPSecスタックを用いることになる。まず、これをインストールすることから始めよう
特集:Linux以外のIPSecスタックとの相互接続[前編]
別のOSや異なるIPSecスタックとの相互接続が可能なら、その用途は大幅に広がる。前編では、FreeBSDのKAMEと相互接続を試みる
特集:sshでセキュアネットワーク
サーバにリモートログインする場合は、暗号化して転送するsshを使おう。sshをサーバとクライアントにインストールすれば、インターネット上でも安全な通信が可能になる

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します

TechTargetジャパン

Linux Square フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ



- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH