Для защиты 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 минут сможете повторить попытку.