LINUX.ORG.RU

l7-filter для tc и пляски с MARK-CONNMARK


0

0

Суть задачи стара как мир: нужно ограничивать/приоретизировать трафик на основании протоколов прикладного уровня.

Насколько я понял из документации по tc, фильтрация по handle <метка> fw хватает отдельные пакеты, а не соединения. Также, как показала практика, l7-filter тоже маркирует только отдельные пакеты. Например, для http он метит только начало ответа сервера (там где заголовки, которые матчатся по регэкспам).

Получается такая картина: для всех пакетов с маркировкой нужно делать CONNMARK --save-mark, а для всех пакетов без маркировки пакета, но с маркировкой соединения - CONNMARK --restore-mark.

Вроде логично. Но гугл выдает кучу манов, в которых таких вещей и близко нет. Вот мне и стало интересно: то ли я чего-то не понял, то ли столько "гениальных" копипаст^Wавторов поразвелось.

★★★★

Re: l7-filter для tc и пляски с MARK-CONNMARK

Не знаю, мне гугл выдал первым такую ссылку http://home.regit.org/connmark.html там вроде пример приведен с restore/save и маркировкой. Или вам нужен пример с restore/save и l7-filter?

mky ★★★★★ ()
Ответ на: Re: l7-filter для tc и пляски с MARK-CONNMARK от mky

Re: l7-filter для tc и пляски с MARK-CONNMARK

С CONNMARK я вроде обращаться умею, спасибо :)

Меня собсно интересует, почему подавляющее большинство манов по l7-filter никак эту штуку не используют, хотя (как я понял) она там очень даже нужна. Точнее, мне интересно, у кого ошибка в ДНК: у меня или у многочисленных авторов манов по l7-filter?

nnz ★★★★ ()
Ответ на: Re: l7-filter для tc и пляски с MARK-CONNMARK от nnz

Re: l7-filter для tc и пляски с MARK-CONNMARK

Если верить вот этому, http://l7-filter.sourceforge.net/technicaldetails, то l7 после того как один раз определил тип протокола, запоминает его для этого соединения и на все последующие запросы для этого соединения отвечает этим типом. То есть получается, что CONMARK в этом случае не нужен, хотя, наверное, нужно это проверить.

mky ★★★★★ ()
Ответ на: Re: l7-filter для tc и пляски с MARK-CONNMARK от mky

Re: l7-filter для tc и пляски с MARK-CONNMARK

Это они так говорят. А практика показывает, что без плясок с CONNMARK в случае с http ловится только начало ответа сервера. Например,

Jun 16 14:01:29 lenin kernel: [238961.679448] 0HTTP: IN= OUT=eth0 SRC=10.134.0.126 DST=10.134.0.66 LEN=256 TOS=0x00 PREC=0x00 TTL=64 ID=1754 DF PROTO=TCP SPT=80 DPT=44711 WINDOW=108 RES=0x00 ACK PSH URGP=0 MARK=0x11
Jun 16 14:01:29 lenin kernel: [238961.679448] 0HTTP: IN= OUT=eth0 SRC=10.134.0.126 DST=10.134.0.66 LEN=203 TOS=0x00 PREC=0x00 TTL=64 ID=1755 DF PROTO=TCP SPT=80 DPT=44711 WINDOW=108 RES=0x00 ACK PSH FIN URGP=0 MARK=0x11

Это все, что осталось от HTTP-соединения. Только два исходящих пакета.

l7-filter стоит на 10.134.0.126, он же веб-сервер. Тестовые запросы посылаются с хоста 10.134.0.66.

Конфигурация фаервола на 10.134.0.126 (таблица filter, в mangle только NFQUEUE на входе и выходе).
Chain INPUT (policy ACCEPT 86706 packets, 65M bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x11 LOG flags 0 level 7 prefix `1HTTP: '

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 50607 packets, 8274K bytes)
 pkts bytes target     prot opt in     out     source               destination
   12  2754 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x11 LOG flags 0 level 7 prefix `0HTTP: '

Теперь переделаем таблицу filter вот так:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x11 CONNMARK save
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           connmark match 0x11 CONNMARK restore
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x11 LOG flags 0 level 7 prefix `1HTTP: '

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x11 CONNMARK save
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           connmark match 0x11 CONNMARK restore
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x11 LOG flags 0 level 7 prefix `0HTTP: '

И посмотрим в лог:
Jun 16 14:03:51 lenin kernel: [239103.669695] 0HTTP: IN= OUT=eth0 SRC=10.134.0.126 DST=10.134.0.66 LEN=256 TOS=0x00 PREC=0x00 TTL=64 ID=58831 DF PROTO=TCP SPT=80 DPT=47589 WINDOW=108 RES=0x00 ACK PSH URGP=0 MARK=0x11
Jun 16 14:03:51 lenin kernel: [239103.669813] 0HTTP: IN= OUT=eth0 SRC=10.134.0.126 DST=10.134.0.66 LEN=203 TOS=0x00 PREC=0x00 TTL=64 ID=58832 DF PROTO=TCP SPT=80 DPT=47589 WINDOW=108 RES=0x00 ACK PSH FIN URGP=0 MARK=0x11
Jun 16 14:03:51 lenin kernel: [239103.711851] 1HTTP: IN=eth0 OUT= MAC=00:0c:29:a6:d2:3e:00:15:17:4c:79:49:08:00 SRC=10.134.0.66 DST=10.134.0.126 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=8589 DF PROTO=TCP SPT=47589 DPT=80 WINDOW=108 RES=0x00 ACK URGP=0 MARK=0x11
Jun 16 14:03:51 lenin kernel: [239103.745847] 1HTTP: IN=eth0 OUT= MAC=00:0c:29:a6:d2:3e:00:15:17:4c:79:49:08:00 SRC=10.134.0.66 DST=10.134.0.126 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=8590 DF PROTO=TCP SPT=47589 DPT=80 WINDOW=125 RES=0x00 ACK FIN URGP=0 MARK=0x11
Jun 16 14:03:51 lenin kernel: [239103.745847] 0HTTP: IN= OUT=eth0 SRC=10.134.0.126 DST=10.134.0.66 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=58833 DF PROTO=TCP SPT=80 DPT=47589 WINDOW=108 RES=0x00 ACK URGP=0 MARK=0x11

Как видим, теперь ловятся как исходящие пакеты (0HTTP), так и входящие (1HTTP), но только после некоторого исходящего, который первым попал под регэксп.

Так что вопрос об ошибке в ДНК остается не просто открытым, но злободневным :)

nnz ★★★★ ()
Ответ на: Re: l7-filter для tc и пляски с MARK-CONNMARK от nnz

Re: l7-filter для tc и пляски с MARK-CONNMARK

Забыл сказать. Речь идет о юзерспейсовском варианте l7-filter. Возможно, его работа слегка отличается от встроенного критерия iptables. Но уж очень не хочется пересобирать ядро и фаервол, тем более делать это регулярно. Все-таки на этой тестовой машинке отрабатываются приемы для серьезных серваков.

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