GNU/Linux >> Znalost Linux >  >> Linux

Linux NFLOG - dokumentace, konfigurace z C

Existuje nějaká zatracená dokumentace a kde se skrývá?

Na webu netfilter jsou příklady, které pomáhají vysvětlit funkci. Zde je funkce, kterou jsem napsal ve svém vlastním kódu a která nastavuje netfilter NFLOG.

Zde jsou příklady, které poskytují: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);
  }
}

Je věc CONNMARK skutečně nezbytná? To znamená, že by to fungovalo stejně dobře?

Je to zbytečné.

Je nutné mít spuštěn "ulogd", aby to fungovalo?

Ne – ve skutečnosti jej v této aplikaci nepoužívám.

Existuje způsob, jak říct jádru, aby pro mě vybralo nepřidělené číslo skupiny a řeklo mi, co to je?

Ne, že bych si toho byl vědom. V každém případě by to bylo k ničemu, pokud máte nastavené cíle NFLOG pro HTTP, jeden pro protokolování zahozených paketů, které byly FTP, a jeden, který skenoval řetězce SMTP. V tomto scénáři nemůžete určit, které pravidlo je vázáno na kterou skupinu, a tedy které skupina by měla být naslouchána.

Existuje způsob, jak říci jádru, že tato pravidla filtru by měla být automaticky odstraněna, když proces X skončí? (Proces X by neběžel jako uid 1000.)

Ne, ale jádro zaplní vyrovnávací paměť pouze do maximální velikosti, pak data zahodí. Nepředstavuje dopad na výkon, pokud jde o využití příliš velkého množství paměti, protože pravidla nejsou naslouchána.

Pravděpodobně příkaz iptables provádí nějaká speciální volání ioctl nebo něco pro konfiguraci brány firewall. Existuje knihovna C, kterou lze použít k tomu samému z programu (jmenovitě „proces X“ z Q4)?

Není mi známa žádná knihovna netfilter, která by vám pomohla manipulovat s pravidly. Místo toho se však používá vnitřně řízená knihovna.

IPtables zdědí poněkud archaickou metodu mluvení s uživatelským prostorem – otevřete SOCK_RAW IP socket, abyste s ním mohli komunikovat. To bude zcela odstraněno (protože to nedává smysl) s nftables, které budou mluvit přes netlink, aby udělaly totéž.


Linux
  1. Seznam členů skupiny v Linuxu

  2. Koncepty oprávnění souborů Linux

  3. Spravujte skupiny uživatelů Linuxu

  1. Jak přidat nebo odebrat uživatele ze skupiny v Linuxu

  2. Nainstalujte Apache 2 ze zdroje na Linux

  3. Nainstalujte Linux z Linuxu

  1. Jak přidat uživatele do skupiny v Linuxu

  2. Linux – přesunout logický svazek z jedné skupiny svazků do druhé?

  3. Linux – Jak spustit bootloader z Linuxu?