LINUX.ORG.RU
ФорумAdmin

Игнорируется mark в POSTROUTING


0

1

Выполняю на маршрутизаторе следующие команды:

iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING --match ipp2p --bit -p tcp -j MARK --set-mark 0x1
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

iptables -t nat -A POSTROUTING --match mark --mark 0x1 -p tcp -j MASQUERADE --to-ports 0x1000-0x10ff

Ожидаю увидеть, что все tcp-пакеты с торрентами маркируются, а потом для исходящих пакетов подменяется порт источника.

Маркируются они нормально:

iptables -t mangle -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 396K packets, 351M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 396K  351M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK restore 
 1123  165K MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           ipp2p --bit MARK set 0x1 
 396K  351M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK save 

А вот порт меняться даже и не думает:

iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 1251 packets, 102K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 masq ports: 4096-4351 
 2042  127K MASQUERADE  all  --  *      ppp0    0.0.0.0/0            0.0.0.0/0           
    1   258 MASQUERADE  all  --  *      eth1    0.0.0.0/0            192.168.1.0/24      

Подскажите пожалуйста, в чём может быть проблема?

Исходящие пакеты с торрентами в это время точно были, и соединения устанавливались (специально перезапускал клиент).

Добавьте в цепочку "-t mangle -A POSTROUTING" правило, считающие SYN-пакеты с "--mark 0x1" и посмотрите счётчик.

mky ★★★★★
()
Ответ на: комментарий от mky

Проверил, на всякий случай, все флаги:

iptables -t mangle -A POSTROUTING --match mark --mark 0x1 -p tcp --tcp-flags SYN SYN -j MARK --set-mark 0x2
iptables -t mangle -A POSTROUTING --match mark --mark 0x1 -p tcp --tcp-flags ACK ACK -j MARK --set-mark 0x3
iptables -t mangle -A POSTROUTING --match mark --mark 0x1 -p tcp --tcp-flags FIN FIN -j MARK --set-mark 0x4
iptables -t mangle -A POSTROUTING --match mark --mark 0x1 -p tcp --tcp-flags RST RST -j MARK --set-mark 0x5
iptables -t mangle -A POSTROUTING --match mark --mark 0x1 -p tcp --tcp-flags URG URG -j MARK --set-mark 0x6
iptables -t mangle -A POSTROUTING --match mark --mark 0x1 -p tcp --tcp-flags PSH PSH -j MARK --set-mark 0x7

Получилось следующее:

sudo iptables -t mangle -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 613K packets, 506M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 613K  506M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK restore 
 3158  408K MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           ipp2p --bit MARK set 0x1 
 613K  506M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK save 
    6   356 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x02/0x02 MARK set 0x2 
 308K  235M MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x10/0x10 MARK set 0x3 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x01/0x01 MARK set 0x4 
  139  5560 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x04/0x04 MARK set 0x5 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x20/0x20 MARK set 0x6 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x08/0x08 MARK set 0x7 

SYN действительно нет, почти все идут с флагом ACK и немного - с RST.

Но вот результат netstat на машине с запущенным клиентом:

