LINUX.ORG.RU
ФорумAdmin

Лимитирование соединений на UDP сервис при помощи iptables


0

1

Есть машина с Linux Centos 5.2, есть самописный демон, который принимает определенные данные по UDP протоколу (слушает UDP порт). На udp порт идет поток данных (мусорных в том числе), который увеличивается ближе к вечернему времени, что приводит к тормозам, а в последствии к полной остановке самописного ПО. Исходники демона утеряны и модернизации он не подлежит. Как временное решение проблемы было найдено решение по лимитированию соединений при помощи iptables. Следующие правила применял для реализации этой задачи:

-A RH-Firewall-1-INPUT -p udp -m udp --dport 8000 -m limit --limit 5/second --limit/burst 5 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 8000 --limit 10/s --limit-burst 20 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 8000 -j DROP -m iplimit --iplimit-above 1 -A RH-Firewall-1-INPUT -p udp --dport 8000 -m limit --limit 1/s --limit-burst 1 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 8000 -m limit --limit 20/s --limit-burst 200 -j DROP -A INPUT -p udp --dport 8000 --limit 10/s --limit-burst 20 -j DROP

Данные правила я применял в разном порядке и в разных вариациях. Теперь о том, как проверял работоспособность UDP лимитов:

на «защищаемой» машине запускаю iperf # iperf -s -p 8000 -u

------------------------------------------------------------

Server listening on UDP port 8000 Receiving 1470 byte datagrams UDP buffer size: 8.00 MByte (default)

С другой машины (обе находятся в локальной сети): iperf -c 192.168.1.156 --format k -u -p 8000 -t 180

Смотрю сколько трафика перекачалось, потом повторяю тест, но уже включаю правила iptables. Ситуация не меняется, объем обработанного трафика между машинами остается прежний, вывод - лимитирование не работает, иначе объем данных был бы неизбежно меньше.

В связи с этим у меня к сообществу пара вопросов

1. Правильно ли я проверяю работоспособность UDP лимитов, используя при этом инструмент iperf? 2. Какие же все таки правила iptables нужны для лимитирования соединений по UDP?

Буду рад любым ответам, спасибо.


Начнем с того, что разработка критерия iplimit уже много лет как заброшена. Вместо него используется более совершенный connlimit.

В любом случае, в документации должно быть отмечено, что это критерии работают _только_ с TCP. Потому, что ни в UDP, ни в ICMP нет понятия соединения (а SCTP и DCCP еще не настолько распространены, чтобы париться над их поддержкой). Впрочем, если быть точным, понятие соединения искусственно вводится для них на уровне системы conntrack, работающей на линуксовом фаерволе и упрощающей фильтрацию соединений. Но эта информация _никак не прописана в самом протоколе_, и поэтому, во-первых, она не всегда корректна, а во-вторых, клиенты и сервера могут ничего об этом не знать. Устанавливать же лимиты на основании собственных «тараканов в голове» — не лучшее решение.

Мораль: забудь про фильтрацию UDP-_соединений_, и фильтруй _пакеты_. Например, так я ограничиваю доступ к UDP-портам служб echo, time и daytime, чтобы злые хацкеры не использовали мой сервак для доса других серваков:

iptables -N xinetd
iptables -I INPUT -p udp -m multiport --dports 7,13,37 -j xinetd
iptables -A xinetd -m hashlimit --hashlimit-upto 96/min --hashlimit-burst 128 --hashlimit-mode srcip,dstport --hashlimit-name xinetd -j ACCEPT
iptables -A xinetd -j DROP

Теперь каждый удаленный хост может посылать на каждую из этих моих служб не более 96 пакетов в минуту, чего вполне достаточно всем нормальным клиентам. Все пакеты сверх лимита блокируются.

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