Domanda

è possibile utilizzare iptables per il traffico permesso iniziata da un "processo", vale a dire utilizzando il nome del processo? Vorrei per esempio per permettere tutto ciò che viene avviato dal comando ping.

È stato utile?

Soluzione

Sembra che il proprietario iptables modulo è che ciò che si desidera. In primo luogo, verificare se è disponibile nel sistema:

iptables -m owner --help

Si può leggere di più qui: http: //www.frozentux. / iptables dimostrativi net / iptables-tutorial.html # OWNERMATCH

Altri suggerimenti

-m owner --pid-owner PID

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

Si noti che è necessario il modulo ipt_owner, come --pid-proprietario non è supportato da xt_owner.

Ad esempio (questo è solo un'approssimazione)

#!/bin/bash
$@ &
iptables -m owner --pid-owner %1 -j REJECT

In realtà, però, è meglio usare --uid-proprietario e --gid-proprietario. In primo luogo, il criterio --pid-proprietario corrisponde solo il pid esatto, il che significa il programma potrebbe facilmente generare un processo figlio che non sarebbe bloccato da questa regola. (Almeno io non ho letto il contrario.) In secondo luogo, iptables (8) avverte che --pid-proprietario è rotto su sistemi SMP (che può o non può applicarsi a voi, ma in entrambi i limiti di portabilità caso). In terzo luogo, v'è una condizione di competizione nello script di cui sopra, perché il processo viene avviato prima di essere bloccato. (Se c'è un modo per ottenere il pid di un processo prima del suo inizio, quindi non ho mai sentito parlare.)

  

Se c'è un modo per ottenere il pid di un processo prima del suo inizio, quindi non ho mai sentito parlare.

Si potrebbe scrivere un wrapper che si biforca, poi aggiunge la regola e dirigenti del processo (assumendo che il programma che si sta eseguendo non fa forchetta di nuovo), dal momento che il PID non viene modificato dalla (3) chiamata exec.

/* 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top