为每个进程/服务创建iptables规则

时间:2010-11-30 13:16:49

标签: linux iptables

是否可以使用iptables来允许“进程”发起的流量,即使用进程名称?我想举例说明允许ping命令启动的所有内容。

5 个答案:

答案 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.htmlhttp://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的答案为基础,我会这样做:

  1. 添加新的系统组,例如。 snitch
sudo addgroup --system snitch
  1. 将您自己添加到该组中,这样就不会要求您输入密码来运行设置了主要组的进程:
sudo adduser $USER snitch
  1. 添加IPv4 和IPv6 规则以记录和拒绝由属于该组的进程生成的任何数据包:
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
  1. 打开对内核消息的监视:
dmesg -w
  1. 使用sg或任何其他类似方式启动目标进程:
sg snitch 'your target program'