每个进程/服务创buildiptables规则

是否有可能使用iptables来允许由“进程”启动stream量,即使用进程名称? 我想例如允许所有由ping命令启动的东西。

Solutions Collecting From Web of "每个进程/服务创buildiptables规则"

它看起来像所有者的 iptables模块是你想要的。 首先,检查您的系统是否可用:

iptables -m owner --help 

你可以在这里阅读更多: http : //www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

 -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)警告说,在SMP系统上–pid-owner已经被打破(这可能适用于你,也可能不适用于你,但是在任何情况下都会限制可移植性)。 第三,上面的脚本中存在一个竞争条件,因为这个过程是在它被阻塞之前启动的。 (如果在开始之前有办法获得一个进程的pid,那么我从来没有听说过。)

如果在开始之前有办法获得一个进程的pid,那么我从来没有听说过。

你可以编写一个首先分叉的包装,然后添加规则并执行进程(假设你正在运行的程序不再分叉),因为exec(3)调用没有改变PID。

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