EN JA
NG_NAT(4)
NG_NAT(4) FreeBSD Kernel Interfaces Manual NG_NAT(4)

名称

ng_natNAT netgraph ノードタイプ

書式

#include < netgraph/ng_nat.h>

解説

ng_nat ノードは、それを通り抜けるパケットのネットワークアドレス変換 (NAT) を実行します。 nat ノードは、パケットエイリアシング (packet aliasing) のために libalias(3) エンジンを使用します。

フック

このノードタイプは、2 つのフックがあります:
out
このフックで受信されたパケットは、発信であると見なされ、設定されたアドレスをマスカレード (なり済まし) されます。
in
このフックに来るパケットは、着信であると見なされ、非エイリアス (dealiase) されます。

コントロールメッセージ

このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:
NGM_NAT_SET_IPADDR ( setaliasaddr)
ノードのためのエイリアシングアドレスを設定します。両方のフックが接続されて、エイリアシングアドレスが設定された後に、ノードは、エイリアシング操作の準備ができています。
NGM_NAT_SET_MODE ( setmode)
供給された struct ng_nat_mode を使用して、ノードの操作モードを設定します。

struct ng_nat_mode { 
 uint32_t flags; 
 uint32_t mask; 
}; 
/* サポートされているフラグ: */ 
#define NG_NAT_LOG   0x01 
#define NG_NAT_DENY_INCOMING  0x02 
#define NG_NAT_SAME_PORTS  0x04 
#define NG_NAT_UNREGISTERED_ONLY 0x10 
#define NG_NAT_RESET_ON_ADDR_CHANGE 0x20 
#define NG_NAT_PROXY_ONLY  0x40 
#define NG_NAT_REVERSE   0x80
NGM_NAT_SET_TARGET ( settarget)
ノードのためのターゲットアドレスを設定します。以前に存在するエイリアシングリンクに関連がない着信ケットがホストマシンに到着するとき、それを指定されたアドレスに送信します。
NGM_NAT_REDIRECT_PORT ( redirectport)
与えられた (複数の) ポートに到着する着信接続を別のホストと (複数の) ポートへリダリレクト (向け直し) します。次の struct ng_nat_redirect_port は、引数として供給されなければなりません。

#define NG_NAT_DESC_LENGTH 64 
struct ng_nat_redirect_port { 
 struct in_addr local_addr; 
 struct in_addr alias_addr; 
 struct in_addr remote_addr; 
 uint16_t local_port; 
 uint16_t alias_port; 
 uint16_t remote_port; 
 uint8_t  proto; 
 char  description[NG_NAT_DESC_LENGTH]; 
};

このメッセージへの応答として返されるユニークな ID をリダイレクションに割り付け、リダイレクションに関する情報は、後で、 NGM_NAT_LIST_REDIRECTS メッセージによって検索できるように静的なリダイレクトのリストに追加されます。

NGM_NAT_REDIRECT_ADDR ( redirectaddr)
パブリックな IP アドレスのためのトラフィックをローカルネットワークのマシンにリダリレクトします。この関数は、 静的な NAT として知られています。次の struct ng_nat_redirect_addr は、引数として供給されなければなりません。

struct ng_nat_redirect_addr { 
 struct in_addr local_addr; 
 struct in_addr alias_addr; 
 char  description[NG_NAT_DESC_LENGTH]; 
};

このリダイレクションのためのユニークな ID は、このメッセージへの応答として返されます。

NGM_NAT_REDIRECT_PROTO ( redirectproto)
プロトコル proto ( protocols(5) 参照) の着信 IP パケットをローカルネットワークのマシンにリダリレクトします。次の struct ng_nat_redirect_proto は、引数として供給されなければなりません。

struct ng_nat_redirect_proto { 
 struct in_addr local_addr; 
 struct in_addr alias_addr; 
 struct in_addr remote_addr; 
 uint8_t  proto; 
 char  description[NG_NAT_DESC_LENGTH]; 
};

このリダイレクションのためのユニークな ID は、このメッセージへの応答として返されます。

NGM_NAT_REDIRECT_DYNAMIC ( redirectdynamic)
指定された ID があるリダイレクションを動的であるとマークします、すなわち、次の接続を正確なものとして供給し、内部のリンクテーブルから自動的に削除されます。完全に指定されたリンクのみ動的にすることができます。また、この ID があるリダイレクションは、 ( NGM_NAT_LIST_REDIRECTS メッセージを通して利用可能な) ユーザに目に見える静的なリダイレクトのリストから直ちに削除されます。
NGM_NAT_REDIRECT_DELETE ( redirectdelete)
指定された ID でリダイレクションを削除します (現在のアクティブな接続は、影響を受けません)。
NGM_NAT_ADD_SERVER ( addserver)
別のサーバをプールに追加します。これは、単一のサーバで透過的にネットワークの負荷を下げ、 LSNAT (RFC 2391) として知られている、サーバのプールの向こう側に負荷を分配するために使用されます。次の struct ng_nat_add_server は、引数として供給されなければなりません。

struct ng_nat_add_server { 
 uint32_t id; 
 struct in_addr addr; 
 uint16_t port; 
};

