СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Asterisk + iptables — самый простой способ настройки в черновиках Tutorial

Хочу представить вашему вниманию простой и понятный shell-скрипт, который нужно лишь слегка подредактировать и затем запустить — и брандмауэр на вашем asterisk-сервере будет настроен без лишних сложностей.



Создайте shell-скрипт со следующим содержимым (не забудьте chmod 755):

# Создаём базовые правила
iptables -P INPUT ACCEPT
iptables -F
iptables -A INPUT -i lo -j ACCEPT

# Если мы полностью доверяем сети, подключенной к eth0 - строчку ниже можно раскомментировать
# iptables -A INPUT -i eth0 -j ACCEPT

# Не трогаем уже установленные соединений
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешаем SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Добавляем правило - заблокировать всё кроме указанного ниже
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Разрешаем HTTPS (если используем админку типа FreePBX)
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Разрешаем SIP только с указанных адресов и диапазонов
# iptables -A INPUT -p udp -m udp -s 123.123.123.123 --dport 5060 -j ACCEPT
# iptables -A INPUT -p udp -m udp -s 125.125.125.125 --dport 5060 -j ACCEPT
# iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 5060 -j ACCEPT

# Либо разрешаем SIP с любого адреса
# iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT

# Разрешаем RTP
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT

# Разрешаем IAX2 с указанного адреса
# iptables -A INPUT -p udp -m udp -s 192.168.1.1 --dport 4569 -j ACCEPT

# Или разрешам IAX2 с любого адреса
# iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT

# Защита от SIP flood
iptables -A INPUT -p udp --dport 5060 -m recent --set --name SIP
iptables -A INPUT -p udp --dport 5060 -m recent --update --seconds 2 --hitcount 20 --name SIP -j LOG --log-level INFO --log-prefix "SIP flood detected: " 


Если у вас CentOS подобная ОС — то после запуска скрипта нужно набрать
service iptables save
service iptables start

комментарии (12)

0
J_o_k_e_R ,  
# Защита от SIP flood
iptables -A INPUT -p udp --dport 5060 -m recent --set --name SIP
iptables -A INPUT -p udp --dport 5060 -m recent --update --seconds 2 --hitcount 20 --name SIP -j LOG --log-level INFO --log-prefix «SIP flood detected: „


А дропать пакеты по Вашему не надо? Или я что-то пропустил на ночь глядя?
0
+1 –1
vorphalack ,  

пропустили iptables -P INPUT DROP

0
J_o_k_e_R ,  

Замечательно, а от SIP flood нам это как поможет? Если мы его только в лог пишем.

0
+1 –1
vorphalack ,  

man iptables / -P

+1
J_o_k_e_R ,  

По существу сказать нечего?
Объясняю на пальцах:

В текущей реализации пакеты на порт 5060 вообще идти не будут. Так как у нас для них есть только цель LOG, который их пишет в лог, но не является терминирующей целью, т.е. передает решение правилам дальше. Дальше они ВСЕ (не только флуд) будут отбрасываться правилом по умолчанию, на которое Вы ссылаетесь.

Если предположить, что автор подразумевает, что должен быть расскомментирован один из кусков:

# Разрешаем SIP только с указанных адресов и диапазонов
# iptables -A INPUT -p udp -m udp -s 123.123.123.123 --dport 5060 -j ACCEPT
# iptables -A INPUT -p udp -m udp -s 125.125.125.125 --dport 5060 -j ACCEPT
# iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 5060 -j ACCEPT


либо
# Либо разрешаем SIP с любого адреса
# iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT


то на этих ACCEPT ВСЕ пакеты будут приниматься, опять же вне зависимости от антифлудовых правил.

На самом деле я уже знаю правильный ответ, так как нашел откуда автор это копипастил, да не докопипастил. Хотелось бы его навести на правильную мысль.
–1
varnav ,  

Эээ, наверное защиту от SIP Flood надо ставить ближе к началу скрипта?

0
J_o_k_e_R ,  

Неверно.

По-прежнему будет только писать в лог попытку флуда, никак ее не предотвращая.

Еще варианты? Может быть, раз беретесь за статью на эту тему, стоит разобраться, что же Вы пишите. Ну или хотя бы внимательно прочитать источник копипасты? (хотя и в нем прилично недочетов)

–1
varnav ,  

Источник не предлагает дропать пакеты. Источник предлагает их логировать и ограничивать их количество.

во втором правиле он помечается для учёта под именем SIP. Третье правило считает не превысил ли данный пакет указанное количество (60) за указанное время (2 секунды).

Если количество не превышено – правило игнорируется, если превышено – выполняется действие. В нашем случае в системный лог пишется детальная информация о пакете начинающаяся со строки «SIP flood detected: «. Количество пакетов и время считаются отдельно для каждого источника. Таким образом получается, что мы ограничили скорость приёма SIP пакетов от каждого незаблокированного IP адреса на уровне 30 пакетов в секунду.

Для меня данное ограничение является комфортным, с одной стороны все клиенты, даже самые крупнные, шлют пакеты с одного IP адреса со скоростями ниже 30 пакетов/с, с другой стороны, 30 пакетов в секунду практически не отражаютя на работе системы. Возможно, что эту величину следует подправлять в ту или иную сторону в зависимости от производительности сервера, количества и типа абонентов.

В некоторых системах встроенное ограничение модуля recent на параметр hitcount весьма небольшое, например в CentOS это ограничение составляет 20 пакетов.


habrahabr.ru/company/myasterisk/blog/130325/

0
J_o_k_e_R ,  

Замечательно. А то, что там еще и fail2ban упоминается, Вы не заметили? Без него приведенный Вами конфиг не работает совершенно.

Собственно поэтому на хабре и запрещены бездумные копипасты, да и копипасты вообще.

–1
varnav ,  

Вообще весь не работает?

+1
udachnik ,  

А зачем определять policy на input сначала accept, потом что-то описывать, потом переопределять policy в drop?

–1
varnav ,  

Чтобы SSH не отвалился в момент запуска скрипта.