NATD(8)

名称
natd - ネットワークアドレス変換デーモン

書式
natd [-unregistered_only | -u] [-log | -l] [-proxy_only] [-reverse] [-deny_incoming | -d] [-use_sockets | -s] [-same_ports | -m] [-verbose | -v] [-dynamic] [-in_port | -i port] [-out_port | -o port] [-port | -p port] [-alias_address | -a address] [-target_address | -t address] [-interface | -n interface] [-proxy_rule proxyspec] [-redirect_port linkspec] [-redirect_proto linkspec] [-redirect_address linkspec] [-config | -f configfile] [-log_denied] [-log_facility facility_name] [-punch_fw firewall_range] [-log_ipfw_denied]

解説
このプログラムは、 FreeBSD における divert(4) ソケットと共に用いることによって、ネットワークアドレスの変換を 行います。 このプログラムは、複数の NIC とともに使用することを意図しています - PPP リンク上で NAT を行いたい場合、 ppp(8) の -nat スイッチを使用してください。

natd は通常、デーモンとしてバックグラウンドで実行します。 natd はマシンに入ってくるパケット、またはマシンから出て行くパケットを 生 (raw) のまま扱い、場合により IP パケットストリームに 再び送り出す前に手を加えます。

natd は他のホストへ向かうすべてのパケットについて、発信元 IP アドレスを 現在のマシンのものにする、という変換を行います。 このように変換された各パケットについて、変換内容を記録するために 内部テーブルエントリが作成されます。 発信元ポート番号も、パケットに適用したテーブルエントリを示すように 変更されます。 現在のホストの、対象となる IP アドレスを使ったパケットが受信されると、 この内部テーブルがチェックされます。 エントリが見つかると、パケットに正しい対象 IP アドレスとポート番号を 入れるのに利用されます。

以下のコマンドラインオプションが利用できます。

-log | -l
    様々なエイリアスの統計や情報をファイル /var/log/alias.log に記録します。このファイルは natd が起動されるたびに切りつめられます。

-deny_incoming | -d
    入力パケットのうち、内部変換テーブルに エントリの無いものを渡しません。

    本オプションを使用しないと、このようなパケットは下記の -target_address ルールを使用して変更され、内部変換テーブルにエントリが作成されます。

-log_denied
    拒否した入力パケットを syslog(3) を介してログします ( -log_facility を参照してください)。

-log_facility facility_name
    syslog(3) を介して情報をログするときに、指定したログファシリティを使用します。 引数 facility_name は syslog.conf(5) に記述されているキーワードのうちのひとつです。

-use_sockets | -s
    FTP data コネクションや IRC DCC send コネクションを確立するのに socket(2) を割り当てます。このオプションはよりシステムリソースを消費しますが、 ポート番号が衝突する場合でもコネクションが成功することを保証します。

-same_ports | -m
    出て行くパケットを変換する時に、できるだけポート番号を同じまま 保つようにします。このオプションにより、RPC のようなプロトコルが うまく働く可能性があがります。ポート番号を維持することができない時には、 暗黙のうちに通常と同じ方法で変換されます。

-verbose | -v
    起動時に daemon(3) を呼び出しません。よって、制御端末から切り離されずに、標準出力に すべてのパケット変換を表示します。このオプションはデバッグの目的に のみ用いるべきです。

-unregistered_only | -u
    登録されていない 発信元アドレスを伴う出て行くパケットのみを変換します。 RFC 1918 によれば、登録されていない発信元アドレスは 10.0.0.0/8 と 172.16.0.0/12 と 192.168.0.0/16 となっています。

