|
ipnat − ネットワークアドレス変換 (NAT) のカーネルインタフェース |
|
#include <netinet/ip_compat.h> |
|
NAT リストにルールを追加および削除するために、 2 つの ‘基本的’ な ioctl が提供されています。 ioctl は下記のように呼ばれます: |
|
ioctl(fd, SIOCADNAT, struct ipnat *) |
||
|
ioctl(fd, SIOCRMNAT, struct ipnat *) |
|
ipf(4) とは異なり、カーネルの NAT インタフェースによってサポートされ て いるリストは 1 つだけです。動作中のリストと交換可能な非動作中のリストの 機能は、現在はサポートされていません。 上記の 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 テーブルへのポインタと、 SIOCADNAT ioctl で組 み 立てられた内部の NAT リストの先頭へのポインタが得られます。 こ の テー ブル自身は、NAT_SIZE (デフォルトでは 367) の大きさのハッシュ テーブルです。 統計を取得するには、SIOCGNATS ioctl を用いて、適切な構造体を以下のよ う に参照で渡す必要があります: |
|
ioctl(fd, SIOCGNATS, struct natstat *) |
|
typedef struct natstat { |
|
フィルタルールの追加や削除がもっと柔軟にできれば良いでしょう。 |
|
/dev/ipnat |
|
ipf(4), ipnat(5), ipf(8), ipnat(8), ipfstat(8) |