создать правило iptables для процесса / службы - PullRequest
22 голосов
/ 30 ноября 2010

возможно ли использовать iptables для разрешения трафика, инициируемого "процессом", то есть с использованием имени процесса? Я хотел бы, например, разрешить все, что инициируется командой ping.

Ответы [ 3 ]

24 голосов
/ 30 ноября 2010

Похоже, владелец модуль iptables - это то, что вам нужно.Во-первых, проверьте, доступна ли она в вашей системе:

iptables -m owner --help

Подробнее вы можете прочитать здесь: http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

9 голосов
/ 21 января 2015
-m owner --pid-owner PID

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

Обратите внимание, что вам нужен модуль ipt_owner, так как --pid-owner не поддерживается xt_owner.

Например (это только приблизительное значение)

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

В действительности вам лучше использовать --uid-owner и --gid-owner. Во-первых, критерий --pid-owner соответствует только точному pid. Это означает, что ваша программа может легко порождать дочерний процесс, который не будет блокироваться этим правилом. (По крайней мере я не читал иначе.) Во-вторых, iptables (8) предупреждает, что --pid-owner не работает в системах SMP (что может или не может применяться к вам, но в любом случае ограничивает переносимость). В-третьих, в приведенном выше сценарии есть условие гонки, поскольку процесс запускается до того, как он будет заблокирован. (Если есть способ получить pid процесса до его запуска, то я никогда не слышал об этом.)

2 голосов
/ 13 декабря 2016

Если есть способ получить pid процесса до его запуска, то я никогда не слышал об этом.

Вы можете написать обертку, которая сначала разветвляется, а затем добавляетуправляет процессом и исполняет его (при условии, что запущенная вами программа не разветвляется), поскольку PID не изменяется при вызове exec (3).

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