linux - ejemplos - crear reglas de iptables por proceso/servicio
iptables linux firewall (3)
¿Es posible usar iptables para permitir el tráfico iniciado por un "proceso", es decir, usar el nombre del proceso? Me gustaría, por ejemplo, permitir todo lo que se inicia con el comando ping.
Si hay una manera de obtener el pid de un proceso antes de que comience, entonces nunca he oído hablar de él.
Podría escribir un contenedor que se bifurca primero, luego agrega la regla y ejecuta el proceso (suponiendo que el programa que está ejecutando no se bifurque de nuevo), ya que la llamada exec (3) no modifica el PID.
/* NOTE this contains zero error checking */
int main(int argc, char **argv) {
/* Eat argv[0] the name of the wrapper script */
argv++;
argc--;
pid_t my_pid = getpid();
char *iptables_cmd = NULL;
asprintf(&iptables_cmd, "/sbin/iptables -A INPUT -m owner --pid_owner %d -j ACCEPT", my_pid);
system(iptables_cmd);
execv(argv[0], argv);
}
Parece que el módulo iptables propietario es lo que quieres. Primero, verifique si está disponible en su sistema:
iptables -m owner --help
Puede leer más aquí: http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH
-m owner --pid-owner PID
Consulte http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html y http://linux.die.net/man/8/iptables
Tenga en cuenta que necesita el módulo ipt_owner, ya que --pid-owner no es compatible con xt_owner.
Por ejemplo (esto es solo una aproximación)
#!/bin/bash
$@ &
iptables -m owner --pid-owner %1 -j REJECT
Sin embargo, en realidad, es mejor usar --uid-owner y --id-owner. Primero, el criterio --pid-owner solo coincide con el pid exacto, lo que significa que su programa podría generar fácilmente un proceso secundario que no estaría bloqueado por esta regla. (Al menos no he leído lo contrario). En segundo lugar, iptables (8) advierte que --pid-owner está dañado en los sistemas SMP (que pueden o no aplicarse a usted, pero en cualquier caso limita la portabilidad). Tercero, hay una condición de carrera en el script anterior, porque el proceso se inicia antes de que se bloquee. (Si hay una manera de obtener el pid de un proceso antes de que comience, entonces nunca he oído hablar de él).