最初に、リダイレクションは、 NGM_NAT_REDIRECT_PORT または NGM_NAT_REDIRECT_ADDR によってセットアップされます。次に、そのリダイレクションの ID は、必要な数のサーバを追加するために複数の NGM_NAT_ADD_SERVER メッセージで使用されます。 NGM_NAT_REDIRECT_ADDR によって作成されたリダイレクションに関して、 port は、無視され、任意の値があるかもしれません。また、オリジナルのリダイレクションのパラメータ local_addrlocal_port は、 NGM_NAT_ADD_SERVER が使用された後に無視されます (それらは、サーバプールによって効率的に置き換えられます)。

NGM_NAT_LIST_REDIRECTS ( listredirects)
struct ng_nat_list_redirects として設定された静的なリダイレクトのリストが返されます。

struct ng_nat_listrdrs_entry { 
 uint32_t id;  /* 0 以外の何でも */ 
 struct in_addr local_addr; 
 struct in_addr alias_addr; 
 struct in_addr remote_addr; 
 uint16_t local_port; 
 uint16_t alias_port; 
 uint16_t remote_port; 
 uint16_t proto;  /* 有効な proto または 
        NG_NAT_REDIRPROTO_ADDR */ 
 uint16_t lsnat;  /* LSNAT サーバカウント */ 
 char  description[NG_NAT_DESC_LENGTH]; 
}; 
struct ng_nat_list_redirects { 
 uint32_t  total_count; 
 struct ng_nat_listrdrs_entry redirects[]; 
}; 
#define NG_NAT_REDIRPROTO_ADDR (IPPROTO_MAX + 3)

すべてのリダイレクトタイプのための統一された形式で返される redirects 配列のエントリ。ポートは、プロトコルが TCP または UDP のいずれかである場合にだけ重要で、 ( NGM_NAT_REDIRECT_ADDR によって作成された) static NAT リダイレクションは、 NG_NAT_REDIRPROTO_ADDR に設定された proto によって示されます。 lsnat サーバのカウンタが、 0 以上であるなら、 local_addrlocal_port も無意味です。

NGM_NAT_PROXY_RULE ( proxyrule)
透過的なプロキシ (proxying) 規則を指定します (文字列は、引数として供給されなければなりません)。詳細については、 libalias(3) を参照してください。
NGM_NAT_LIBALIAS_INFO ( libaliasinfo)
struct ng_nat_libalias_info として libalias(3) インスタンスの内部統計を返します。

struct ng_nat_libalias_info { 
 uint32_t icmpLinkCount; 
 uint32_t udpLinkCount; 
 uint32_t tcpLinkCount; 
 uint32_t sctpLinkCount; 
 uint32_t pptpLinkCount; 
 uint32_t protoLinkCount; 
 uint32_t fragmentIdLinkCount; 
 uint32_t fragmentPtrLinkCount; 
 uint32_t sockCount; 
};

libalias インスタンスからの特定のカウンタの検索に失敗した ng_nat の場合に、対応するフィールドは、 UINT32_MAX として返されます。

すべてのリダイレクションメッセージ local_addrlocal_port は、それぞれ、内部のネットワークのターゲットマシンのアドレスとポートを意味します。 alias_addr が 0 であるなら、 ( NGM_NAT_SET_IPADDR で設定される) デフォルトのエイリアシングアドレスが、使用されます。 0 でない remote_addr および/または remote_port を使用することによって特定の外部マシンからのみ受け付けられるように接続を制限することもできます。各リダイレクションは、後でリダイレクション操作 (例えば、取り外し) に個別に使用できる ID を割り当てます。この ID は、ノードがシャットダウンするまでユニークであることを保証して (それは、削除の後で再利用されない)、それぞれの新しいリダイレクションを作った後に、ユーザに返されるか、またはすべてのリダイレクションの格納されたリストで見つけることができます。 description は、自動化された方法でリダイレクションを同時に操作するためにいくつかの実体のための方法を提供する ID と共に、変更されていないノードへおよびノードから渡されます。

シャットダウン

このノードは、 NGM_SHUTDOWN コントロールメッセージを受け取るか、すべてのフックが切断されている時、シャットダウンします。

使用例

次の例では、パケットは、 ng_ipfw(4) ノードを使用して nat ノードに投入されます。

# NAT ノードを作成 
ngctl mkpeer ipfw: nat 60 out 
ngctl name ipfw:60 nat 
ngctl connect ipfw: nat: 61 in 
ngctl msg nat: setaliasaddr x.y.35.8 
 
# トラフィックを NAT ノードに迂回する 
ipfw add 300 netgraph 61 all from any to any in via fxp0 
ipfw add 400 netgraph 60 all from any to any out via fxp0 
 
# (非) エイリアスされた後にパケットを続行させます 
sysctl net.inet.ip.fw.one_pass=0

ng_nat ノードは、グラフによる ng_iface(4) ノードの直後に挿入することができます。次の例では、HDLC カプセル化を行ってシリアルラインでマスカレードを実行します。

/usr/sbin/ngctl -f- <<-SEQ 
 mkpeer cp0: cisco rawdata downstream 
 name cp0:rawdata hdlc 
 mkpeer hdlc: nat inet in 
 name hdlc:inet nat 
 mkpeer nat: iface out inet 
 msg nat: setaliasaddr x.y.8.35 
SEQ 
ifconfig ng0 x.y.8.35 x.y.8.1

歴史

ng_nat ノードタイプは、 FreeBSD 6.0 で実装されました。

作者

Gleb Smirnoff <glebius@FreeBSD.org>
March 21, 2013 FreeBSD