iptables

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


鶴長 鎮一
2010/3/11


 テンプレート7
 透過型プロキシの実現
 (Linuxルータをプロキシサーバとして併用する)

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

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

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

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

テンプレート7の解説

 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のアクセスログに接続ログが残っていることを確認します。

改造のヒント:REDIRECTを使う方法

 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も使用できません。

2/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