Проблема с iptables+mark
LinAdmin 14 января, 2010 - 11:58
Здравствуйте, у меня проблема с маркировкой пакетов.
Я делаю шейпер. И заметил что скорость он не режет, проверив, я обнаружил что через соответствующие классы не идет трафик.
тогда я решил проверить, а нормально ли пакеты маркируются. Сделал простой скрипт:
iptables -t mangle -A PREROUTING -s 192.168.1.13 -j MARK --set-mark 50 iptables -t mangle -A PREROUTING -d 192.168.1.13 -j MARK --set-mark 50 iptables -A FORWARD -m mark --mark 50 -j REJECT iptables -A OUTPUT -m mark --mark 50 -j REJECT
Пинги идут! Как же так?
»
- Для комментирования войдите или зарегистрируйтесь
Посмотри внимательно
Посмотри внимательно на
Скорее всего правила маркировки не срабатывают
попробуй так:
и смотри логи
эти правила нармальновсе
эти правила нармально все блокируют, как надо:
В логах тоже все чисто и красиво...
iptables -t mangle -vL показывает что пакеты идут.
я по прежнему чего-то не понимаю... но чего я не пониаю, я пока не понимаю...
Если ничего не помогает, прочти наконец инструкцию...
А попробуй делать reject в
А попробуй делать reject в mangle postrouting. Mark же только в mangle работает
DROP и REJECT работают
DROP и REJECT работают отлично.
Но!
не срабатывает, причем никаких ошибок нигде нету!
Это правило так же не срабатывает...
Я вообще в ступоре...
Если ничего не помогает, прочти наконец инструкцию...
Я делаю mark в POSTROUTING,
Я делаю mark в POSTROUTING, все работает. Шейпер, на мой взгляд, должен обрабатывать только те пакеты, относительно которых роутер уже принял решение впустить/выпустить.
Есть один нюанс с mangle: пакет, проходящий через правило, не выходит из цепочки после попадания в нее, а идет по ней далее до конца. Так что, если ниже есть правило, в которое попадает пакет, уже отмаркированный предыдущим правилом, он будет перемаркирован. Для того, чтобы избежать таких чудес, нужно после -j MARK --set-mark 50 добавить точно такое же правило, но с -j RETURN. Года 3 назад у меня из-за этих особенностей mangle мозг чуть не расплавился...
А можете показать свои
А можете показать свои правила?
Если ничего не помогает, прочти наконец инструкцию...
Похоже я понял в чем
Похоже я понял в чем дело.
Правила почему-то не отрабатывают для локальных процессов (в моем случае ping).
Почему так произходит я не знаю. Но стоило мне подключить ноутбук через свой компьютер как он начал работать точно по правилам.
И шейпер нормально заработал.
Если ничего не помогает, прочти наконец инструкцию...
Мне в свое время для
Мне в свое время для понимания работы файрвола очень помогла эта картинка
У меня есть эта картинка, и
У меня есть эта картинка, и она мне тожеой как помогла разобраться в работе фаервола. =)
Вот только по ней таблица mangle как то странно работает.
А как она работает мне до сих пор не ясно...
То ли маркировка в моем примере не работает, толи проверка марки, я не знаю.
Если ничего не помогает, прочти наконец инструкцию...
Локальные процессы не ходят
Локальные процессы не ходят через PREROUTING, а только через OUTPUT и POSTROUTING
Ответы от пингуемой машины по
Ответы от пингуемой машины по идее ведь идут к локальным процессам через PREROUTING...
Если ничего не помогает, прочти наконец инструкцию...
Ответы - по идее да, но не
Ответы - по идее да, но не запросы
В таком случае пинги то не
В таком случае пинги то не должны приходить, а приходят!
Если ничего не помогает, прочти наконец инструкцию...
Чтобы ответы не приходили, их
Чтобы ответы не приходили, их режектить надо в цепочке INPUT
В цепочку OUTPUT попадают исходящие (те, которые через PREROUTING не проходят, следовательно не маркируются)
А цепочка FORWARD вообще не при делах, когда речь идет о локальном трафике.
Глянь на картинку размещенную
Глянь на картинку размещенную выше. -t mangle -A PREROUTING идет ДО INPUT, а значит пакеты должны в любом случае обрабатываться.
Блииин, ну я и туплю...
Вот как работает:
Пакет локальным процессом отправляется и под правило фильтрации не подпадает, ибо не отмаркирован.
Пакет-ответ идет через -t mangle -A PREROUTING и маркируется. Затем попадает к локальному процессу.
Вот и нифига не фильтруется.
Вот если добавить вот эти правила, то все отлично заработает:
Если ничего не помогает, прочти наконец инструкцию...
вот это iptables -t mangle -A
вот это
iptables -t mangle -A OUTPUT -d 192.168.1.13 -j MARK --set-mark 50
замени на
iptables -t mangle -A INPUT -d 192.168.1.13 -j MARK --set-mark 50
тогда будут фильтроваться входящие отмаркированные пакеты
Спасибо, я во всем
Спасибо, я во всем разобрался. =)
Если ничего не помогает, прочти наконец инструкцию...