LINUX.ORG.RU
решено ФорумAdmin

ipv6tables VS фильтрация исходящего трафика

 , , ,


0

1

Всем добрый вечер. Возникла необходимость возвращать reset при попытке коннекта на хост:порт. Для ipv4 это делается очень просто: Сначала коннект есть:

root@srv:~# telnet -4 google.com 80
Trying 74.125.143.101...
Connected to la-in-f101.1e100.net.
Escape character is '^]'.
^]
telnet> Connection closed.
Потом добавляем правило, чтобы пакет, выходящий на google.com:80 сбрасывался и возвращался reset, чтобы не было таймаута, и соединение сразу разрывалось.
root@srv:~# iptables -t filter -A OUTPUT -d google.com -p tcp --dport 80 -j REJECT --reject-with tcp-reset
Ну и, дальше всё работает:
root@srv:~# time telnet -4 google.com 80
Trying 74.125.143.102...
Trying 74.125.143.113...
Trying 74.125.143.138...
Trying 74.125.143.139...
Trying 74.125.143.100...
Trying 74.125.143.101...
telnet: Unable to connect to remote host: Connection refused

real	0m0.064s
user	0m0.000s
sys	0m0.000s

При попытке проделать тоже самое с ipv6 получается следующее:

root@srv:~# telnet -6 google.com 80
Trying 2a00:1450:4010:c03::64...
Connected to google.com.
Escape character is '^]'.
^]
telnet> Connection closed.
root@srv:~# ip6tables -t filter -A OUTPUT -d google.com -p tcp --dport 80 -j REJECT --reject-with tcp-reset
root@srv:~# time telnet -6 google.com 80
Trying 2a00:1450:4010:c03::64...
telnet: Unable to connect to remote host: Connection timed out

real	1m3.137s
user	0m0.000s
sys	0m0.000s

При этом в tcpdump'е ничего не видно, и reset не возвращается.

Это баг. Он известен, и описан вот тут: https://bugs.launchpad.net/ubuntu/ source/linux/ bug/1234877 Баг в ядре, и он пофикшен 2 месяца назад. Но проблема в том, что, как известно, на серверы ставят LTS, а в убунте щас, например, ядро 3.2, и ждать туда ядра 2-месячной давности можно годами, а проблему решать нужно.

Внимание вопрос, уважаемые знатоки: как мне сделать то, что я хочу, в обход этого бага?

Пытался ещё сделать вот так:

ip6tables -t mangle -A OUTPUT -d google.com -p tcp --dport 80 -j MARK --set-mark 1
ip -6 rule add fwmark 1 unreachable
Не помогает, т.к., похоже, что упирается в тот же баг.


Внимание вопрос, уважаемые знатоки: как мне сделать то, что я хочу, в обход этого бага?

наверное, нужный функционал может подгружаться в виде модуля, берешь (вроде это netfilter), берешь исходники ядра, правишь руками баг, компилируешь этот модуль и подгружаешь

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

а не использовать домен?

То же самое. iptables преобразует имя в список ip при добавлении адреса, это не имеет значения.

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

Насчет «собери модуль, чо, не пацан, чтоли» тут, возможно, будет проблема, т.к. в зоопарке далеко не только Ubuntu, а местами даже машины с Oracle UEK, и это выльется в большой геммор. Хочется какого-нибудь более простого решения :(

Например, я, как решение вижу поднятие на локальной машине интерфейса с адресом удаленной (на случай, если она упала), только тогда становится непонятно, как детектить поднятие удаленной машины. Ну и вообще, это очень большой костыль, все же.

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

а если эта машина упадет?

Суть же как раз в том, что если удаленная машина падает, и не может ничего вернуть ничего, то нам нужно вместо неё локально возвращать tcp-reset, чтобы не было таймаута.

И да, «зарулить» не выйдет, в ip6tables до ядра что-то вроде 3.9 нет NAT :(

Prius ()
Последнее исправление: Prius (всего исправлений: 1 )
Ответ на: комментарий от Prius

т.к. в зоопарке далеко не только Ubuntu, а местами даже машины с Oracle UEK, и это выльется в большой геммор

У тебя чо, роутера нет? Фаерволл обычно там ;)

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

За файрвол и маршрутизаторы отвечают другие люди :) Это во-первых, а во-вторых, нужно мониторить удаленный хост, и если он упал добавлять правила для reject'а пакетов, т.к. в противном случае, приложение, которое написали товарищи программисты, будет ждать таймаута, и всё начнет адово тормозить :)

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

А заставить хост уведомлять о своём поднятии нельзя?

KivApple ★★★★★ ()

В общем, оказалось, что баг пофиксили коллеги, и уже даже собрали рабочее ядро :) Обойти вроде никому не удалось, так что буду, видимо, обновляться.

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