Активные соединения с интернетом (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State       PID/Program name
tcp        0      0 ubuntu-1:31415          95-26-12-56.broad:50896 SYN_RECV    -               
tcp        0      1 ubuntu-1:34038          95.73.83.223:35172      SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:50637          178.123.234.99:61717    SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:43095          ppp91-76-130-236.:31415 SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:53376          85.202.230.174:48924    SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:60740          211.4.20.218.broa:13408 SYN_SENT    1583/transmission
tcp        0      0 ubuntu-1:52130          ip-213-141-143-76:51777 ESTABLISHED 1583/transmission
tcp        0      1 ubuntu-1:34805          92.87.197.69:42368      SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:41520          91.103.207.96:13211     SYN_SENT    1583/transmission
tcp        0  18382 ubuntu-1:31415          softbank1261310900:3830 ESTABLISHED 1583/transmission
tcp        0      1 ubuntu-1:58996          77.238.131.133:23389    SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:55861          92.243.167.175:10731    SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:37486          178.34.96.145:22839     SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:51956          16.82.32.95.dsl-d:28484 SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:36827          188.134.32.69:24199     SYN_SENT    1583/transmission
tcp        0  17280 ubuntu-1:47228          95.57.98.208:15659      ESTABLISHED 1583/transmission
tcp        0      1 ubuntu-1:37587          shpd-95-53-187-16:60006 SYN_SENT    1583/transmission
tcp        0      1 ubuntu-1:57874          82.140.221.192:51413    SYN_SENT    1583/transmission
^C

Даже если пакеты, ушедшие по соединениям в состоянии SYN_SENT, на самом деле, почему-то потерялись, откуда могли ESTABLISHED соединения, если через маршрутизатор ни одного SYN-пакета не прошло?

maxikov
() автор топика
Ответ на: комментарий от mky

Решил попробовать маркировать пакеты не по ipp2p, а по ip машины, с которой осуществляется загрузка. Заодно, перенёс и правила с ipp2p в PREROUTING:

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING --match ipp2p --bit -p tcp -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark


iptables -t mangle -A PREROUTING --match mark --mark 0x1 -p tcp --tcp-flags SYN SYN -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING --match mark --mark 0x1 -p tcp --tcp-flags ACK ACK -j MARK --set-mark 0x3
iptables -t mangle -A PREROUTING --match mark --mark 0x1 -p tcp --tcp-flags FIN FIN -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING --match mark --mark 0x1 -p tcp --tcp-flags RST RST -j MARK --set-mark 0x5
iptables -t mangle -A PREROUTING --match mark --mark 0x1 -p tcp --tcp-flags URG URG -j MARK --set-mark 0x6
iptables -t mangle -A PREROUTING --match mark --mark 0x1 -p tcp --tcp-flags PSH PSH -j MARK --set-mark 0x7


iptables -t mangle -A PREROUTING -p tcp --source 192.168.10.103 -j MARK --set-mark 0x10

iptables -t mangle -A PREROUTING --match mark --mark 0x10 -p tcp --tcp-flags SYN SYN -j MARK --set-mark 0x20
iptables -t mangle -A PREROUTING --match mark --mark 0x10 -p tcp --tcp-flags ACK ACK -j MARK --set-mark 0x30
iptables -t mangle -A PREROUTING --match mark --mark 0x10 -p tcp --tcp-flags FIN FIN -j MARK --set-mark 0x40
iptables -t mangle -A PREROUTING --match mark --mark 0x10 -p tcp --tcp-flags RST RST -j MARK --set-mark 0x50
iptables -t mangle -A PREROUTING --match mark --mark 0x10 -p tcp --tcp-flags URG URG -j MARK --set-mark 0x60
iptables -t mangle -A PREROUTING --match mark --mark 0x10 -p tcp --tcp-flags PSH PSH -j MARK --set-mark 0x70

Получилась следующая интересная картина:

sudo iptables -t mangle -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 145K packets, 110M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 145K  110M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK restore 
  992  124K MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           ipp2p --bit MARK set 0x1 
 145K  110M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK save 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x02/0x02 MARK set 0x2 
64511   54M MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x10/0x10 MARK set 0x3 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x01/0x01 MARK set 0x4 
   53  2120 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x04/0x04 MARK set 0x5 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x20/0x20 MARK set 0x6 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x08/0x08 MARK set 0x7 
88356   60M MARK       tcp  --  *      *       192.168.10.103       0.0.0.0/0           MARK set 0x10 
 3391  201K MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x02/0x02 MARK set 0x20 
84929   60M MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x10/0x10 MARK set 0x30 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x01/0x01 MARK set 0x40 
   36  1440 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x04/0x04 MARK set 0x50 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x20/0x20 MARK set 0x60 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x08/0x08 MARK set 0x70 

То есть, на самом деле, пакеты идут как надо, это ipp2p не фиксирует SYN-пакеты. Впрочем, а с чего бы ему их фиксировать, в них же, наверняка, ни слова о P2P, только служебная информация TCP.

Похоже, придётся всё-таки ориентировать только на IP.

По крайней мере, это, вроде, возможно:

iptables -t mangle -A PREROUTING -p tcp --source 192.168.10.103 -j MARK --set-mark 0x10

iptables -t mangle -A POSTROUTING --match mark --mark 0x10 -p tcp --tcp-flags SYN SYN -j MARK --set-mark 0x20
iptables -t mangle -A POSTROUTING --match mark --mark 0x10 -p tcp --tcp-flags ACK ACK -j MARK --set-mark 0x30
iptables -t mangle -A POSTROUTING --match mark --mark 0x10 -p tcp --tcp-flags FIN FIN -j MARK --set-mark 0x40
iptables -t mangle -A POSTROUTING --match mark --mark 0x10 -p tcp --tcp-flags RST RST -j MARK --set-mark 0x50
iptables -t mangle -A POSTROUTING --match mark --mark 0x10 -p tcp --tcp-flags URG URG -j MARK --set-mark 0x60
iptables -t mangle -A POSTROUTING --match mark --mark 0x10 -p tcp --tcp-flags PSH PSH -j MARK --set-mark 0x70
sudo iptables -t mangle -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 90246 packets, 60M bytes)
 pkts bytes target     prot opt in     out     source               destination         
