是否可以使用iptables来允许“进程”发起的流量,即使用进程名称?我想举例说明允许ping命令启动的所有内容。
答案 0 :(得分:24)
看起来 所有者 iptables模块就是您想要的。首先,检查您的系统中是否可用:
iptables -m owner --help
您可以在此处阅读更多内容:http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH
答案 1 :(得分:8)
-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模块,因为xt_owner不支持--pid-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 :(得分:2)
如果有一种方法可以在进程启动之前获取进程的pid,那么我从未听说过它。
你可以写一个首先分叉的包装器,然后添加规则并执行进程(假设你正在运行的程序不再分叉),因为exec(3)调用不会改变PID。 / p>
/* 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);
}
答案 3 :(得分:0)
关于iptables https://fr.wikipedia.org/wiki/Iptables的法语维基百科页面指出,从内核2.6.14开始删除了使用--pid-owner或--cmd-owner进行过滤的可能性,并链接到内核changelog,其中我无法检查这个断言,因为我不是内核内部结构的专家!
相当于英语的页面没有那么详细。
使用UID / GID进行过滤仍然有效。
答案 4 :(得分:0)
以@Bgs的答案为基础,我会这样做:
snitch
sudo addgroup --system snitch
sudo adduser $USER snitch
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j REJECT
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j REJECT
dmesg -w
sg
或任何其他类似方式启动目标进程:sg snitch 'your target program'