GNU/Linux >> Linux の 問題 >  >> Linux

Linux NFLOG - ドキュメント、C からの構成

<ブロック引用>

いまいましいドキュメントはありますか?それはどこに隠されていますか?

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 で完全に削除されます (意味がないため)。


Linux
  1. Linuxのグループのメンバーを一覧表示する

  2. Linuxでグループからユーザーを削除する方法[クイックヒント]

  3. Linuxファイルパーミッションの概念

  1. Linuxユーザーグループを管理する

  2. Linux にソースから Apache 2 をインストールする

  3. Linux から Linux をインストールする

  1. Linuxでグループにユーザーを追加またはグループから削除する方法

  2. Linuxでユーザーをグループに追加する方法

  3. Linux –論理ボリュームをあるボリュームグループから別のボリュームグループに移動しますか?