# [SOLVED: не судьба]Не работает iptables -m owner --cmd-owner

## neroot

Добрый день!

Хотел добиться привязки файрволла к имени программы. Не получилось.  :Sad: 

Пример:

$IPT -N wget-allow

$IPT -F wget-allow

$IPT -A wget-allow -p tcp -m multiport --destination-port 20,21 -m owner --cmd-owner wget -j ACCEPT

$IPT -A wget-allow -p udp -m multiport --destination-port 20,21 -m owner --cmd-owner wget -j ACCEPT

Вывод:

iptables: Invalid argument

iptables: Invalid argument

Стоит:

% emerge -pav iptables gentoo-sources

[ebuild   R   ] net-firewall/iptables-1.3.8-r1  USE="extensions -imq -ipv6 -l7filter -static" 169 kB 

[ebuild   R   ] sys-kernel/gentoo-sources-2.6.22-r4  USE="symlink -build" 0 kB 

% gzcat /proc/config.gz | grep -i owner

CONFIG_IP_NF_MATCH_OWNER=y

CONFIG_IP6_NF_MATCH_OWNER=y

В чем я мог ошибиться?

----------

## calculator

А оно в логи пишет  :Smile: 

```
ipt_owner: pid, sid and command matching not supported anymore
```

----------

## neroot

Сначала вопрос. Я что-то не нашел в своих логах такой строчки... Где нашли ее Вы?

По теме:

Я правильно понимаю, что не судьба получается?... Жаль.

С другой стороны, в моем затертом до дыр мане --owner присутствует во всех его расширениях и ни слова не увидел про то, что они это дело бросили...

И тогда другой вопрос. Чисто теоретический.

Каким механизмом связывается теперь процесс и разрешения? Чем это можно/модно делать? И где бы об этом почитать...

Заранее спасибо!

----------

## calculator

Это сообщение сам модуль пишет - в dmesg видно.

В инете пишут что в 2.6.14 закрыли.

----------

## neroot

Ок, не судьба, так не судьба. Ладно.

Обидно, правда, такая хорошая опция - и брошена...

Жаль.

----------

## calculator

Ну вот при обновлении на 2.6.25 наткрулся: "owner" match support (NETFILTER_XT_MATCH_OWNER) [N/m/?] (NEW)

Хотя нет, --cmd-owner так и не работает. --uid-owner, --gid-owner только

----------

## neroot

Жаль, возможность-то, по идее, хорошая.

----------

## ivan1986

Вообще там довольно легко вернуть код из ядра 2.6.8 (че нашел, то и юзаю)

работало прекрастно в 18-24, сейчас скачал 25.2 - там модуль переехал в другую папку

/usr/src/linux-2.6.25.2/net/netfilter/xt_owner.c

раньше был в 

/usr/src/linux-2.6.24/net/ipv4/netfilter/ipt_owner.c

и там все решалось таким патчем