-redirect_port proto
    targetIP: targetPORT[-targetPORT] [aliasIP:] aliasPORT[-aliasPORT] [remoteIP[: remotePORT[-remotePORT]]] 指定されたポートに入ってくるコネクションを別のホストとポートに リダイレクトします。 引数 proto には tcp または udp を指定します。 targetIP は転送先の IP 番号、 targetPORT は同じく転送先ポート番号 (範囲指定可能)、 aliasPORT は接続を受け付けるポート番号 (範囲指定可能)、 aliasIP は同じく接続を受け付けるアドレスです。 必要に応じて remoteIP と remotePORT を指定し、接続元を限定することができます。 targetPORT と aliasPORT は、それらの占める番号は異なっていても構いませんが、 範囲の大きさは同じである必要があります。 remotePORT の指定を省略した場合、全ポート番号が指定されたものとされます。 remotePORT を指定するときは、その範囲の大きさを targetPORT と同じにするか、あるいは 0 (全ポート番号) を指定する必要があります。 例えば、

        tcp inside1:telnet 6666

    という引数は、このマシンのポート 6666 に向けられた tcp パケットが マシン inside1 の telnet ポートに送られることを示しています。

        tcp inside2:2300-2399 3300-3399

    は、 ポート 3300-3399 に向けられた入力コネクションを ホスト inside2 のポート 2300-2399 へリダイレクトします。 マッピングは、ポート 3300 は 2300 に 3301 は 2301 にというように 1対1で行われます。

-redirect_proto proto localIP [
    publicIP [remoteIP]] publicIP に向けられたプロトコル proto ( protocols(5) を参照) の入力 IP パケットを、 localIP アドレスへリダイレクトし、その逆も行います。

    publicIP が指定されないと、デフォルトのエイリアスアドレスが使用されます。 remoteIP が指定されると、 remoteIP から/へ向けて到着したパケットのみがルールにマッチします。

-redirect_address localIP publicIP
    公式な IP アドレスへのパケットの流れを、ローカルネットワーク内の マシンにリダイレクトします。この機能は 静的 NAT (static NAT) と 呼ばれています。 静的 NAT はあなたの ISP が IP アドレスの小さなブロックをあなたに 割り当てた時に、単一のアドレスとして用いるのにも利用できます:

    redirect_address 10.0.0.8 0.0.0.0

    上記のコマンドは入ってくすべてのパケットをマシン 10.0.0.8 に リダイレクトします。

    下記のように、いくつかのアドレスエイリアスが同一の公式アドレスを 示すように指定すると、

        redirect_address 192.168.0.2 public_addr
        redirect_address 192.168.0.3 public_addr
        redirect_address 192.168.0.4 public_addr

    入ってくるパケットの流れは最後に変換されたローカルアドレス (192.168.0.4) に向けられますが、最初の二つのアドレスへの出力 パケットの流れは、指定された public_addr からのエイリアスのままになります。

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

-redirect_address
    localIP[, localIP[, ...]] publicIP 書式 -redirect_port および -redirect_address は、単一サーバのネットワーク負荷をオフロードし、 負荷をサーバプールへ分散します。 この機能は LSNAT (RFC 2391) として知られています。 例えば、引数

        tcp www1:http,www2:http,www3:http www:http

    は、ホスト www への入力 HTTP 要求を、 www1, www2, www3 のいずれかへ、透過的にリダイレクトします。 ここで、ホストの選択は、ネットの負荷にかかわらず、 単純にラウンドロビンで行われます。

-dynamic
    -n オプションや -interface オプションが用いられると、 natd は 指定された interface へルーティングする変換ソケットを監視します。 インタフェースの IP アドレスが変化すると、 natd はエイリアスアドレスを動的に変更します。

-in_port | -i port
    すべてのパケットを “入力” として扱い、 divert(4) ポート port から読み込み port へ書き出します。

-out_port | -o port
    すべてのパケットを “出力” として扱い、 divert(4) ポート port から読み込み、 port へ書き出します。

-port | -p port
    divert(4) によって指定されたルールを用いてパケットを識別し、 “入力” パケットを divert(4) ポート port から読み、 “出力” パケットを port へ書き出します。 port が数字でない場合、 データベースが検索されます。 このフラグが指定されない時には、デフォルトとして natd という名前の divert ポートが用いられます。

