検索
連載

Linuxで作るファイアウォール[NAT設定編]ゼロから始めるLinuxセキュリティ(4)(2/2 ページ)

今回からiptablesの具体的な設定を解説する。iptablesの使い方はやや複雑だが、理屈を理解すれば難しいものではない。前半で紹介する知識を利用して、まずはNATを実現しよう。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

NATの動作と設定

 目的のホストやポートに接続するためには、そのポリシーに適合するルールを作成しなければなりません。今回はNATのルールを作成しましょう。

デフォルト設定の確認

 iptablesの設定を変更する前に、まずはデフォルトのルールを確認してみましょう。以下のように、すべての通信を許可するようになっていると思います。

# iptables -L -t filter
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
デフォルトの適用ルール

 上記の結果は、何もルールが適用されていない状態を示しています。ちなみに、「-L -t filter」はfilterテーブル、「-L -t nat」はnatテーブルのルールをリストアップするオプションです。

NATの動作

図1 NATの動作
図1 NATの動作

 外部のホストから各サーバに接続する際、まずファイアウォールの外側のインターフェイス(eth0)に割り当てられた各サーバの仮想IPアドレスに対してアクセスしてきます。ファイアウォールを介して接続を許可するルールが存在しても、そのままのDestinationアドレス(あて先アドレス)では実体のサーバにはアクセスできません。そこで、ファイアウォールでDestinationアドレスを仮想IPアドレスから実IPアドレスに変換する必要があります(図1)。

 

 におけるDestinationアドレスは172.16.0.10です。しかし、Webサーバの実IPアドレスは192.168.0.10であるため、172.16.0.10のままではWebサーバに到達できません。そこで、アドレスの変換を行います。すると、におけるDestinationアドレスはWebサーバの実IPアドレスである192.168.0.10になります。これを行うのが、これから設定するNATというわけです。

 動作が分かったところで、これをiptablesに行わせる方法を説明します。図1前回の最後で紹介したNATルールを参考にしてiptablesのオプションに置き換え、natテーブルのチェインにルールを追加していきます。

コラム:ポートフォワードの併用

 各チェインとも、ポートフォワードさせることも可能です。今回は使用しないので簡単な説明にとどめておきますが、次のようなことが考えられます。 「172.16.0.10:80/TCP」への接続要求があったとします。NATのみでは192.168.0.10にDestinationアドレスを変換するだけですが、ポートフォワードを加えると「192.168.0.10:8080/TCP」のように、あて先のポート番号を変更することが可能になるのです。


PREROUTINGチェイン

 前述したように、natテーブルは3つのチェインから成ります。ここであらためて詳しく解説します。

図2 PREROUTINGチェイン:パケット受信時にあて先のアドレスを変換
図2 PREROUTINGチェイン:パケット受信時にあて先のアドレスを変換

 PREROUTINGチェインはDestinationアドレスを変換するもので、基本的に外部から入ってくるパケット用と考えください。内部セグメントにはプライベートアドレスが割り当てられています。グローバルアドレスのままでは当然ながら内部セグメント上のホストへは到達できないので、Destinationアドレスを変換する必要があるのです。

POSTROUTINGチェイン

図3 POSTROUTINGチェイン:パケット送信時に送信元のアドレスを変換
図3 POSTROUTINGチェイン:パケット送信時に送信元のアドレスを変換

 POSTROUTINGチェインは送信元アドレスを変換するもので、基本的に外部へ出ていくパケット用です。内部ホストに割り当てられているプライベートアドレスのままでは、外部のホストに接続することはできません。PREROUTINGとは逆に、プライベートアドレスをグローバルアドレスに変換する必要があるのです。

OUTPUTチェイン

図4 OUTPUTチェイン:ローカルで生成されたパケットのDestinationアドレスを変換
図4 OUTPUTチェイン:ローカルで生成されたパケットのDestinationアドレスを変換

 OUTPUTチェインは、ローカルで生成されたパケットのDestinationアドレスを変換することができます。

iptablesの記述方法

 各チェインの役割を理解すれば、外部からの接続要求に対してどのような処理が必要であるか分かると思います。Destinationアドレスの変換を行う必要があるのですから、この場合はPREROUTINGチェインにルールを追加しなければなりません。WebサーバあてパケットのDestinationアドレスを172.16.0.10(Webサーバの仮想IPアドレス)から192.168.0.10(Webサーバの実IPアドレス)に変換するには、下記のようなオプション/パラメータを付けます。

# /sbin/iptables -t nat -A PREROUTING -d 172.16.0.10 -i eth0 -j DNAT --to 192.168.0.10
Destinationアドレス変換ルール

 順番に説明すると、

-t nat

でnatテーブルの使用を指定します。次に、

-A PREROUTING

でPREROUTINGチェインに以下のルールを追加しています。

-d 172.16.0.10

は、

-j DNAT --to 192.168.0.10

と対になっています。もうお分かりだと思いますが、「Destinationアドレスが172.16.0.10であった場合は、これを192.168.0.10に変換する」という意味です。

-i eth0

はパケットを受け取るインターフェイスがeth0であることを指定しています。

 少々くどくなりますが、iptablesの書式に慣れてもらうためにさらに換言してみましょう。eth0で受信したDestinationアドレスが172.16.0.10にマッチした場合(-d 172.16.0.10)は、-jで指定したターゲットを実行する。そのターゲットがDNATで、Destinationアドレスを192.168.0.10に変換するように指定されている。このルールを-A PREROUTINGでPREROUTINGチェインに追加する。1行でこれだけの処理を指定しているというわけです。

 接続要求に対しては、それに対する応答パケットを返します。当然、応答のパケットもファイアウォールを通過するわけですが、NATに関しては特に定義する必要はありません。接続してきたパケットの送信元アドレスは変換させていないからです。応答パケットはファイアウォールを通過した後、もともと接続要求のあったアドレス(172.16.0.10)でクライアントに戻ります。

 以上、Webサーバの場合を例にiptablesの記述方法を説明しました。ほかのサーバも同じようにルールを追加してください。

パラメータ「-i」と「-o」の注意

 最後に、インターフェイスを指定するパラメータ「-i」と「-o」の使い方を補足しておきます。これらのパラメータの使い方にはちょっとした注意が必要です。

 上記の設定では「-i」を付けていますが、見方を変えれば次のようにも考えられます。

eth1のインターフェイスから出ていくIPアドレスを変換する


 どうでしょうか? こう考えてしまった場合は「-o」を付けてしまうかもしれません。しかしながら、これでは間違いなのです。これは、考え方の違いではなくiptablesの仕様であるとお考えください。PREROUTINGチェインは受信インターフェイスのみ選択可能という制限があります。よって、「-o」を指定しまうとiptablesではエラーとなってしまいます。反対に、POSTROUTINGとOUTPUTは送信インターフェイスにしか指定できないので注意してください。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る