スポンサーリンク

NATD(8) FreeBSD システム管理者マニュアル 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] [−skinny_port port] [−log_ipfw_denied] [−pid_file | −P pidfile]

解説

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_namesyslog.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 が数字でない場合、デー タベースが検索されます。このフラグが指定されない時には、デ フォルトとして 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 と同じ意味になります。

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

−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 個のルールが使用され、ファ イアウォールに穴を開けます。すべてのルールに対する範囲は、起 動時にクリアされます。

−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 です。

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

関連項目

libalias(3), divert(4), protocols(5), rc.conf(5), services(5), syslog.conf(5), ipfw(8), ppp(8)

作者

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

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 とパケットエイリアシングと糊)

FreeBSD 10.0 February 28, 2003 FreeBSD 10.0

スポンサーリンク