2010-11-30 8 views
18

Ist es möglich, iptables zu verwenden, um den von einem "Prozess" initiierten Verkehr zuzulassen, dh den Prozessnamen zu verwenden? Ich möchte zum Beispiel alles erlauben, was durch den Ping-Befehl initiiert wird.iptables-Regel pro Prozess/Dienst erstellen

Antwort

19

Es sieht aus wie die Besitzer iptables-Modul ist das, was Sie wollen. Prüfen Sie zunächst, ob es in Ihrem System verfügbar ist:

iptables -m owner --help 

Mehr erfahren Sie hier lesen: http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

+5

Nur Besitzer erlaubt Ihnen die Übereinstimmung mit dem Benutzer oder der Gruppe, die den Prozess besitzt, nicht den Prozessnamen selbst. (Das Cmd-Besitzer-Flag scheint entfernt worden zu sein). –

+1

@MikeLundy: Fügen Sie Ihrem System eine Gruppe hinzu (ich benutze 'nonet' selbst), dann fügen Sie Ihrer Ausgabekette eine Regel wie folgt hinzu:' -A OUTPUT -m Besitzer --gid-Besitzer nonet -j REJECT --reject- with icmp-net-unreachable Führen Sie das Programm, für das Sie im Voraus wissen, dass Sie blockieren möchten, mit sg ('sg nonet" your_prog your_args "'). – Bgs

+0

Wenn es nicht unterstützt wird, dann sind ['Kontrollgruppen'] (https://www.kernel.org/doc/Documentation/cgroup-v1/net_cls.txt) die Lösung. Es ist ziemlich schwer zu installieren, aber es gibt Standard-Kernel-Unterstützung. Es erfordert iptables 1.6, die manuell erstellt werden können. Ich werde eine Antwort mit dem Einrichten und Kennzeichnen einer Anwendung in einer Kontrollgruppe veröffentlichen und iptables identifizieren lassen. – KrisWebDev

5
-m owner --pid-owner PID 

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

Beachten Sie, dass das ipt_owner Modul benötigen, as - pid-owner wird von xt_owner nicht unterstützt.

Zum Beispiel (dies ist nur eine Näherung)

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

In Wirklichkeit aber sind Sie besser dran --uid-Besitzer und --gid-Eigentümer in Gebrauch. Erstens entspricht das Kriterium --pid-owner nur der exakten PID, was bedeutet, dass Ihr Programm leicht einen Child-Prozess erzeugen könnte, der durch diese Regel nicht blockiert würde. (Zumindest habe ich nichts anderes gelesen.) Zweitens warnt iptables (8), dass --pid-owner auf SMP-Systemen kaputt ist (was für Sie gelten kann oder auch nicht, aber in beiden Fällen die Portabilität einschränkt). Drittens gibt es im obigen Skript eine Racebedingung, weil der Prozess gestartet wird, bevor er blockiert wird. (Wenn es einen Weg gibt, die PID eines Prozesses zu bekommen, bevor es beginnt, dann habe ich noch nie davon gehört.)

0

Wenn es eine Möglichkeit gibt, die PID eines Prozesses zu bekommen, bevor es beginnt, dann habe ich noch nie habe davon gehört.

Sie einen Wrapper schreiben könnte, die Gabeln zuerst, dann fügt die Regel und execs den Prozess (vorausgesetzt, das Programm Sie laufen nicht wieder Gabel), da die PID nicht durch die exec geändert (3) Anruf.

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