Иногда нужно выбросить наружу SIP-порт для клиентов, которые подключаются к вашей IP-телефонии. Открытый SIP-порт, особенно стандартный (5060 UDP), очень уязвим и рано или поздно вас начнут взламывать, подбирать пароли и т.д. Это чревато не только возможностью угадать пароль, но и нагрузкой на ваш сервер телефонии и интернет-канал. Есть несколько рекомендаций для защиты.
Общая рекомендация - не использовать стандартный порт. В дополнение, на стандарнтый порт можно повесить ловушку:
/ip firewall filter add action=add-src-to-address-list address-list=sip_drop address-list-timeout=30m chain=input comment=sip_add_list dst-port=5060 in-interface=ether1-wan log=yes log-prefix=Sip-Attack protocol=udp add action=drop chain=input comment=sip_list_drop in-interface=ether1-wan src-address-list=sip_drop
Когда кто-то попытается подключиться на стандартный порт, который вы не используете - он попадает в блэк-лист на 30 минут. Простая, но эффективная уловка.
Иногда, стандартный порт менять нельзя - это связанно с тем ,что некоторые sip-клиенты не хотят или не могут работать с другим портом (например, ограничение бесплатной версии) - тогда возможно выбросить наружу порт, но ограничить его проброс по подсетям.
/ip firewall nat add 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
Как видим правило действует только для внешних IP, которые занесенны в адрес-лист udalennie_telefoni. Но и это тоже не всегда возможно - иногда внешние клиенты просто не имеют реального статического адреса. В таком случае можно ограничить действие правила по всей подсети того провайдера, IP-адреса которого использует клиент.
Довольно часто клиенты хотят пользоваться SIP-телефонией когда находятся в командировках - тут помогает поднятый VPN (например с Android-телефона). А уже внутри VPN клиент без проблем может подключиться к вашему серверу телефонии. В таком случае даже пробрасывать порт не нужно. Хотя сам по себе метод с VPN с Android довольно не удобный. Так же, для подключения с таких мест можно пользоваться методом Port Knocking. Когда определенной последовательностью пакетов на роутер вы открываете порт для вашего IP. Сейчас довольно много программ (в т.ч. и для Android), которые позволяют это реализовать.
Ну и в самый последний случай, вы можете открыть наружу стандартный порт, но прописав определенные ограничения, которые помогут вам защитить его.
Данный метод основан на том, что ваш легитимный клиент при подключении передает логин и пароль и подключение происходит успешно. Если же злоумышленник пытается подобрать ваш пароль, то он будет пробовать подключатся снова и снова с новыми данными - тут то мы его и ловим. Если в течении 15 секунд sip-клиент не успел зарегистрироваться и отправил неверные данные входа - при следующем обращении он банится на 1 день. Регистрация происходит не дольше 2 секунд, поэтому все "ваши клиенты" будут зарегистрированы без проблем и смогут спокойно пользоваться телефонией. Данный метод может плохо отрабатывать, когда с одного IP будет регистрироваться большое количество устройств (например 10-20 телефонов). Но, вполне логично, если есть такой удаленный обьект смысла использовать данный метод нет, проще прокинуть VPN.
В дополнение хочу сказать, начиная с версии 6.38.1 ввели таймаут для sip-соединений:
*) winbox - allow to specify "sip-timeout" under ip firewall service-ports;
Теперь сервис SIP ALG (IP > Firewall Service Ports), у которого стоял таймаут для sip-соединений 60 минут, можно не отключать. Это была общая рекомендация, что-бы не возникало проблем в работе удаленных подключений к серверу телефонии. Например, отвал интернета, переключение на резервный канал приводили к зависанию соединения на 1 час, и телефон не мог регистрироваться. Теперь возможно поставить таймаут хоть 1 минуту, что существенно скажется на работе этой функции в положительную сторону.