90246   60M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK restore 
  644 82476 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           ipp2p --bit MARK set 0x1 
90246   60M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK save 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x02/0x02 MARK set 0x2 
36568   30M MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x10/0x10 MARK set 0x3 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x01/0x01 MARK set 0x4 
   34  1360 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x04/0x04 MARK set 0x5 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x20/0x20 MARK set 0x6 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 tcp flags:0x08/0x08 MARK set 0x7 
55580   31M MARK       tcp  --  *      *       192.168.10.103       0.0.0.0/0           MARK set 0x10 
sudo iptables -t mangle -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 106K packets, 74M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2364  140K MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x02/0x02 MARK set 0x20 
22637   11M MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x10/0x10 MARK set 0x30 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x01/0x01 MARK set 0x40 
   30  1200 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x04/0x04 MARK set 0x50 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x20/0x20 MARK set 0x60 
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x10 tcp flags:0x08/0x08 MARK set 0x70 
maxikov
() автор топика
Ответ на: комментарий от maxikov

>Впрочем, а с чего бы ему их фиксировать, в них же, наверняка, ни слова о P2P, только служебная информация TCP.

Вот замечательно, что вы сами дошли до этой мысли :) Конечно, в теории можно смотреть все пакеты, парсить протокол, пытаться определить какие новые соединение связаны с торентом, но это слишком сложно.

А в nat таблицу попадает только первый пакет соединения (state NEW) или tcp SYN в обычном случае. И по этому пакету определяется как будет произведён NAT, так как после первого пакета (установления содинения) нельзя поменять его порт/адрес.

Если говорить о торрентах, то, ИМХО, проще определить все другие виды траффика по dst-порту, а то, что осталось, считать торрентами.

mky ★★★★★
()
8 августа 2011 г.
Ответ на: комментарий от mky

>А в nat таблицу попадает только первый пакет соединения (state NEW) или tcp SYN в обычном случае. И по этому пакету определяется как будет произведён NAT, так как после первого пакета (установления содинения) нельзя поменять его порт/адрес.

На практике Ваши слова подтверждаются. Но я никак не могу найти подтверждение Ваших слов в документации по iptables. Подскажите, где искать? Очень нужно! Уже в глазах рябит все перечитывать!

sestrichka
()
Ответ на: комментарий от sestrichka

>А в nat таблицу попадает только первый пакет соединения (state NEW) или tcp SYN в обычном случае.

man iptables

nat: This table is consulted when a packet that creates a new connection is encountered.

так как после первого пакета (установления содинения) нельзя поменять его порт/адрес.

Не знаю, где это написано прямо. В документации по iptables этого точно нет. Может это есть в rfc на tcp/ip, но лишний раз перечитывать его не хочется.

Принимающая сторона по прибытию SYN-пакета создаёт сокет. Порты и ip-адреса этого сокета после создания не могут быть изменены.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.