22.13. ネットワークアドレス変換 (NAT)

寄稿: Chern Lee.

22.13.1. 概要

一般に natd(8) として知られている FreeBSD ネットワークアドレス変換デーモンは、 raw IP パケットを受信して、 ソースアドレスをローカルマシンに変更し、 そのパケットを外向きの IP パケットの流れに再注入するデーモンです。 natd(8) は、 データが戻ってきたときに、データの本来の場所を判別し、 もともと要求した相手へデータを返すことができるようにソース IP アドレスとポートを変更します。

NAT の最も一般的な使用法は、 一般的にはインターネット接続共有として知られているものを実行することです。

22.13.2. 設定

IPv4 の IP 空間が足りなくなりつつあること、および、 ケーブルや DSL のような高速の加入者回線利用者の増加によって、 人々はますますインターネット接続を共有する手段を必要としています。 一つの接続および IP アドレスを通していくつものコンピュータを回線に接続する能力がある natd(8) が合理的な選択になります。

もっともよくあるのは、ユーザが 1 つの IP アドレスでケーブルまたは DSL 回線に接続されたマシンを持っており、 インターネットへのアクセスを LAN 経由でいくつかのコンピュータに提供するのに、 この接続されたコンピュータを使用したいという場合です。

そのためには、インターネットに接続されている FreeBSD マシンはゲートウェイとして動作しなければなりません。 このゲートウェイマシンは 2 つの NIC が必要です (1 つはインターネットルータへ接続するためで、もう 1 つは LAN に接続するためです)。 LAN 上のすべてのマシンはハブまたはスイッチを通して接続されます。

インターネット接続を共有するために、 このような設定がよく使用されています。 LAN 内のマシンの 1 台がインターネットに接続しています。 残りのマシンはその “ゲートウェイ” マシンを通してインターネットにアクセスします。

22.13.3. 設定

次のオプションがカーネルコンフィギュレーションファイルに必要です。

options IPFIREWALL
options IPDIVERT

さらに、次のオプションを入れてもよいでしょう。

options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_VERBOSE

下記の設定を /etc/rc.conf で行わなければなりません。

gateway_enable="YES"
firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_interface="fxp0"
natd_flags=""
gateway_enable="YES" マシンがゲートウェイとして動作するように設定します。 sysctl net.inet.ip.forwarding=1 コマンドを実行しても同じ効果がえられます。
firewall_enable="YES" /etc/rc.firewall にあるファイアウォールルールを起動時に有効にします。
firewall_type="OPEN" これはあらかじめ定義されている、 すべてのパケットを通すファイアウォールルールセットを指定します。 他のタイプについては /etc/rc.firewall を参照してください。
natd_interface="fxp0" パケットを転送するインタフェースを指定します (インターネットに接続されたインタフェース)。
natd_flags="" 起動時に natd(8) に渡される追加の引数

/etc/rc.conf に前述したオプションを定義すると、起動時に natd -interface fxp0 が実行されます。 これは手動でも実行できます。

LAN にぶら下がっているマシンおよびインタフェースのそれぞれには RFC 1918 で定義されているプライベートネットワーク空間の IP アドレス番号を割り当て、デフォルトゲートウェイアドレスを natd マシンの内側の IP アドレスにすべきです。

たとえば LAN 側のクライアント A および B は IP アドレス 192.168.0.2 および 192.168.0.3 を割り当てられており、 natd マシンの LAN インタフェースは IP アドレス 192.168.0.1 を割り当てられています。 クライアント A および B のデフォルトゲートウェイは natd マシンの 192.168.0.1 に設定されなければなりません。 natd マシンの外部、 またはインターネットインタフェースは natd(8) の動作に際して特別の修正を必要としません。

22.13.4. ポート転送

natd(8) の短所は、インターネットから LAN 内のクライアントにアクセスできないということです。 LAN 内のクライアントは外部に向けて接続を行うことはできますが、 入って来るものを受け取ることができません。これは、LAN クライアントのどれかでインターネットサービスを動かそうとした場合に、 問題になります。これを何とかする単純な方法は natd マシンから LAN クライアントへ、 選択したインターネットポートを転送することです。

たとえばクライアント A で実行されている IRC サーバがあり、 クライアント B 上で実行されている web サーバがあるとします。 これが正しく動作するには、ポート 6667 (IRC) および 80 (web) への接続を対応するマシンに転送しなければなりません。

-redirect_port に適切なオプションを加えて natd(8) に渡さなければなりません。 書式は以下のとおりです。

     -redirect_port proto targetIP:targetPORT[-targetPORT]
                 [aliasIP:]aliasPORT[-aliasPORT]
                 [remoteIP[:remotePORT[-remotePORT]]]

上記の例では、引数は以下のようにします。

    -redirect_port tcp 192.168.0.2:6667 6667
    -redirect_port tcp 192.168.0.3:80 80

これで適切な tcp ポートが LAN クライアントマシンに転送されます。

-redirect_port 引数は個々のポートを対応させるポート範囲を示すのに使えます。 たとえば tcp 192.168.0.2:2000-3000 2000-3000 は 2000 番から 3000番ポートに受け取られたすべての接続を、 クライアント A 上の 2000 番から 3000 番に転送します。

これらのオプションは natd(8) を直接実行するか、 /etc/rc.conf 内の natd_flags="" オプションに指定して使用できます。

設定オプションの詳細については natd(8) をご覧ください。

22.13.5. アドレス転送

複数の IP アドレスが利用可能ですが、 それらが 1 台のマシン上になければならないときには、 アドレス転送が便利です。 これを用いれば natd(8) は LAN クライアントのそれぞれに外部 IP アドレスを割り当てることができます。 natd(8) は LAN クライアントから外部へ出て行くパケットを適切な外部の IP アドレスで書き直し、 そして特定の IP アドレスに対してやって来るトラフィックのすべてを、 指定された LAN クライアントに転送します。 これは静的 NAT としても知られています。 たとえば 128.1.1.1, 128.1.1.2 および 128.1.1.3 の IP アドレスが、 natd ゲートウェイマシンに属しているとします。 128.1.1.2 および 128.1.1.3 は LAN クライアントの A および B に転送される一方で、128.1.1.1natd ゲートウェイマシンの外部 IP アドレスとして使用することができます。

-redirect_address の書式は以下のとおりです。

-redirect_address localIP publicIP
localIP LAN クライアントの内部 IP アドレス
publicIP LAN クライアントに対応する外部 IP アドレス

上記の例では引数は以下のようになります。

-redirect_address 192.168.0.2 128.1.1.2
-redirect_address 192.168.0.3 128.1.1.3

-redirect_port と同様に、これらの引数は /etc/rc.conf 内の natd_flags="" オプションで指定できます。アドレス転送では、 特定の IP アドレスで受け取られたデータはすべて転送されるので、 port 転送は必要ありません。

natd マシン上の外部 IP アドレスは、 アクティブで外部インタフェースにエイリアスされていなければなりません。 やりかたは rc.conf(5) を参照してください。

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。