Existe-t-il une fichue documentation et où se cache-t-elle ?
Il existe des exemples sur le site netfilter qui aident à expliquer la fonctionnalité. Voici une fonction que j'ai écrite dans mon propre code qui configure le netfilter NFLOG.
Voici les exemples qu'ils fournissent :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 chose CONNMARK est-elle vraiment nécessaire? Autrement dit, cela fonctionnerait-il aussi bien ?
C'est inutile.
Est-il nécessaire d'avoir "ulogd" en cours d'exécution pour que cela fonctionne ?
Non -- en fait je ne l'utilise pas dans cette application.
Existe-t-il un moyen de dire au noyau de choisir un numéro de groupe non alloué pour moi et de me dire de quoi il s'agit ?
Pas que je sache. Dans tous les cas, cela serait inutile si vous avez configuré des cibles NFLOG pour HTTP, une pour consigner les paquets abandonnés qui étaient FTP et une qui scannait les chaînes SMTP. Dans ce scénario, vous ne pouvez pas déterminer quelle règle est liée à quel groupe, et donc qui groupe doit être écouté.
Existe-t-il un moyen de dire au noyau que ces règles de filtrage doivent être automatiquement supprimées lorsque le processus X se termine ? (Le processus X ne fonctionnerait pas avec l'uid 1000.)
Non, mais le noyau ne remplit un tampon que jusqu'à une taille maximale, puis supprime les données. Cela n'a pas d'impact sur les performances en termes d'utilisation de trop de mémoire si les règles ne sont pas écoutées.
Vraisemblablement, la commande iptables effectue des appels ioctl spéciaux ou quelque chose pour configurer le pare-feu. Existe-t-il une bibliothèque C qui peut être utilisée pour faire la même chose depuis un programme (à savoir, "process X" de Q4) ?
Il n'y a pas de bibliothèque netfilter à ma connaissance qui vous aide à manipuler les règles. Il existe cependant une bibliothèque pilotée en interne qui est utilisée à la place.
IPtables hérite d'une méthode plutôt archaïque de parler à l'espace utilisateur - vous ouvrez un socket IP SOCK_RAW pour communiquer avec lui. Cela va être totalement supprimé (car cela n'a aucun sens) avec nftables qui parlera sur netlink pour faire la même chose.