.\" $FreeBSD$ .TH IPNAT 4 .SH 名称 ipnat \- ネットワークアドレス変換 (NAT) のカーネルインタフェース .SH 書式 #include .br #include .br #include .br #include .SH IOCTL .PP NAT リストにルールを追加および削除するために、 2 つの `基本的' な ioctl が提供されています。 ioctl は下記のように呼ばれます: .LP .nf ioctl(fd, SIOCADNAT, struct ipnat *) ioctl(fd, SIOCRMNAT, struct ipnat *) .fi .PP \fBipf(4)\fP とは異なり、カーネルの NAT インタフェースによって サポートされているリストは 1 つだけです。 動作中のリストと交換可能な非動作中のリストの機能は、 現在はサポートされていません。 上記の ioctl は、ルーティング ioctl として振舞うように 実装されているので、各種のルーティング ioctl に用いるものと 同じルールやファイル記述子が使用されます。 たいていの場合 fd は、そのモジュールに関連する デバイス (例えば /dev/ipl) のファイル記述子であることが必要です。 .LP .PP NAT インタフェースで用いられる構造体は以下の通りです: .LP .nf 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 .fi .PP in_redir で認識される値: .LP .nf #define NAT_MAP 0 #define NAT_REDIRECT 1 .fi .PP .LP \fBNAT 統計\fP .PP マップされたパケットの数や送受信されたパケットの数 に関する統計が採取されます。 また、NAT テーブルに新規のエントリが追加されたり、 (期限切れのために) エントリが削除された回数や現在の NAT テーブルの 使用量に関する統計が採取されます。 .PP カーネル内部にある NAT テーブルへのポインタと、 \fBSIOCADNAT\fP ioctl で組み立てられた内部の NAT リストの 先頭へのポインタが得られます。 .PP このテーブル自身は、NAT_SIZE (デフォルトでは 367) の大きさの ハッシュテーブルです。 .PP 統計を取得するには、\fBSIOCGNATS\fP ioctl を用いて、 適切な構造体を以下のように参照で渡す必要があります: .PP .nf 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; .fi .SH バグ フィルタルールの追加や削除がもっと柔軟にできれば良いでしょう。 .SH 関連ファイル /dev/ipnat .SH 関連項目 ipf(4), ipnat(5), ipf(8), ipnat(8), ipfstat(8)