LINUX.ORG.RU
ФорумAdmin

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


0

0

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

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

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

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

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

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

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

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

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

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

Это они так говорят. А практика показывает, что без плясок с 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 ★★★★
() автор топика
Ответ на: комментарий от nnz

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

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