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éž.