EN JA
NATD(8)
NATD(8) FreeBSD System Manager's Manual 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][ -instance  instancename][ -globalport  port][ -log_denied][ -log_facility  facility_name][ -punch_fw  firewall_range][ -skinny_port  port][ -log_ipfw_denied][ -pid_file |  -P  pidfile][ -exit_delay |  -P  ms]

解説

natd ユーティリティは、 FreeBSD における divert(4) ソケットと共に用いることによって、ネットワークアドレスの変換を行います。

(PPP リンク上で NAT が必要な場合、ほとんどの natd 機能を提供し、同じ libalias(3) ライブラリを使用する、 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 は、同じく接続を受け付けるアドレスです。必要に応じて remoteIPremotePORT を指定し、接続元を限定することができます。 remotePORT の指定を省略した場合、全ポート番号が指定されたものとされます。

引数 targetIP, aliasIP, remoteIP は、IP アドレスまたはホスト名で与えられます。 targetPORT, aliasPORT, remotePORT の範囲は、番号は異なっていても構いませんが、大きさは、同じである必要があります。 targetPORT, aliasPORT, remotePORT が単一の値 (範囲ではない) を指定する場合、 services(5) データベース中で検索されるサービス名で指定可能です。

例えば、

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 が数字でない場合、 services(5) データベースが検索されます。このフラグが指定されない時には、デフォルトとして natd という名前の divert ポートが用いられます。
-alias_address | -a address
エイリアスアドレスとして address を用います。 -proxy_only オプションが指定されない場合、このオプションか -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 を指定します。設定ファイル内では、引数を持たないオプションは、 yesno を伴って指定されます。例えば、

log yes

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

オプションをいくつかのセクションに分割することができます。各セクションは、 natd インスタンスを所有するために適用します。この能力によって、いくつかの NAT インスタンスのために 1 つの natd プロセスを設定できます。常に存在する最初のインスタンスは、"デフォルト"のインスタンスです。それぞれ、別のインスタンスは、次で始まるべきです。

instance instance_name

次には、設定オプションが置かれるべきです。例:

# デフォルトインスタンス
port 8668
alias_address 158.152.17.1

# 2 番目のインスタンス
instance dsl1
port 8888
alias_address 192.168.0.1

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

-instance instancename
このオプションは、次の -instance オプションか、またはコマンドラインの終りまで (必要なら、それを作成して) インスタンス instancename を設定するためにコマンドラインのオプション処理を切り換えます。コマンドラインでというよりむしろ -config オプションで指定された設定ファイルの複数のインスタンスをセットアップするのは、より簡単です。
-globalport port
“発信”としてすべてのパケットを取り扱って、 divert(4) ポート port から読み込み、それに書き込みます。このオプションは、複数のインスタンスで使用されることを目的としています: このポートで受信されたパケットは、すべての設定されたインスタンスの内部変換テーブルに対してチェックされます。エントリが見つけられるなら、そのエントリに従って、パケットは、エイリアス (別名) されます。エントリがインスタンスのいずれでも見つけられないなら、パケットは、変更せずに渡され、新しいエントリは、作成されません。より詳しい情報についてはセクション 複数のインスタンス を参照してください。
-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 個のルールが使用され、ファイアウォールに穴を開けます。すべてのルールに対する範囲は、起動時にクリアされます。カーネルがセキュリティレベル 3 であるとき、このオプションは、効果がありません、詳細については、 init(8) を参照してください。

-skinny_port port
このオプションで、Skinny Station プロトコルに使用する TCP ポートを指定可能です。 Cisco Call Managers と通信してボイスオーバ IP コールを設定するために、 Cisco IP 電話が Skinny を使用します。デフォルトでは、Skinny エイリアスは、実行されません。 Skinny 用の典型的なポート番号は、2000 です。
-log_ipfw_denied
ipfw(8) ルールがブロックしたことにより、パケットが再挿入できなかったときに、ログします。 -verbose 付きの場合は、これがデフォルトです。
-pid_file | -P file
プロセス ID を格納するための別のファイルを指定します。デフォルトは、 /var/run/natd.pid です。
-exit_delay ms
シグナルの後のデーモンの終了の前に ms のディレイ (遅れ) を指定します。デフォルトは、 10000 です。

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 の実行は、止まってしまいます。スクリプトをバックグラウンドで実行すれば、この災害を避けることができます。

複数のインスタンス

いくつかの外部の IP アドレスにエイリアシングを必要とすることは、それほど珍しくはありません。伝統的に、これが独立した設定でいくつかの natd プロセスを実行することによって達成されていた間、 natd は、単一のプロセスでの複数のエイリアシングのインスタンスを持つことができ、また、それらが互いにそれほど独立していないことを許可します。例えば、2 つの外部インタフェース (IP 1.2.3.4 がある) ‘ sis0’と (IP 2.3.4.5 がある) ‘ sis2’があるマシンで、異なったプロバイダへの 2 つのチャネルのロードバランシングの共通タスクを見ましょう:

          net 1.2.3.0/24 
1.2.3.1 ------------------ sis0 
(router)                (1.2.3.4) 
                                         net 10.0.0.0/24 
                                  sis1 ------------------- 10.0.0.2 
                               (10.0.0.1) 
          net 2.3.4.0/24 
2.3.4.1 ------------------ sis2 
(router)                (2.3.4.5)

デフォルトルートは、‘ sis0’を通して out です。

内側のマシン (10.0.0.2) は、両方の外側の IP を通して TCP ポート 122 でアクセス可能です、発信接続は、‘ sis0’と‘ sis2’の間でランダムにパスを選択します。

これが動作する方法は、 natd.conf がエイリアシングエンジンの 2 つのインスタンスを構築するということです。

これらのインスタンスのプライベート divert(4) ソケットに加えて、“globalport”と呼ばれる 3 番目のソケットが、作成されます。これを通して natd に送信されたパケットは、すべてのインスタンスに対してマッチされ、既存のエントリが見つかるなら、変換され、エントリが見つけられないなら、変更されません。次の行は、 /etc/natd.conf に置かれます:

log 
deny_incoming 
verbose 
 
instance default 
interface sis0 
port 1000 
redirect_port tcp 10.0.0.2:122 122 
 
instance sis2 
interface sis2 
port 2000 
redirect_port tcp 10.0.0.2:122 122 
 
globalport 3000

そして、次の ipfw(8) 規則が使用されます:

ipfw -f flush 
 
ipfw add      allow ip from any to any via sis1 
 
ipfw add      skipto 1000 ip from any to any in via sis0 
ipfw add      skipto 2000 ip from any to any out via sis0 
ipfw add      skipto 3000 ip from any to any in via sis2 
ipfw add      skipto 4000 ip from any to any out via sis2 
 
ipfw add 1000 count ip from any to any 
 
ipfw add      divert 1000 ip from any to any 
ipfw add      allow ip from any to any 
 
ipfw add 2000 count ip from any to any 
 
ipfw add      divert 3000 ip from any to any 
 
ipfw add      allow ip from 1.2.3.4 to any 
ipfw add      skipto 5000 ip from 2.3.4.5 to any 
 
ipfw add      prob .5 skipto 4000 ip from any to any 
 
ipfw add      divert 1000 ip from any to any 
ipfw add      allow ip from any to any 
 
ipfw add 3000 count ip from any to any 
 
ipfw add      divert 2000 ip from any to any 
ipfw add      allow ip from any to any 
 
ipfw add 4000 count ip from any to any 
 
ipfw add      divert 2000 ip from any to any 
 
ipfw add 5000 fwd 2.3.4.1 ip from 2.3.4.5 to not 2.3.4.0/24 
ipfw add      allow ip from any to any

ここで、内部のネットワークからインターネットまでのパケットは、‘ sis0’ (規則番号 2000) を通って外に向けられ、 globalport ソケット (3000) によって捕まえられます。その後、2 つのインスタンスの 1 つの変換テーブルで一致したものが見つかるか、またはパケットが、等しい確立で、2 つの他の divert(4) ポート (1000 または 2000) の 1 つに渡されます。これは、ロードバランシングが、 1 つのフローベース毎に行われることを確実にします (すなわち、単一の TCP からのパケットは、同じインタフェースを通したフローに常に接続します)。デフォルトでないインタフェース (‘ sis2’) の発信元 IP で変換されたパケットは、そのインタフェースの適切なルータに転送されます。

作者

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

Archie Cobbs <archie@FreeBSD.org> (divert ソケット) Charles Mott <cm@linktel.net> (パケットエイリアス) 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 とパケットエイリアシングと糊) Poul-Henning Kamp <phk@FreeBSD.org> (複数のインスタンス)

June 23, 2008 FreeBSD