-alias_address | -a address
    エイリアスアドレスとして address を用います。このオプションが指定されない場合は、 -n オプションか -interface オプションが指定されなければなりません。 指定されたアドレスは、 “公開された” ネットワークインタフェースに割当てられたアドレスである 必要があります。

    出力される 全データのソースアドレスは address に書換えられます。 到着する 全データは、 既にエイリアスされた外向け接続にマッチするかどうかチェックされます。 マッチする場合、パケットはそれぞれ変換されます。 マッチしない場合、 -redirect_port, -redirect_proto, -redirect_address の割り当てをチェックしそれぞれの動作を行います。 他の動作が行えない場合かつ -deny_incoming が指定されていない場合、後述の -target_address オプションに指定された通りに、 このパケットはローカルのマシンに配送されます。

-t | -target_address address
    対象アドレスを設定します。 既存のリンクとは関連付けられていない入力パケットがホストマシンに到着した時、 そのパケットは指定された address へ送られます。

    対象アドレスは 255.255.255.255 に設定可能です。 この場合、すべての新規入力パケットは、 -alias_address または -interface で設定されるエイリアスアドレスへ行きます。

    このオプションを使用しない場合、または引数 0.0.0.0 で呼ばれた場合、 すべての新規入力パケットはパケット中で指定されるアドレスへ行きます。 これにより、パケットの経路が可能な場合には、 外部のマシンが内部のマシンと直接通信可能になります。

-interface | -n interface
    エイリアスアドレスを決めるのに、 interface を用います。 interface に関連づけられた IP アドレスが変化する可能性がある場合には、 -dynamic オプションも指定されるべきです。 このオプションが指定されない場合、 -alias_address オプションを使用する必要があります。

    指定された interface は、通常、 “公開された” (または “外部” の) ネットワークインタフェースです。

-config | -f file
    file から設定を読み込みます。 file はオプションのリストを含み、上記のコマンドラインフラグの長い表記と 同じ物が 1 行ずつ入ります。例えば、

        alias_address 158.152.17.1

    という行はエイリアスアドレスに 158.152.17.1 を指定します。 設定ファイル内では、引数を持たないオプションは yes か no を伴って指定されます。例えば、

        log yes

    は -log と同じ意味になります。

    後続する空白と空行は無視されます。 ‘#’ 記号は、行の残りがコメントである印です。

-reverse
    このオプションを指定すると natd は “入力” パケットと “出力” パケットを逆に扱い、 “外部” インタフェースの代りに “内部” インタフェース上で動作します。

    出力トラフィックがローカルマシンにリダイレクトされ、 natd が入力インタフェースで走行している (通常は出力インタフェースで走行します) といった、透過プロキシを実行している状況で有用な場合があります。

-proxy_only
    natd が透過プロキシのみを実行するよう強制します。 通常のアドレス変換は実行されません。

-proxy_rule
    [type encode_ip_hdr | encode_tcp_stream] port xxxx server a.b.c.d:yyyy 透過プロキシを有効にします。 指定したポートのパケットでこのホストから他のホストへ向かう出力 TCP パケットは、 指定したサーバのポートへリダイレクトされます。 オプションとして、元の宛先アドレスがパケットにエンコードされます。 encode_ip_hdr は、この情報を IP オプションフィールドに置きます。 encode_tcp_stream は、このデータを TCP ストリームの先頭に挿入します。

-punch_fw
    basenumber:count このオプションは、FTP/IRC DCC コネクション用に、 ipfirewall(4) ベースのファイアウォールに穴を開けるよう、 natd に指示します。 これは、 特定のコネクション (このコネクションのみ) の ファイアウォールの通り抜けを許すという、 一時的なファイアウォールルールを、動的にインストールすることで実現されます。 このルールは、対応するコネクションが終了すると、自動的に削除されます。

    basenumber から開始する最大 count 個のルールが使用され、ファイアウォールに穴を開けます。 すべてのルールに対する範囲は、起動時にクリアされます。

