いまいましいドキュメントはありますか?それはどこに隠されていますか?
netfilter サイトには、機能の説明に役立つ例があります。以下は、netfilter NFLOG をセットアップする独自のコードで作成した関数です。
彼らが提供する例は次のとおりです:http://www.netfilter.org/projects/libnetfilter_log/doxygen/files.html
void setup_netlogger_loop(
int groupnum,
queue_t queue)
{
int sz;
int fd = -1;
char buf[BUFSZ];
/* Setup handle */
struct nflog_handle *handle = NULL;
struct nflog_g_handle *group = NULL;
memset(buf, 0, sizeof(buf));
/* This opens the relevent netlink socket of the relevent type */
if ((handle = nflog_open()) == NULL){
sd_journal_perror("Could not get netlink handle");
exit(EX_OSERR);
}
/* We tell the kernel that we want ipv4 tables not ipv6 */
if (nflog_bind_pf(handle, AF_INET) < 0) {
sd_journal_perror("Could not bind netlink handle");
exit(EX_OSERR);
}
/* Setup groups, this binds to the group specified */
if ((group = nflog_bind_group(handle, groupnum)) == NULL) {
sd_journal_perror("Could not bind to group");
exit(EX_OSERR);
}
if (nflog_set_mode(group, NFULNL_COPY_PACKET, 0xffff) < 0) {
sd_journal_perror("Could not set group mode");
exit(EX_OSERR);
}
if (nflog_set_nlbufsiz(group, BUFSZ) < 0) {
sd_journal_perror("Could not set group buffer size");
exit(EX_OSERR);
}
if (nflog_set_timeout(group, 1500) < 0) {
sd_journal_perror("Could not set the group timeout");
}
/* Register the callback */
nflog_callback_register(group, &queue_push, (void *)queue);
/* Get the actual FD for the netlogger entry */
fd = nflog_fd(handle);
/* We continually read from the loop and push the contents into
nflog_handle_packet (which seperates one entry from the other),
which will eventually invoke our callback (queue_push) */
for (;;) {
sz = recv(fd, buf, BUFSZ, 0);
if (sz < 0 && errno == EINTR)
continue;
else if (sz < 0)
break;
nflog_handle_packet(handle, buf, sz);
}
}
<ブロック引用> CONNMARKのことは実際に必要ですか?つまり、これでも同様に機能しますか?
不要です。
<ブロック引用>これを機能させるには、「ulogd」を実行する必要がありますか?
いいえ -- 実際、このアプリケーションでは使用しません。
<ブロック引用>割り当てられていないグループ番号を選択して、それが何であるかをカーネルに伝える方法はありますか?
私が知っているわけではありません。いずれにせよ、HTTP 用に NFLOG ターゲットが設定されている場合、1 つは FTP でドロップされたパケットをログに記録し、もう 1 つは SMTP 文字列をスキャンしていた場合、これは役に立ちません。グループは耳を傾けるべきです。
<ブロック引用>プロセス X が終了したときに、これらのフィルタ ルールを自動的に削除する必要があることをカーネルに伝える方法はありますか? (プロセス X は uid 1000 として実行されません。)
いいえ。ただし、カーネルはバッファを最大サイズまでしか埋めず、データを破棄します。リッスンされていないルールで大量のメモリを消費するという点で、パフォーマンスに影響を与えることはありません。
<ブロック引用>おそらく、iptables コマンドは、いくつかの特別な ioctl 呼び出しまたはファイアウォールを構成するための何かを行います。プログラム内から同じことを行うために使用できる C ライブラリはありますか (つまり、Q4 の「プロセス X」)?
ルールを操作するのに役立つ netfilter ライブラリは私が知っているものではありません。ただし、代わりに使用される内部駆動ライブラリがあります。
IPtables は、ユーザー空間と通信するかなり古風な方法を継承しています。SOCK_RAW IP ソケットを開いて通信します。これは、ネットリンクを介して通信して同じことを行う nftables で完全に削除されます (意味がないため)。