目的のホストやポートに接続するためには、そのポリシーに適合するルールを作成しなければなりません。今回は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テーブルのルールをリストアップするオプションです。
外部のホストから各サーバに接続する際、まずファイアウォールの外側のインターフェイス(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」のように、あて先のポート番号を変更することが可能になるのです。
前述したように、natテーブルは3つのチェインから成ります。ここであらためて詳しく解説します。
PREROUTINGチェインはDestinationアドレスを変換するもので、基本的に外部から入ってくるパケット用と考えください。内部セグメントにはプライベートアドレスが割り当てられています。グローバルアドレスのままでは当然ながら内部セグメント上のホストへは到達できないので、Destinationアドレスを変換する必要があるのです。
POSTROUTINGチェインは送信元アドレスを変換するもので、基本的に外部へ出ていくパケット用です。内部ホストに割り当てられているプライベートアドレスのままでは、外部のホストに接続することはできません。PREROUTINGとは逆に、プライベートアドレスをグローバルアドレスに変換する必要があるのです。
OUTPUTチェインは、ローカルで生成されたパケットのDestinationアドレスを変換することができます。
各チェインの役割を理解すれば、外部からの接続要求に対してどのような処理が必要であるか分かると思います。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
順番に説明すると、
-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」を付けていますが、見方を変えれば次のようにも考えられます。
eth1のインターフェイスから出ていくIPアドレスを変換する
どうでしょうか? こう考えてしまった場合は「-o」を付けてしまうかもしれません。しかしながら、これでは間違いなのです。これは、考え方の違いではなくiptablesの仕様であるとお考えください。PREROUTINGチェインは受信インターフェイスのみ選択可能という制限があります。よって、「-o」を指定しまうとiptablesではエラーとなってしまいます。反対に、POSTROUTINGとOUTPUTは送信インターフェイスにしか指定できないので注意してください。
Copyright © ITmedia, Inc. All Rights Reserved.