¿Hay alguna maldita documentación y dónde se esconde?
Hay ejemplos en el sitio de netfilter que ayudan a explicar la funcionalidad. Aquí hay una función que escribí en mi propio código que configura netfilter NFLOG.
Estos son los ejemplos que proporcionan: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);
}
}
¿Es realmente necesario lo de CONNMARK? Es decir, ¿funcionaría igual de bien?
Es innecesario.
¿Es necesario tener "ulogd" ejecutándose para que esto funcione?
No, de hecho, no lo uso en esta aplicación.
¿Hay alguna manera de decirle al kernel que elija un número de grupo no asignado para mí y me diga cuál es?
No que yo sepa. En cualquier caso, esto sería inútil si tiene objetivos NFLOG configurados para HTTP, uno para registrar paquetes descartados que eran FTP y otro que buscaba cadenas SMTP. En este escenario, no puede determinar qué regla está vinculada a qué grupo y, por lo tanto, qué el grupo debe ser escuchado.
¿Hay alguna manera de decirle al kernel que estas reglas de filtro deben eliminarse automáticamente cuando finaliza el proceso X? (El proceso X no se ejecutaría como uid 1000).
No, pero el kernel llena un búfer solo hasta un tamaño máximo y luego descartará los datos. No representa un impacto en el rendimiento en términos de usar demasiada memoria al no escuchar las reglas.
Presumiblemente, el comando iptables hace algunas llamadas ioctl especiales o algo para configurar el firewall. ¿Existe una biblioteca C que se pueda usar para hacer lo mismo desde dentro de un programa (es decir, "proceso X" de Q4)?
No hay ninguna biblioteca de netfilter que yo sepa que le ayude a manipular las reglas. Sin embargo, hay una biblioteca impulsada internamente que se usa en su lugar.
IPtables hereda un método bastante arcaico de hablar con el espacio de usuario:abre un socket IP SOCK_RAW para comunicarse con él. Esto se eliminará por completo (ya que no tiene sentido) con nftables que hablarán a través de netlink para hacer lo mismo.