Настройка firewall для asterisk
Netfilter — штатный файрвол linux, а iptables — интструмент, используемый для его настройки. Netfilter включает в себя 4 таблицы — raw, filter, mangle и nat. Все правила, которые будут описаны в этой статье, относятся к таблице filter, т.к. решение о том, будет пакет пропущен или нет, следует принимать в ней.
По умолчанию, в таблицу filter входят цепочки INPUT, FORWARD и OUTPUT. Цепочку INPUT проходят пакеты, адресованные самому хосту, FORWARD — пакеты, адресованные другому хосту, OUTPUT — пакеты, отправляемые хостом. В дополнение к основным цепочкам пользователь может создавать свои цепочки с произвольными названиями.
Цепочки состоят из правил, в которых могут производиться проверки определенных параметров пакета ( например адрес отправления, протокол, порт назначения и т.д.), если проверяемые параметры пакета удовлетворяют правилу, к пакету применяется действие, описанное в правиле (ACCEPT — пропустить, DROP — сбросить пакет, REJECT — сбросить пакет и проинформировать об этом отправителя).
Каждый пакет проходит правила цепочки по порядку, пока не найдется правило, по которому пакет будет пропущен или сброшен. Если ни одно правило основной цепочки не подходит, то к пакету применяется политика цепочки. По умолчанию, политика всех цепочек таблицы filter равна ACCEPT, это означает, что пакеты, не подходящие ни к одному правилу, будут пропущены.
Далее рассмотрим настройку правил iptables для хоста Asterisk на конкретном примере.
У хоста Asterisk две сетевые карты:
eth0, IP-адрес — 192.168.1.100, подключение к локальной сети.
eth1, IP-адрес — 11.11.11.11, подключение к сети Интернет.
IP-телефоны находятся в подсетях 192.168.1.0/24 и 192.168.2.0/24, а также подключаются из удаленного офиса с IP-адреса 1.2.3.4. Администратор подключается к станции с IP-адресов 192.168.3.254 и 5.6.7.8. IP-адрес SIP-провайдера — 22.22.22.22.
iptables -N ADMIN
iptables -A ADMIN -s 192.168.3.254 -j ACCEPT
iptables -A ADMIN -s 5.6.7.8 -j ACCEPT
В цепочку PHONES будут направляться пакеты от IP-телефонов.
iptables -N PHONES
iptables -A PHONES -s 192.168.1.0/24 -j ACCEPT
iptables -A PHONES -s 192.168.2.0/24 -j ACCEPT
iptables -A PHONES -s 1.2.3.4 -j ACCEPT
В цепочку SIP будет направляться SIP и RTP трафик.
iptables -N SIP
iptables -A SIP -j PHONES
iptables -A SIP -s 22.22.22.22 -j ACCEPT
Теперь напишем правила для цепочки INPUT.
Данное правило разрывает TCP-соединение с отправкой RST-пакета, если первым пакетом в этом соединении был SYN-ACK. Подобное поведение файрвола не позволит злоумышленникам использовать IP-адрес хоста в атаках с использованием IP спуфинга.
iptables -A INPUT -p tcp -m state —state NEW —tcp-flags SYN,ACK SYN,ACK -j REJECT —reject-with tcp-reset
Сбрасываем первый пакет TCP-соединения, если он не является SYN-пакетом.
iptables -A INPUT -p tcp -m state —state NEW! —syn -j DROP
Принимаем пакеты в состоянии RELATED и ESTABLISHED, сбрасываем пакеты в состоянии INVALID.
iptables -A INPUT -m state —state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state —state INVALID -j DROP
Принимаем весь трафик с локального интерфейса
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport —dport 80,443 -j ADMIN
iptables -A INPUT -p tcp —dport 22 -j ADMIN
Принимаем SIP и RTP трафик с IP-адресов провайдера и IP-телефонов.
( в нашем случае, диапазон портов для RTP трафика — 10000-20000)
iptables -A INPUT -p udp -m multiport —dport 5060,10000-20000 -j SIP
Принимаем TFTP-запросы от телефонов.
(TFTP -сервер часто используется при провижининге IP-телефонов)
iptables -A INPUT -p udp —dport 69 -j PHONES
Принимаем NTP-запросы от телефонов.
( в нашем случае IP-телефоны будут синхронизировать время со станцией)
iptables -A INPUT -p udp —dport 123 -j PHONES
Принимаем ICMP-пакеты типа 3, код 4 ( необходима фрагментация, но установлен флаг DF) — это необходимо для работы механизма «Path MTU Discovery».
iptables -A INPUT -p icmp —icmp-type fragmentation-needed -j ACCEPT
Принимаем ICMP-пакеты типа 11 (TTL пакета истекло)
iptables -A INPUT -p icmp —icmp-type time-exceeded -j ACCEPT
Принимаем ICMP-пакеты типа 8 ( эхо-запрос, пинг). Для предотвращения пинг флада будем пропускать 10 пакетов в секунду
iptables -A INPUT -p icmp —icmp-type echo-request -m limit —limit 10/sec -j ACCEPT
Все остальные пакеты можно сбрасывать, ставим политику цепочки INPUT в DROP
iptables -P INPUT DROP
Политику цепочки FORWARD тоже можно, на всякий случай, установить в DROP, т.к. хост не будет выступать в роли маршрутизатора.
iptables -P FORWARD DROP
Цепочку OUTPUT можно не трогать, но можно и запретить в ней отправку пакетов на определенные IP-адреса, если это требуется.
Если на хосте включен протокол IPv6, но его использование не планируется, следует запретить весь IPv6 трафик с помощью утилиты ip6tables.
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP
Ниже приведен скрипт целиком, для изменения настроек iptables можно просто вносить изменения в этот скрипт и запускать его.
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
$IP6TABLES -P INPUT DROP
$IP6TABLES -P FORWARD DROP
$IP6TABLES -P OUTPUT DROP
$IPTABLES -F
$IPTABLES -X ADMIN 2>/dev/null
$IPTABLES -X PHONES 2>/dev/null
$IPTABLES -X SIP 2>/dev/null
$IPTABLES -N ADMIN
$IPTABLES -A ADMIN -s 192.168.3.254 -j ACCEPT
$IPTABLES -A ADMIN -s 5.6.7.8 -j ACCEPT
$IPTABLES -N PHONES
$IPTABLES -A PHONES -s 192.168.1.0/24 -j ACCEPT
$IPTABLES -A PHONES -s 192.168.2.0/24 -j ACCEPT
$IPTABLES -A PHONES -s 1.2.3.4 -j ACCEPT
$IPTABLES -N SIP
$IPTABLES -A SIP -j PHONES
$IPTABLES -A SIP -s 22.22.22.22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state —state NEW —tcp-flags SYN,ACK SYN,ACK -j REJECT —reject-with tcp-reset
$IPTABLES -A INPUT -p tcp -m state —state NEW! —syn -j DROP
$IPTABLES -A INPUT -m state —state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -m state —state INVALID -j DROP
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -p tcp -m multiport —dport 80,443 -j ADMIN
$IPTABLES -A INPUT -p tcp —dport 22 -j ADMIN
$IPTABLES -A INPUT -p udp -m multiport —dport 5060,10000-20000 -j SIP
$IPTABLES -A INPUT -p udp —dport 69 -j PHONES
$IPTABLES -A INPUT -p udp —dport 123 -j PHONES
$IPTABLES -A INPUT -p icmp —icmp-type fragmentation-needed -j ACCEPT
$IPTABLES -A INPUT -p icmp —icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp —icmp-type echo-request -m limit —limit 10/sec -j ACCEPT
$IPTABLES -P INPUT DROP
Примечание: Правильно настроенный файрвол не является гарантией безопасности IP-АТС. Рекомендуется еще установка программы Fail2Ban для устранения возможности длительного подбора паролей.
Познакомьтесь с возможностями Asterisk. Найдите инструменты, которые помогут вашей компании развиваться.
Если у вас нет звука, нет звука в одну сторону, нет слышимости, прочтите внимательно эту инструкцию.
Правила для Asterisk
Рассмотрим правила для SIP , RTP , IAX , AMI
Если вы используете TCP:
iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT – это правило разрешает инициацию SIP подключений к вашему серверу Asterisk от удаленных пользователей или провайдера.
Если у вас нет удаленных пользователей, а например только sip транк от провайдера, хорошая идея разрешить доступ только с определенных ip адресов или сетей.
Первое правило разрешает соединение только с адреса 123.123.123.123, второе только с адреса 125.125.125.125. Третье из сети 192.168.0.XXX для ваших локальных абонентов.
iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT – Разрешает подключения по протоколу IAX . В отличие от SIP для инициации соединения и для голосовых пакетов RTP используется один и тот же порт.
iptables -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT – Разрешает подключения к Asterisk Manager Interface.
Сохраним новые правила
в debian и ubuntu добавили пакет iptables-persistent который использует iptables-save/iptables-restore.
Установка:
apt-get install iptables-persistent
Использование:
/etc/init.d/iptables-persistent
или
/usr/sbin/netfilter-persistent
Фильтрация по именам сканеров
Типовой пример настройки iptables для asterisk
Типовой пример настройки iptables для asterisk
rtp.conf
Задает первый порт диапазона для приема и оправки голосовых пакетов RTP .
Задает последний порт диапазона для приема и оправки голосовых пакетов RTP .
В Asterisk начиная с версии 11 появилась поддержка stun. icesupport должно быть включено.
В данной статье приведены примеры рабочей конфигурации драйвера канала PjSIP, когда Asterisk находится за NAT (Network Address Translation). Asterisk подключается через NAT к провайдеру IP телефонии (ITCP).
Устройства используемые в примере:
Для наглядности, в примере использованы фальшивые детали:
pjsip.conf конфигурация
Подразумевается, что вы ознакомились со статьей о конфигурации Asterisk pjsip.conf и имеете основные представления о работе Asterisk. Для этого примера, важно отметить опции - local_net, external_media_address и external_signaling_address в transport секции и direct_media в endpoint секции. Остальные параметры могут зависеть от конкретной конфигурации, модели телефона, сетевых настроек, специфики провайдера IP телефонии и т.д.
local_net
Диапазон адресов локальной сети.
external_media_address
external_signaling_address
direct_media
Удаленные телефоны за NAT
Выше приведенный пример подразумевает, что телефон находится в локальной сети, так же как и сервер Asterisk.
Но может так статься, что Asterisk расположен на внешнем IP адресе, а удаленные телефоны находятся за NAT , или же и Asterisk, и телефоны расположены за NAT , т.е. имеет место двойной NAT ? В этих случаях пригодятся следующие настройки оконечных точек (ENDPOINTS)
Эта команда разрешит все входящие подключения что позволит нам избежать блокировки нашего соединения, если конфигурирование производится через ssh.
Данная команда сбросит все текущие правила по умолчанию и применит только созданное нами правило.
Это простое правило разрешает все подключения на адаптер loopback. Интерфейс loopback определяется системой как lo и по умолчанию имеет адрес 127.0.0.1 Команда -А добавляет новое правило в конец заданной цепочки INPUT. Опция -i вместе именем интерфейса lo разрешает все виды трафика через заданный интерфейс. Опция -j указывает на цель данного правила ACCEPT, принять все подключения.
Некоторые части этого правила уже вам знакомы. Далее присутствует опция -m которая используется для загрузки модуля state. Модуль state проверяет состояние пакета и определяет является ли он новым-NEW, уже созданным-ESTABLISHED или новым, но связанным-RELATED с уже установленным соединением. Состояние ESTABLISHED указывает на то, что пакет принадлежит уже установленному соединению через которое пакеты идут в обоих направлениях. Признак NEW подразумевает, что пакет открывает новое соединение или пакет принадлежит однонаправленному потоку. Признак RELATED указывает на то что пакет принадлежит уже существующему соединению, но при этом он открывает новое соединение.
Это правило добавляется к цепочке INPUT и говорит, что все пакеты, приходящие по протоколу TCP (-p tcp), на порт 22 (–dport 22), должны быть приняты(-j ACCEPT). Используется для подключения по ssh c портом по умолчанию.
Если вам требуется открыть доступ к веб серверу цепочка будет выглядеть также, за исключением номера порта.
Хочу заметить, что php приложения являются очень уязвимым местом часто используемым для взлома Asterisk.
Помните, первое правило? Когда мы устанавливаем политику по умолчанию для входных цепей принять? Это правило меняет политику по умолчанию для входных цепочек обратно в DROP, что и требуется, если вы хотите на самом деле блокировать трафик поступающий на ваш сервер.
Запретим маршрутизацию трафика
Разрешим весь исходящий трафик.
Сохраним созданные правила.
Проброс порта (forward) на другой компьютер в локальной сети
Включим поддержку форвардига для протокола ipv4 в файле /etc/sysctl.conf
Пример для порта 80 TCP:
Reinvite
Первый абонент запрашивает соединение у второго , сообщая свой IP адрес. Второй отвечает, сообщая свой IP. Голосовые пакеты направляются напрямую абонентам, минуя SIP сервер. Передача голосовых пакетов напрямую абонентам, минуя Asterisk, называется RE-INVITE или Native Bridge.
Разрешить ping с определенного источника
Разрешить входящий ICMP трафик с указанного ip или подсети.
Разрешить исходящий ICMP трафик на указанный ip или подсеть.
Основные параметры конфигурации NAT для Asterisk
SIP клиенты и Asterisk за NAT
Чтобы избежать потери звука запретите re-invite в файле sip.conf
Опция canreinvite устарела. Используйте 'directmedia'.
По умолчанию задан диапазон от 10000 до 20000. Измените диапазон в соответсвии с вашими потребностями (3 порта на каждый конкурирующий вызов).
Где eth0 - внешний интерфейс, а 192.168.1.10 - IP адрес Asterisk.
Клиент за NAT
В простейшей ситуации SIP клиент находясь за NAT , обращается к внешнему интерфейсу Asterisk. SIP клиент при регистрации на сервере создает запись в таблице трансляций, которая сохраняется, пока проходит хотя бы один пакет в минуту. В файле sip.conf требуется определить параметры сети и свойства удаленного пира.
Начиная с версии Asterisk 11: 'nat=yes' устарело, используйте 'nat=force_rport,comedia'
nat=force_rport,comedia
При такой конфигурации Asterisk использует внешний IP адрес externip для вызовов клиентов с параметром nat=yes . Дополнительно параметр qualify=yes поддерживает соединение, не позволяя удалять запись из таблицы трансляций.
Проброс с одного порта на другой
Разрешим форвардинг между интерфейсами:
Перепишем запрос на порт 8080 внешнего интерфейса,
на адрес и порт компьютера в локальной сети: 192.168.0.2:80.
Перенаправим запрос c внешнего интерфейса enp5s2 на внутренний интерфейс enp4s0.
На веб интерфейсе астериска есть довольно простой инструмент для настройки фаервола для нашей ай-пи телефонии, он подходит для тех кто не особо знаком с iptables linux и позволяет настроить доступа к серверу прямо с веб интерфейса. Для этого проверяем есть ли соответствующий модуль: Если его нет то устанавливаем.После установки появляется соответствующее меню : Смотрим, что […]
На веб интерфейсе астериска есть довольно простой инструмент для настройки фаервола для нашей ай-пи телефонии, он подходит для тех кто не особо знаком с iptables linux и позволяет настроить доступа к серверу прямо с веб интерфейса.
Для этого проверяем есть ли соответствующий модуль:
Если его нет то устанавливаем.
После установки появляется соответствующее меню :
Смотрим, что сейчас firewall у нас пустой командой iptables -L –nv
Далее включаем фаервол
И переходим к следующей вкладке Responsive Firewall.
Отключаем тут всё, эти настройки позволяют ограниченное количество раз зарегистрироваться устройствам, которые бы при обычном сценарии сразу бы разблокировало.
Но если включено и попытка регистрации успешна, то удаленный ip затем добавляется в доверенную зону, у которой есть разрешение на использование этого протокола, и ему дополнительно предоставляется доступ к UCP.
Обратите внимание, что если вы явно предоставили доступ к протоколу внешним соединениям, эта фильтрация и ограничение доступа не будут использоваться. Это используется только тогда, когда входящее соединение обычно блокируется.
Следующая вкладка Interface. Тут всё просто: указываете какой интерфейс у вас смотрит во внутреннюю сеть, а какой в интернет, если такой имеется.
В данном случае у меня интерфейс один и он смотрит в роутер, так что ставим ему политику фаервола для доступа в интернет.
Следующая вкладка networks — она позволяет настроить политики доступа более избирательно, чем на интерфейсах (если он у вас один и нет возможности разграничить там).
Тут можно назначать политики безопасности для отдельных адресов и целых подсетей.
В данном скриншоте для адреса 192.168.32.13 разрешены любые действия и подключение с этого адреса вообще не попадает под правила фаервола.
А подесть 192.168.55.0/24(или более привычный вариант 192.168.55.0/255.255.255.0) является локальной. Например, из неё могут подключатся телефоны более детально эти политики настраиваются на вкладке services
Фактически сервисы здесь — это связка порт-протокол, которые разрешаются для политик.
Во вкладке Custom Services можно сделать свою собственную связку
И вкладка Blacklist в которой можно принудительно забанить определённые адреса:
По умолчанию, с не настроенным firewall и открытым портом 5060, возможно подключение любого удалённого абонента на АТС, если он знает IP-адрес и логин/пароль внутреннего номера. Часто этим пользуются злоумышленники, подбирая различные адреса и данные для подключения.
Удалённое подключение
В данной статье будет рассмотрена возможность защиты АТС с тем условием, что большинство абонентов, регистрирующихся на ней, являются удалёнными.
Задача:
На АТС имеется внутренний номер 101 с лёгким паролем (101). Этот внутренний номер закреплён за удалённым сотрудником, который подключается с динамического IP-адреса. Необходимо с помощью iptables разрешить подключения удалённых сотрудников на доменное имя. Остальные подключения (кроме локальных) не пропускать.
Реализация:
Для начала создадим цепочку PHONES:
В цепочке PHONES пропишем локальную подсеть. Делаем это для того, чтобы телефоны, находящиеся в одной сети с сервером телефонии Asterisk, подключались без каких-либо проблем.
Подробно рассмотрим прописанные команды.
Создаём цепочку CHECKDOMAIN. Включаем цепочку PHONES в CHECKDOMAIN. Разрешаем подключения по порту 5060 для указанного доменного имени и для IP-адреса оператора связи. Остальные подключения не должны проходить.
Далее добавим правила, которые будут парсить пакеты REGISTER и INVITE, проходящие по порту 5060. Для этого введём в консоли:
После применения правил проверим подключения на АТС. Для тестирования воспользуемся удалённым телефоном или софтфоном (в примере используем софтфон на android). Попробуем зарегистрировать внутренний номер на АТС, используя доменное имя.
Наряду со стандартным пробросом порта 5060 сделаем проброс нестандартного порта (в примере 50600).
Проброс нестандартного порта
После того, как сделали проброс, вернёмся на АТС и произведём правки в iptables под текущую задачу. Для этого добавим в цепочку PHONES статические IP-адреса, с которых разрешена регистрация на АТС. Остальные внешние подключения будем производить на доменное имя + нестандартный порт. Соответственно, если IP-адреса нет в белом листе, и он не регистрируется на доменное имя + нестандартный порт, регистрация с него проходить на АТС не будет.
Приступим к проверке. Зарегистрируем 2 софтфона: один из на доменное имя + порт 50600, а другой на внешний IP-адрес АТС (до этого IP-адрес устройства внесён в белый лист). В нашем примере зарегистрируем внутренний номер 101 на доменное имя, а 201 на внешний IP-адрес АТС. При корректно выполненной настройке регистрация обоих устройств на АТС пройдёт. Однако если мы попробуем зарегистрировать первое устройство на внешний IP-адрес АТС, его регистрация отобьётся.
Успешная регистрация
В данной статье была решена задача по защите абонентов с динамическим IP-адресом на АТС.
sip.conf
Поддержка NAT в Asterisk 12
localnet
параметр 'localnet' список сетевых адресов, которые считаются «внутренними».
externaddr
externhost
«externhost = hostname[:port]» то же что и «externaddr» только это 'hostname' обновляемое через «externrefresh» секунд (по умолчанию 10сек.).
настройки могут совмещаться:
Установка force_rport принуждает Asterisk всегда передавать ответы обратно на адрес / порт, с которых он получил запросы, даже если другая сторона не поддерживает добавления параметра 'rport'.
media_address
icesupport
directmedia
устаревшие настройки sip.conf
bindaddr= IP адрес Asterisk, если указано 0.0.0.0, то любой адрес.
externip= Этот параметр задается в секции [general] файла sip.conf и указывает внешний IP адрес, или имя хоста на вашем устройстве NAT .
Этот адрес будет использован для общения с устройствами с установленным параметром nat=force_rport.
localnet= Этот параметр задается в секции [general] файла sip.conf и указывает на локальную сеть и используется для обращения к устройствам с параметром nat=no.
Начиная с версии Asterisk 11: nat=yes is deprecated, use nat=force_rport,comedia instead
nat = auto_force_rport - установить 'force_rport' параметр если Asterisk обнаружил NAT (по умолчанию)
directmedia
qualify= Эта опция имеет два назначения.Первое - поддерживать запись в таблице трансляций NAT и контролировать регистрацию телефона.
Этот параметр задает проверку по умолчанию каждые 2 секунды.
Это выключает проверку.
Включает проверку через заданное время в 300 ms.
Читайте также: