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

名称

ipnat -ネットワークアドレス変換 (NAT) のカーネルインタフェース

書式

#include <netinet/ip_compat.h>
 
#include <netinet/ip_fil.h>
 
#include <netinet/ip_proxy.h>
 
#include <netinet/ip_nat.h>

IOCTL

NAT リストにルール (規則) を追加して削除するためには、2 つの '基本的' な ioctl が使用のために提供されています。 ioctl は、次のように呼び出されます:


ioctl(fd, SIOCADNAT, struct ipnat **)
ioctl(fd, SIOCRMNAT, struct ipnat **)
ioctl(fd, SIOCGNATS, struct natstat **)
ioctl(fd, SIOCGNATL, struct natlookup **)

ipf(4) とは異なり、カーネルの NAT インタフェースによってサポートされている単一のリストだけがあります。交換できる不活動リストは、現在はサポートされていません。

 

これらの ioctl は、ルーティング ioctl として実装され、したがって、様々なルーティング ioctl のための同じルール (規則) とファイル記述子が採用され、主に、fd は、モジュール (すなわち、/dev/ipl) に関連したデバイスのファイル記述子でなければなりません。

NAT インタフェースで使用される構造体は、以下に記述されています:


typedef struct ipnat {
struct ipnat *in_next;
void *in_ifp;
u_short in_flags;
u_short in_pnext;
u_short in_port[2];
struct in_addr in_in[2];
struct in_addr in_out[2];
struct in_addr in_nextip;
int in_space;
int in_redir; /* マップされているなら 0,
困難なリダイレクトなら 1 */
char in_ifname[IFNAMSIZ];
} ipnat_t;


#define in_pmin in_port[0] /* 静的なリダイレクトポートも
保持 */
#define in_pmax in_port[1]
#define in_nip in_nextip.s_addr
#define in_inip in_in[0].s_addr
#define in_inmsk in_in[1].s_addr
#define in_outip in_out[0].s_addr
#define in_outmsk in_out[1].s_addr


in_redir の認識される値は、次の通りです:


#define NAT_MAP 0
#define NAT_REDIRECT 1

NAT 統計 マップされたパケットの数、入って来る数、出て行く数の統計は、新しいエントリが追加された回数、NAT テーブルに (期限切れのために) 削除された回数と NAT テーブルの現在の使用レベルを保持されます。

内部の NAT リストの先頭と同様に、カーネル内部の NAT テーブルへのポインタは、 SIOCADNAT ioctl で構築されますテーブル自体は、サイズ NAT_SIZE (デフォルトのサイズは、367 です) のハッシュテーブルです。

統計を検索して取り出すために、 SIOCGNATS ioctl は、参照によって渡された次のような適切な構造体で使用されなければなりません:

 


ioctl(fd, SIOCGNATS, struct natstat *)


typedef struct natstat {
u_long ns_mapped[2];
u_long ns_added;
u_long ns_expire;
u_long ns_inuse;
nat_t ***ns_table;
ipnat_t *ns_list;
} natstat_t;

バグ

フィルタルール (規則) を追加したり削除するとき、もっと柔軟性があるならよいのですが。

関連ファイル

/dev/ipnat

関連項目

ipf(4), ipnat(5), ipf(8), ipnat(8), ipfstat(8)