Снова Asterisk или надоели господа из оккупированных палестинских территорий

установив Asterisk 10 столкнулся с проблемой - в логи сыпятся сообщения о том, что некий девайс пытался зарегистрироваться с моим внешним IP. Отбросив море какашек в форумах - "типа сам дурак" и "чо гугл отменили?", а так же "iptables настроить не можешь ?", пылесосенье интернета дало результаты.

Респект и уважуха автору Cybermind с Asteriskforum.ru, его статейка  прямо в жилу. 
Автор: Cybermind
Добавлено: Пт Авг 10, 2012 06:28 (GMT 1)


Asterisk 1.8.15.0. Недавно начали надоедать господа из оккупированных палестинских территорий. В логах можно заметить такое:
Код:
Sending fake auth rejection for device 5550000<sip:Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. >;tag=f140a208


Естественно правило fail2ban сработает только блокировкой внешнего IP Asterisk. Здесь на форуме предлагали лекарство правкой исходника, но оно не работает на 1.8. 
Открыв исходник chan_sip.c, можно увидеть в нескольких местах строчки: 
Код:
ast_log(LOG_NOTICE, "Sending fake auth rejection for device %s\n", get_header(req, "From"));

Поиском по форуму digium, нашлось решение. Заменил в исходнике вышеуказанные строчки на вот такую конструкцию:
Код:
ast_log(LOG_NOTICE, "Sending fake auth rejection for device %s (%s)\n", get_header(req, "From"), ast_sockaddr_stringify(addr));

Теперь в логах детектится IP адрес:
Код: 
Sending fake auth rejection for device 5550000<sip:Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. >;tag=b80e9671 (83.244.6.160:10045)

Правило в /etc/fail2ban/filter.d/asterisk.conf:  
Код: 
NOTICE.* .*: Sending fake auth rejection for device.* \(<HOST>:.*\)

Теперь палестинцы успешно отправляются в бан. Возможно есть ошибка в решении вопроса, поправьте пожалуйста.

От себя добавлю что механика изменений оч проста, достаточно в местах в chan_sip.c исправить логирование и вот вам счастье. Обратите внимание когда будете править, что в ряде мест не "Sending fake auth rejection for device", а "Failed to authenticate device". У меня получалось что-то вроде :

if (res == AUTH_FAKE_AUTH) {

ast_log(LOG_NOTICE, "Sending fake auth rejection for device %s (%s)\n", sip_get_header(req, "From"), ast_sockaddr_stringify(addr));

transmit_fake_auth_response(p, SIP_SUBSCRIBE, req, XMIT_UNRELIABLE);

} else {

ast_log(LOG_NOTICE, "Failed to authenticate device %s for SUBSCRIBE (%s)\n", sip_get_header(req, "From"), ast_sockaddr_stringify(addr));

transmit_response_reliable(p, "403 Forbidden", req);

}

Далее три шага: запускаем еще раз make, копируем chan_sip.so в папочку с модулями и перегружаем астериск. Радостно наблюдаем растущий список fail2ban.

конечно везде рекомендуемое решение не помешает:

iptables -A INPUT -p udp --dport 5060 -m recent --update --seconds 2 --hitcount 60 --name SIP \

-j LOG --log-prefix "SIP flood detected: "

У этого решения есть недостаток, некоторые устройства заносятся в флуд, например Panasonic Sip-Dect.  Я хочу конкретно знать, что за гадина и откуда лезет.