```

--- ipt_owner.c.orig   2007-11-16 21:14:27.000000000 +0300

+++ ipt_owner.c   2007-11-18 15:40:34.000000000 +0300

@@ -21,6 +21,106 @@

 MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");

 MODULE_DESCRIPTION("iptables owner match");

 

+static int

+match_comm(const struct sk_buff *skb, const char *comm)

+{

+   struct task_struct *g, *p;

+   struct files_struct *files;

+   int i;

+

+   read_lock(&tasklist_lock);

+   do_each_thread(g, p) {

+      if(strncmp(p->comm, comm, sizeof(p->comm)))

+         continue;

+

+      task_lock(p);

+      files = p->files;

+      if(files) {

+         spin_lock(&files->file_lock);

+         for (i=0; i < files->fdt->max_fds; i++) {

+            if (fcheck_files(files, i) ==

+                skb->sk->sk_socket->file) {

+               spin_unlock(&files->file_lock);

+               task_unlock(p);

+               read_unlock(&tasklist_lock);

+               return 1;

+            }

+         }

+         spin_unlock(&files->file_lock);

+      }

+      task_unlock(p);

+   } while_each_thread(g, p);

+   read_unlock(&tasklist_lock);

+   return 0;

+}

+

+static int

+match_pid(const struct sk_buff *skb, pid_t pid)

+{

+   struct task_struct *p;

+   struct files_struct *files;

+   int i;

+

+   read_lock(&tasklist_lock);

+   p = find_task_by_pid(pid);

+   if (!p)

+      goto out;

+   task_lock(p);

+   files = p->files;

+   if(files) {

+      spin_lock(&files->file_lock);

+      for (i=0; i < files->fdt->max_fds; i++) {

+         if (fcheck_files(files, i) ==

+             skb->sk->sk_socket->file) {

+            spin_unlock(&files->file_lock);

+            task_unlock(p);

+            read_unlock(&tasklist_lock);

+            return 1;

+         }

+      }

+      spin_unlock(&files->file_lock);

+   }

+   task_unlock(p);

+out:

+   read_unlock(&tasklist_lock);

+   return 0;

+}

+

+static int

+match_sid(const struct sk_buff *skb, pid_t sid)

+{

+   struct task_struct *g, *p;

+   struct file *file = skb->sk->sk_socket->file;

+   int i, found=0;

+

+   read_lock(&tasklist_lock);

+   do_each_thread(g, p) {

+      struct files_struct *files;

+      if (p->signal->session != sid)

+         continue;

+

+      task_lock(p);

+      files = p->files;

+      if (files) {

+         spin_lock(&files->file_lock);

+         for (i=0; i < files->fdt->max_fds; i++) {

+            if (fcheck_files(files, i) == file) {

+               found = 1;

+               break;

+            }

+         }

+         spin_unlock(&files->file_lock);

+      }

+      task_unlock(p);

+      if (found)

+         goto out;

+   } while_each_thread(g, p);

+out:

+   read_unlock(&tasklist_lock);

+

+   return found;

+}

+

 static bool

 match(const struct sk_buff *skb,

       const struct net_device *in,

@@ -48,6 +148,24 @@

          return false;

    }

 

+   if(info->match & IPT_OWNER_PID) {

+      if (!match_pid(skb, info->pid) ^

+          !!(info->invert & IPT_OWNER_PID))

+         return false;

+   }

+

+   if(info->match & IPT_OWNER_SID) {

+      if (!match_sid(skb, info->sid) ^

+          !!(info->invert & IPT_OWNER_SID))

+         return false;

+   }

+

+   if(info->match & IPT_OWNER_COMM) {

+      if (!match_comm(skb, info->comm) ^

+          !!(info->invert & IPT_OWNER_COMM))

+         return false;

+   }

+

    return true;

 }

 

@@ -60,11 +178,21 @@

 {

    const struct ipt_owner_info *info = matchinfo;

 

+   if (hook_mask

+       & ~((1 << NF_IP_LOCAL_OUT) | (1 << NF_IP_POST_ROUTING))) {

+      printk("ipt_owner: only valid for LOCAL_OUT or POST_ROUTING.\n");

+      return false;

+   }

+

+#ifdef CONFIG_SMP

+   /* files->file_lock can not be used in a BH */

    if (info->match & (IPT_OWNER_PID|IPT_OWNER_SID|IPT_OWNER_COMM)) {

-      printk("ipt_owner: pid, sid and command matching "

-             "not supported anymore\n");

+      printk("ipt_owner: pid, sid and command matching is broken "

+             "on SMP.\n");

       return false;

    }

+#endif

+

    return true;

 }

 

```

Сейчас конечно попробую собрать новое ядро после шаманств с новым файлом.

Такой вопрос, как мне пнуть разработчика по этому вопросу.

Хелп мне плиз с этим - а то как-то не хочется с каждым новым изменением плясать с бубном, тем более не понятно, чего они функционал выкинули - все пашет... У меня это правило юзается для торрентов - хоть бы один глюк...

----------

## ivan1986

Новое соберу без #ifdef CONFIG_SMP - так как потестить бы...

----------

## _Sir_

 *ivan1986 wrote:*   

> тем более не понятно, чего они функционал выкинули

 Вот об этом и спроси в рассылке по netfilter

----------

