Для защиты SIP-порта можно использовать анализ пакетов с помощью опции “content” в Firewall Mikrotik. Но, для начала, нам нужно узнать, что именно посылает наш сервер телефонии на неправильный логин и пароль. Для примера возьмем самый популярный сервер телефонии – Asterisk с веб-интерфейсом FreePBX. Перво-наперво можно изучить, какие именно стандартные ответы дает SIP-сервер:
SIP/2.0 400 Bad Request – запрос не понят из-за синтаксических ошибок в нем, ошибка в сигнализации, скорее всего что-то с настройками оборудования
SIP/2.0 401 Unauthorized – нормальный ответ сервера о том, что пользователь еще не авторизировался; обычно после этого абонентское оборудование отправляет на сервер новый запрос, содержащий логин и пароль
SIP/2.0 401 Expired Authorization – время регистрации истекло
SIP/2.0 402 Payment Required – требуется оплата (зарезервирован для использования в будущем)
SIP/2.0 403 No Such User – нет такого пользователя, ошибка в номере, логине или пароле
SIP/2.0 403 User Disabled – пользователь отключен
SIP/2.0 403 Wrong Guess – ошибка в пароле
SIP/2.0 403 Conflict – такой SIP-номер уже используется
SIP/2.0 403 Forbidden – абонент не зарегистрирован
SIP/2.0 403 Empty Route Set – нет ни одного шлюза в роутинге
SIP/2.0 403 Caller Not Registered – нет такого пользователя
SIP/2.0 403 Out of Look-Ahead Retries – перебор узлов закончен
SIP/2.0 403 Invalid Phone Number – нет такого направления
SIP/2.0 403 No Money Left on RFC Account – на счету нет денег для совершения звонка
SIP/2.0 404 Not found – вызываемый абонент не найден, нет такого SIP-номера
SIP/2.0 404 Undefined Reason – неопределенное направление
SIP/2.0 404 Unknown user account – логин и пароль не найдены
SIP/2.0 404 Out of Order – в заявке на маршрутизацию по этому направлению нет ни одного шлюза, проверьте настройку маршрутизации по этому направлению.
SIP/2.0 405 Method Not Allowed – метод не поддерживается, может возникать если пользователь пытается отправлять голосовую почту и т.п.
SIP/2.0 406 No codecs match – неправильная конфигурация кодеков
SIP/2.0 406 Not Acceptable – пользователь не доступен
SIP/2.0 407 Proxy Authentication Required – необходима аутентификация на прокси-сервере
SIP/2.0 408 Request Timeout – время обработки запроса истекло: Абонента не удалось найти за отведенное время
SIP/2.0 408 Login timed out – за отведенное время не получен ответ от сервера на запрос авторизации
SIP/2.0 410 No Route – вариант SIP/2.0 403 Empty Route Set; нет доступа к ресурсу: Ресурс по указанному адресу больше не существует
SIP/2.0 413 Request Entity Too Large – размер запроса слишком велик для обработки на сервере
SIP/2.0 415 No Media – звонок совершается неподдерживаемым кодеком
SIP/2.0 416 Unsupported Scheme – сервер не может обработать запрос из-за того, что схема адреса получателя ему непонятна
SIP/2.0 420 Bad extension – неизвестное расширение: Сервер не понял расширение протокола SIP
SIP/2.0 421 Extension Required – в заголовке запроса не указано, какое расширение сервер должен применить для его обработки
SIP/2.0 423 Interval Too Brief – сервер отклоняет запрос, так как время действия ресурса короткое
SIP/2.0 480 Invalid Phone Number – неправильный номер телефона, не соответствует к-во цифр или неправильный код страны или города
SIP/2.0 480 Destination Not Found In Client Plan – направления нет в тарифном плане абонента
SIP/2.0 480 Wrong DB Response – проблемы с центральной базой сети
SIP/2.0 480 DB Timeout – проблемы с центральной базой сети
SIP/2.0 480 Database Error – проблемы с центральной базой сети
SIP/2.0 480 Codec Mismatch – несоответствие кодеков
SIP/2.0 480 No Money Left on RFC Account – нет денег на счету, обратитесь к администратору сети!!!
SIP/2.0 480 Empty Route Set – пустое направление, нет принемающих шлюзов
SIP/2.0 480 No money left – недостаточно денег на счете
SIP/2.0 480 Temporarily Unavailable – временно недоступное направление попробуйте позвонить позже
SIP/2.0 481 Call Leg/Transaction Does Not Exist – действие не выполнено, нормальный ответ при поступлении дублирующего пакета
SIP/2.0 482 Loop Detected – обнаружен замкнутый маршрут передачи запроса
SIP/2.0 483 Too Many Hops – запрос на своем пути прошел через большее число прокси-серверов, чем разрешено
SIP/2.0 484 Address Incomplete – принят запрос с неполным адресом
SIP/2.0 485 Ambiguous – адрес вызываемого пользователя не однозначен
SIP/2.0 486 Busy Here – абонент занят
SIP/2.0 487 Request Terminated – запрос отменен, обычно приходит при отмене вызова
SIP/2.0 488 Codec Mismatch – нет шлюзов с поддержкой заказанного кодека
SIP/2.0 488 Private IP Address – адрес RTP media из сетей RFC1918
SIP/2.0 491 Request Pending – запрос поступил в то время, когда сервер еще не закончил обработку другого запроса, относящегося к тому же диалогу
SIP/2.0 493 Undeciperable – сервер не в состоянии подобрать ключ дешифрования: невозможно декодировать тело S/MIME сообщения
SIP/2.0 499 Codec Mismatch – отсутствует кодек
Sip-ответы могут быть как стандартные, так и не стандартные. Больше ответов можно посмотреть тут. Стоит сказать, что ваш сервер может посылать разные ответы о неверном пароле. Во многих статьях для защиты Asterisk рекомендуют использовать некоторую уловку, приведу пример.
По умолчанию Asterisk выдает одну ошибку о неверном пароле для существующего аккаунта и другую для несуществующего аккаунта. Существует множество программ для подбора паролей, поэтому злоумышленнику не составит труда проверить все короткие номера и собирать пароли лишь к существующим аккаунтам, которые ответили «неверный пароль». Чтобы помешать этому, меняем строчку в файле /etc/asterisk/sip.conf:alwaysauthreject = no на alwaysauthreject = yes и перезапускаем Asterisk. После такой настройки, Asterisk будет отвечать одинаково для любых неверных авторизации “401 Unauthorized” и не сообщать подробностей.
Лично у меня при установленном интерфейсе FreePBX эта опция была включена. Ответ “401 Unauthorized” фигурировал и в удачных подключениях (с правильным логином и паролем), так и в неудачных. Поэтому по нему отловить “левые” подключения были невозможно. Поэтому решением стало выключение этой опции.
И перезапускаем Asterisk для применение настроек.
заходим в консоль asterisk
asterisk -r
перезапускаем asterisk
core restart now
Делаем проброс SIP-порта в Mikrotik:
/ip firewall natadd action=dst-nat chain=dstnat comment=”SIP” disabled=no dst-port=5060 in-interface=ether1-wan protocol=udp src-address-list=udalennie_telefoni to-addresses=10.0.0.150 to-ports=5060
Я не рекомендую использовать стандартный порт, но как пример приведу его. Далее нужно проанализировать пакеты, которые поcылает ваш сервер в ответ на неправильный логин и пароль. Для этого можем использовать программу Wireshark, как ей пользоваться можно почитать тут. После установки программы запускаем ее, выбираем свой сетевой интерфейс, который будем анализировать.
Создаем фильтр для SIP-пакетов, что-бы не анализировать другой мусор.
Выбираем фильтр и запускаем анализ, на запрос сохранить ли вывод в файл – отвечаем отказом.
Далее нам понадобиться SIP-клиент, я выбираю X-Lite. Вводим IP нашего SIP-сервера, заведомо неправильный логин (номер внутреннего телефона) и любой пароль.
Анализируем Wireshark.
Получаем “404 Not found” – отлично, по этому и будем ловить пакеты. Далее вводим в X-Lite правильный логин (регистрационный номер телефона) и неправильный пароль.
Проводим анализ.
Получаем ответ “403 Forbidden (Bad auth)” – его тоже мы будем использовать. Теперь для примера покажу вывод правильной регистрации с верным логином и паролем.
Как видим ответ “401 Unauthorized” попадается и при правильной регистрации. В тоже время текст “403 Forbidden (Bad auth)” и “404 Not found” можно использовать для отслеживания “плохих” подключений. Сам метод описан в статье Защищаем сервер FTP за Mikrotik анализируя пакеты опцией “content”.
/ip firewall filter
add action=drop chain=forward comment=”drop sip brute forcers” dst-port=5060 in-interface=ether1-wan protocol=udp src-address-list=sip_drop
add action=add-src-to-address-list address-list=sip_stage address-list-timeout=1m chain=forward comment=sip_vhod dst-port=5060 in-interface=ether1-wan protocol=udp
add action=add-dst-to-address-list address-list=sip_drop address-list-timeout=10m chain=forward comment=”sip_stage_bad_403 Forbidden (Bad auth)” content=”403 Forbidden (Bad auth)” dst-address-list=sip_stage src-address=10.0.0.150
add action=add-dst-to-address-list address-list=sip_drop address-list-timeout=10m chain=forward comment=”sip_stage_bad_404 Not found” content=”404 Not found” dst-address-list=sip_stage src-address=10.0.0.150
Первым правилом мы блочим доступ с адрес-листа sip_drop на порт 5060. Второе правило добавляет все IP, которые обращаются на порт 5060 на наш роутер в адрес-лист sip_vhod. Третье правило анализирует ответы на адрес-лист sip_vhod от нашего сервера Asterisk, и если ответ содержит “403 Forbidden (Bad auth)” – добавляет IP в адрес-лист sip_drop на 10 минут. Четвертое правило аналогично третьему, только фильтрует пакеты по тексту “404 Not found”. Такими образом злоумышленник, который пытается подключиться к вашему серверу с неправильным логином или паролем будет заблочен на 10 минут. А если вы неправильно ввели пароль (или ваш пользователь), то через 10 минут сможете повторить попытку.