create iptables rule per process/service

前端 未结 5 1896
挽巷
挽巷 2021-01-31 09:58

is it possible to use iptables in order to permit traffic initiated by a \"process\", ie using the process name? I would like for example to allow everything that is initiated b

相关标签:
5条回答
  • 2021-01-31 10:38

    The French Wikipedia page about iptables https://fr.wikipedia.org/wiki/Iptables states that the possibility to filter with --pid-owner or --cmd-owner was removed starting from kernel 2.6.14... and links to the kernel changelog where I couldn't check this assertion since I am not a specialist of what the kernel internal structures are for!

    The equivalent page in English does not go into that level of detail.

    Filtering with UID/GID still works.

    0 讨论(0)
  • 2021-01-31 10:39

    It looks like the owner iptables module is that what you want. First, check if it's available in Your system:

    iptables -m owner --help
    

    You can read more here: http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

    0 讨论(0)
  • 2021-01-31 10:53

    Building on @Bgs's answer, I would do it like this:

    1. Add a new system group, eg. snitch
    sudo addgroup --system snitch
    
    1. Add yourself to that group, so that you won't be asked for a password to run processes with the primary group set to it:
    sudo adduser $USER snitch
    
    1. Add IPv4 and IPv6 rules to log and reject any packets generated by processes belonging to that group:
    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. Open a tail watch on kernel messages:
    dmesg -w
    
    1. Launch your target process using sg or any other similar means:
    sg snitch 'your target program'
    
    0 讨论(0)
  • 2021-01-31 10:56

    If there is a way to get a process's pid before it starts, then I've never heard about it.

    You could write a wrapper which forks first, then adds the rule and execs the process (assuming the program you're running doesn't fork again), since the PID is not changed by the exec(3) call.

    /* 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);
    }
    
    0 讨论(0)
  • 2021-01-31 11:00
    -m owner --pid-owner PID
    

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

    Note that you need the ipt_owner module, as --pid-owner is not supported by xt_owner.

    For example (this is just an approximation)

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

    In reality, though, you're better off using --uid-owner and --gid-owner. First, the --pid-owner criterion only matches the exact pid, meaning your program could easily spawn a child process which would not be blocked by this rule. (At least I haven't read otherwise.) Secondly, iptables(8) warns that --pid-owner is broken on SMP systems (which may or may not apply to you, but in either case limits portability). Third, there is a race condition in the script above, because the process is started before it is blocked. (If there is a way to get a process's pid before it starts, then I've never heard about it.)

    0 讨论(0)
提交回复
热议问题