C'è qualche dannata documentazione e dove si nasconde?
Ci sono esempi sul sito netfilter che aiutano a spiegare la funzionalità. Ecco una funzione che ho scritto nel mio codice che imposta netfilter NFLOG.
Ecco gli esempi forniti: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);
}
}
La cosa CONNMARK è davvero necessaria? Cioè, funzionerebbe altrettanto bene?
Non è necessario.
È necessario che "ulogd" sia in esecuzione perché funzioni?
No -- infatti non lo uso in questa applicazione.
C'è un modo per dire al kernel di scegliere un numero di gruppo non allocato per me e dirmi di cosa si tratta?
Non che io sappia. In ogni caso questo sarebbe inutile se si dispone di obiettivi NFLOG impostati per HTTP, uno per registrare i pacchetti scartati che erano FTP e uno che stava scansionando le stringhe SMTP. In questo scenario non è possibile determinare quale regola è associata a quale gruppo e quindi quale dovrebbe essere ascoltato.
C'è un modo per dire al kernel che queste regole di filtro dovrebbero essere cancellate automaticamente quando il processo X termina? (Il processo X non verrebbe eseguito come uid 1000.)
No, ma il kernel riempie un buffer solo fino a una dimensione massima, quindi eliminerà i dati. Non comporta un impatto sulle prestazioni in termini di utilizzo di troppa memoria con regole non ascoltate.
Presumibilmente il comando iptables effettua alcune chiamate ioctl speciali o qualcosa per configurare il firewall. Esiste una libreria C che può essere utilizzata per fare lo stesso dall'interno di un programma (vale a dire, "processo X" da Q4)?
Non esiste alcuna libreria netfilter di cui sono a conoscenza che ti aiuti a manipolare le regole. Esiste invece una libreria gestita internamente che viene utilizzata.
IPtables eredita un metodo piuttosto arcaico per parlare allo spazio utente:apri un socket IP SOCK_RAW per comunicare con esso. Questo verrà completamente rimosso (poiché non ha senso) con nftables che parlerà su netlink per fare la stessa cosa.