2010-11-30 3 views

ответ

19

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

iptables -m owner --help 

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

+5

Владелец разрешает вам сопоставлять пользователя или группу, которым принадлежит этот процесс, а не имя самого процесса. (Возможно, флаг владельца cmd был удален). – 2012-06-01 22:10:03

5
-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 
[email protected] & 
iptables -m owner --pid-owner %1 -j REJECT 

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

0

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

Вы можете написать оболочку, которая разветвляется, а затем добавляет правило и Execs процесс (предполагается, что программа вы работаете не раскошелиться еще раз), так как PID не изменяется ехес (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); 
} 
Смежные вопросы