-log_ipfw_denied
    ipfw(8) ルールがブロックしたことにより、パケットが再挿入できなかったときに、 ログします。 -verbose 付きの場合は、これがデフォルトです。

NATD の実行
natd を走らせようとする前には以下の手順が必要となります:

1.  自分のカーネルを以下のオプションを付けて構築します:

        options IPFIREWALL
        options IPDIVERT

    自分のカーネルを構築する方法については、ハンドブックに詳しい説明が あるのでそちらを参照してください。

2.  あなたのマシンがゲートウェイとして働くようにします。これは /etc/rc.conf に

        gateway_enable=YES

    と指定するか、

        sysctl net.inet.ip.forwarding=1

    というコマンドを用いることで機能するようになります。

3.  -interface オプションを使いたい場合は、そのインタフェースがすでに設定済みとなるように します。例えば、 interface として ‘tun0’ を指定しようとし、そのインタフェースで ppp(8) を使っている場合には、 natd を起動する前に ppp を起動するようにしなければなりません。

natd の実行は至って簡単です。

    natd -interface ed0

という行でほとんどの場合充分です (正しいインタフェース名に置き換えて ください)。 ブート時に自動的に開始するように設定する方法については rc.conf(5) を参照してください。 natd が起動されたら、パケットの流れの方向が natd の方に変わる (divert される) ようにしなければなりません:

1.  /etc/rc.firewall スクリプトをうまく調整する必要があります。ファイアウォールに 興味が無ければ、以下のようにすれば良いでしょう:

        /sbin/ipfw -f flush
        /sbin/ipfw add divert natd all from any to any via ed0
        /sbin/ipfw add pass all from any to any

    2 番目の行はあなたのインタフェースに依ります ( ‘ed0’ を適切に変更してください)。

    このファイアウォールの設定では、 ローカルネットワーク上の誰もがソースアドレスをあなたのホストに 偽装可能であることを認識してください。 ローカルネットワーク上に他にホストがある場合、 信頼するホストへ/からのトラフィックのみを許可する ファイアウォールルールを作成することを 強く勧めます。

    本物のファイアウォールルールを指定する場合、スクリプトの先頭で上記の 2 行目を 指定すると良いでしょう。 そうすることによって、ファイアウォールにより排除されてしまう前に、 natd がすべてのパケットを見ることができるようになります。

    natd の変換後、転換を生じさせたルール番号の次のルール番号から、 パケットはファイアウォールに再入します (同じ番号に複数のルールがある場合には、次のルールからにはなりません)。

2.  /etc/rc.conf で

        firewall_enable=YES

    と設定し、ファイアウォールを作動させます。これはシステムの起動時のスクリプトに /etc/rc.firewall スクリプトを実行するように伝えます。 今すぐ再起動したくない場合には、コンソールから手で実行してください。 バックグラウンドで実行させるのでない限り、これは決して仮想セッションから 行ってはいけません。もし実行させてしまうと、flush が行われた後に あなたは締め出されてしまい、すべてのアクセスを永久に遮断するために この地点で /etc/rc.firewall の実行は止まってしまいます。スクリプトをバックグラウンドで実行すれば、 この災害を避けることができます。

関連項目
divert(4), protocols(5), rc.conf(5), services(5), syslog.conf(5), ipfw(8), ppp(8)

作者
このプログラムは、多くの人々の細切れの努力の結果です:

Archie Cobbs <archie@whistle.com> (divert ソケット) Charles Mott <cmott@scientech.com> (パケットエイリアス) Eivind Eklund <perhaps@yes.no> (IRC サポートとその他の追加) Ari Suutari <suutari@iki.fi> (natd) Dru Nelson <dnelson@redwoodsoft.com> (初期の PPTP サポート) Brian Somers <brian@awfulhak.org> (まとめ役) Ruslan Ermilov <ru@FreeBSD.org> (natd とパケットエイリアシングと糊)