2010-11-30 13 views
18

¿es posible usar iptables para permitir el tráfico iniciado por un "proceso", es decir, utilizando el nombre del proceso? Me gustaría, por ejemplo, permitir todo lo que inicia el comando ping.create iptables rule por proceso/servicio

Respuesta

19

Parece que propietario módulo iptables es eso lo que quiere. En primer lugar, comprobar 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

+5

El propietario solo le permite hacer coincidir el usuario o grupo que posee el proceso, no el nombre del proceso en sí. (El indicador de cmd-owner parece haberse eliminado). –

+1

@MikeLundy: agregue un grupo a su sistema (yo uso 'nonet' yo mismo), luego agregue una regla a su cadena de salida de esta manera:' -A OUTPUT -m owner -gid-owner nonet -j REJECT --reject- con icmp-net-unreachable' Ejecuta el programa que sabes de antemano que deseas bloquear, con sg ('sg nonet" your_prog your_args "'). – Bgs

+0

Si no es compatible, entonces ['control groups'] (https://www.kernel.org/doc/Documentation/cgroup-v1/net_cls.txt) son la solución. Es bastante difícil de configurar, pero hay compatibilidad estándar con kernel. Requiere iptables 1.6 que pueda compilarse manualmente. Voy a publicar una respuesta sobre cómo configurar y etiquetar una aplicación en un cgroup y hacer que iptables lo identifique. – KrisWebDev

5
-m owner --pid-owner PID 

Ver http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html y http://linux.die.net/man/8/iptables

en cuenta que necesita el módulo ipt_owner, como - pid-owner no es compatible con xt_owner.

Por ejemplo (esto es sólo una aproximación)

#!/bin/bash 
[email protected] & 
iptables -m owner --pid-owner %1 -j REJECT 

En realidad, sin embargo, que es mejor usar --uid-propietario y --gid-propietario. Primero, el criterio --pid-owner solo coincide con el pid exacto, lo que significa que su programa podría engendrar fácilmente un proceso hijo 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á roto en los sistemas SMP (que pueden aplicarse o no a usted, pero en cualquier caso limita la portabilidad). En tercer lugar, hay una condición de carrera en el script anterior, porque el proceso se inicia antes de que se bloquee. (Si hay una forma de obtener un pid de proceso antes de que comience, entonces nunca lo escuché).

0

Si hay una forma de obtener un pid de proceso antes de que comience, entonces nunca escuché sobre eso.

Se podría escribir un envoltorio que se bifurca en primer lugar, a continuación, añade la regla y los ejecutivos del proceso (asumiendo el programa que se está ejecutando no se bifurca de nuevo), ya que el PID no se cambia por el ejecutivo (3) llamada.

/* 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); 
}