Настройка firewall для asterisk

Обновлено: 04.07.2024

Настройка IP Tables для сервера IP телефонии Asterisk на CentOS7

Данная заметка предназначена для последующей корректной настройки сервера IP телефонии на базе CentOS 7 с использованием модуля Asterisk, этому будет посвящена отдельная статья.

Далее перейдем непосредственно к конфигурированию IP Tables, просмотрев все текущие правила:

Настройка общих правил IP Tables

Создаем новое правило:

Теперь перейдем к настройке интерфейсов:

Этим правилом мы разрешаем все подключения на localhost (адаптер lo / loopback).

Комментарий к выполненной команде:

-А добавляет правило в конец заданной цепочки

-i перед интерфейсом lo разрешает на него все виды трафика

-j указывает роль данного правила, т.е. принять все подключения

Далее командой (указана ниже) выполним настройку правил для пакетов:

Опция -m используется для загрузки модуля state. Модуль state в свою очередь проверяет состояние пакета и определяет является ли он новым-NEW, уже созданным-ESTABLISHED или новым, но связанным-RELATED с уже установленным соединением. Состояние ESTABLISHED указывает на то, что пакет принадлежит уже установленному соединению через которое пакеты идут в обоих направлениях. Признак NEW подразумевает, что пакет открывает новое соединение или пакет принадлежит однонаправленному потоку. Признак RELATED указывает на то что пакет принадлежит уже существующему соединению, но при этом он открывает новое соединение.

Сделаем правильно для порта 22, используемого по умолчанию для SSH:

Для открытия порта 80, т.е. для доступа к веб-серверу необходимо сделать следующее правило:

Изменяет наше первое правило для входящих цепей (подключений/пакетов), таким образом трафик блокируется на все входящие подключения. Заранее мы оставили только 80 и 22 порты открытыми.

Далее (по очереди) убираем маршрутизацию трафика и разрешаем весь исходящий:

Настройка правил IP Tables для Astersik

Следующим списком команд откроем доступ для портов 5060, 4569, 5038 (Asterisk Manager Interface) и 10000:20000, т.е. для SIP, IAX, AMI, RTP:

Настройка IP Tables на CentOS 7 для сервера IP телефонии Asterisk завершена. Следите за обновлениями блога!

Нашли ошибку в тексте? Выделите фрагмент текста и нажмите Ctrl+Enter

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 спуфинга.

Сбрасываем первый пакет TCP-соединения, если он не является SYN-пакетом.

Принимаем пакеты в состоянии RELATED и ESTABLISHED, сбрасываем пакеты в состоянии INVALID.

Принимаем весь трафик с локального интерфейса

iptables -A INPUT -i lo -j ACCEPT

Принимаем SIP и RTP трафик с IP-адресов провайдера и IP-телефонов.
( в нашем случае, диапазон портов для RTP трафика — 10000-20000)

Принимаем TFTP-запросы от телефонов.
(TFTP -сервер часто используется при провижининге IP-телефонов)

Принимаем NTP-запросы от телефонов.
( в нашем случае IP-телефоны будут синхронизировать время со станцией)

Принимаем ICMP-пакеты типа 3, код 4 ( необходима фрагментация, но установлен флаг DF) — это необходимо для работы механизма «Path MTU Discovery».

Принимаем ICMP-пакеты типа 11 (TTL пакета истекло)

Принимаем ICMP-пакеты типа 8 ( эхо-запрос, пинг). Для предотвращения пинг флада будем пропускать 10 пакетов в секунду

Все остальные пакеты можно сбрасывать, ставим политику цепочки 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 -P INPUT DROP

Примечание: Правильно настроенный файрвол не является гарантией безопасности IP-АТС. Рекомендуется еще установка программы Fail2Ban для устранения возможности длительного подбора паролей.

Для того, чтобы успешно работать в связке с fail2ban, iptables предварительно должен быть правильно настроен. Asterisk использует разные протоколы для разных целей (например, SIP для авторизации пользователей и инициирования сеансов связи, RTP для передачи голоса, IAX для связи с другими серверами, и т.д.). Для каждого из протоколов должно быть предусмотрено отдельное правило (или несколько правил) в настройках iptables.

С чего начать: просмотр настроенных правил iptables

Для просмотра имеющихся (уже настроенных) правил запустите команду:
iptables -L -n

Если у Вас не высвечивается никаких правил, то рекомендуется предварительно настроить политику iptables (например, правила для ssh доступа, web-сервера если он есть, и т.д.), после чего уже настраивать правила iptbales для asterisk.

Настройка из командной строки

Для работы по SIP протоколу (порт UDP 5060) выполните команду:
iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
если у Вас asterisk работает на другом порту или Вы используете протокол TCP вместо UDP, исправьте команду соответствующим образом.

Для работы по RTP протоколу (голосовой поток, по умолчанию порты UDP с 10000 по 20000) выполните команду:
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
В случае, если Вы ограничили в настройках asterisk диапазон портов (или полностью его сменили) не забудьте отразить это в правиле iptables!

Если Вы настроили соединение по IAX (точнее, IAX2) между двумя серверами asterisk (либо клиенты / пиры подключаются к астериску по IAX), не забудьте про правило для IAX в iptables:
iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT

Если у Вас настроен asterisk AMI (Asterisk Manager Interface), то добавьте следующее правило:
iptables -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT

Теперь желательно сохранить введенные Вами правила, чтобы их можно было включить после перезагрузки. Для этого используйте команду:
iptables-save > имя-файла-с-конфигурацией-iptables
например:
iptables-save > /etc/network/iptables-rules.conf

После чего в любой момент (например, после перезагрузки компьютера) Вы сможете восстановить правила командой:
iptables-restore < имя-файла-с-конфигурацией-iptables
например:
iptables-restore < /etc/network/iptables-rules.conf

Настройка через конфигурационные файлы

В операционной системе RHEL / CentOS уже предусмотрены конфигурационные файлы для iptables, они находятся здесь: /etc/sysconfig/iptables. Для IPv6 это будет: /etc/sysconfig/ip6tables.

Для Debian по умолчанию конфигурационных файлов не предусмотрено, как один из вариантов решения этой проблемы можно установить пакет iptables-persistent:
apt install iptables-persistent
После установки пакета можно сохранить правила в файл с конфигурацией:
iptables-save > /etc/iptables/rules.v4
для IPv6 это будет:
ip6tables-save > /etc/iptables/rules.v6

В соответствующий конфигурационный файл добавьте следующие строки (обязательно ДО строки COMMIT !):

После сохранения файла необходимо перезагрузить демон iptables.
Для CentOS это просто:
service iptables restart
для Debian:
/etc/init.d/iptables-persistent restart

Если сервис успешно стартует, то правила применились. В случае ошибки в правилах сервис выдаст ошибку при запуске.

Эта команда разрешит все входящие подключения что позволит нам избежать блокировки нашего соединения, если конфигурирование производится через 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, что и требуется, если вы хотите на самом деле блокировать трафик поступающий на ваш сервер.

Запретим маршрутизацию трафика

Разрешим весь исходящий трафик.

Сохраним созданные правила.

Правила для 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

Разрешить ping с определенного источника

Разрешить входящий ICMP трафик с указанного ip или подсети.

Разрешить исходящий ICMP трафик на указанный ip или подсеть.

Проброс порта (forward) на другой компьютер в локальной сети

Включим поддержку форвардига для протокола ipv4 в файле /etc/sysctl.conf

Пример для порта 80 TCP:

Проброс с одного порта на другой

Разрешим форвардинг между интерфейсами:

Перепишем запрос на порт 8080 внешнего интерфейса,
на адрес и порт компьютера в локальной сети: 192.168.0.2:80.

Перенаправим запрос c внешнего интерфейса enp5s2 на внутренний интерфейс enp4s0.

Самый быстрый способ установить Asterisk + FreePBX — использовать ISO-образ FreePBX Distro. Но мы рассмотрим установку данной сборки на Linux CentOS 8 «с нуля».

Подготовка системы

Для корректной работы сервера необходимо настроить системное время, открыть порты в брандмауэре и отключить SELinux. Также мы установим несколько пакетов и создадим учетную запись, от которой будет работать Asterisk.

1. Время

Задаем часовой пояс:

timedatectl set-timezone Europe/Moscow

* в данном примере московское время. Список всех зон можно посмотреть командой timedatectl list-timezones.

Устанавливаем сервис для синхронизации времени:

yum install chrony

И запускаем его с разрешением автозапуска:

systemctl enable chronyd --now

2. Настройка firewall

Мы должны открыть порты:

В CentOS для управления брандмауэром может использоваться firewalld или iptables. Рассмотрим настройку и того, и другого.

Firewalld

Разрешаем порты для работы asterisk:

firewall-cmd --permanent --add-port=/

. и веб-сервера NGINX:

firewall-cmd --permanent --add-service=

Для применения настроек перезапускаем правила:

Iptables

Открываем порты для астериска и веб-сервера:

iptables -I INPUT -p tcp --match multiport --dports 5060,5061 -j ACCEPT

iptables -I INPUT -p udp --match multiport --dports 5060,5061 -j ACCEPT

iptables -I INPUT -p tcp --match multiport --dports 80,443 -j ACCEPT

iptables -I INPUT -p udp --match multiport --dports 80,443 -j ACCEPT

Для сохранения правил установим:

yum install iptables-services

И разрешим автозапуск сервиса:

systemctl enable iptables

Теперь сохраняем сами правила:

service iptables save

* правила будут сохранены в файл /etc/sysconfig/iptables.

3. Отключение SELinux

Для отключения SELinux вводим две команды:

4. Установка пакетов

Выполним установку пакетов:

dnf install wget tar glibc-langpack-ru

  • wget — утилита для загрузки файлов по сети.
  • tar — для распаковки архивов.
  • glibc-langpack-ru — русская локаль. Она нужна, чтобы у нас была возможность выбрать русский интерфейс во FreePBX.

5. Создание пользователя

Нам нужен общий пользователь, от которого будет работать Asterisk и веб-сервер. Это необходимо, чтобы веб-сервер имел доступ к каталогам астериска.

Создаем пользователя командой:

useradd asterisk -m

Настройка веб-сервера

Для работы FreePBX нам необходим веб-сервер и СУБД. В нашем примере мы установим связку NGINX + PHP + MariaDB + NodeJS.

Сервер баз данных

Устанавливаем сервер mariadb:

dnf install mariadb-server

Стартуем сервис и разрешаем его автозапуск:

systemctl enable mariadb --now

Задаем пароль для суперпользователя СУБД:

mysqladmin -u root password

NGINX

Для установки веб-сервера вводим команду:

dnf install nginx

Открываем конфигурационный файл:

* данный параметр разрешает загрузку файлов размером 128 Мб.

systemctl enable nginx --now

Стартовая страница NGINX

PHP и компоненты

Установим интерпретатор php и компоненты, необходимые для работы FreePBX:

dnf install php php-fpm php-bcmath php-gd php-json php-mbstring php-mysqlnd php-pear php-snmp php-zip

В процессе установки php на CentOS устанавливается apache, но нам он не нужен — вводим команду для запрета его автозапуска:

Открываем настройки для php:

Правим значения для следующих опций:

upload_max_filesize = 128M
.
post_max_size = 128M
.
date.timezone = "Europe/Moscow"
.
memory_limit = 512M

  • upload_max_filesize — максимальный объем загружаемого файла.
  • post_max_size — максимальный объем всех загружаемых файлов за один раз.
  • date.timezone — временная зона.
  • memory_limit — максимальный объем памяти, который может использовать интерпретатор.

Открываем настройки php-fpm:

Задаем значения для следующих опций:

user = asterisk
.
group = asterisk
.
listen.acl_users = asterisk,apache,nginx

* FreePBX должен работать с файлами в каталоге /etc/asterisk. Владельцем этого каталога будет пользователь asterisk, поэтому обработка php должна выполняться тоже от данного пользователя, чтобы иметь соответствующие права на редактирование конфигурационных файлов.

systemctl enable php-fpm --now

NGINX + PHP

Свяжем наш веб-сервер с php. Для этого откроем конфигурационный файл:

* в данном примере мы задаем настройку для server_name — указываем имя хоста или IP-адрес, по которому мы будем подключаться к FreePBX. Также мы создаем секцию location для обработки php через php-fpm.

systemctl reload nginx

Создадим файл php в домашней директории nginx:

Информационная страница phpinfo

NodeJS

Последний компонент для нашего веб-сервера — NodeJS. Для его установки выполняем команду:

dnf install nodejs

Убедиться в установке можно командой просмотра версии:

Наш веб-сервер готов к работе.

Установка Asterisk

Мы будем устанавливать 16-ю версию Asterisk. На странице загрузки мы можем посмотреть все версии АТС и ссылки на них.

Сначала установим пакеты, необходимые для сборки:

dnf --enablerepo=powertools install libedit-devel

После скачиваем Asterisk:

Распаковываем архив и переходим в него:

tar -xvf asterisk-*.tar.gz

Устанавливаем зависимости для астериска:

Мы должны увидеть:

Чистим временные файлы, которые появились после установки зависимостей:

Добавляем библиотеку для работы с mp3:

* в данном примере мы конфигурируем исходник без дополнительных опций. Полный перечень опций и что они означают можно посмотреть командой ./configure -h.

Мы должны увидеть:

Продолжаем настройку — запускаем меню для выбора параметров:

Можно оставить значения по умолчанию и сохранить настройки.

Теперь можно запустить сборку астериска:

+--------- Asterisk Build Complete ---------+
+ Asterisk has successfully been built, and +
+ can be installed by running: +
+ +
+ make install +
+-------------------------------------------+

После выполняем установку:

+---- Asterisk Installation Complete -------+
+ +
+ YOU MUST READ THE SECURITY DOCUMENT +
+ +
.

Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:

Ранее мы создали пользователя asterisk, от которого должен запуститься наш сервер телефонии. Для этого откроем файл:

Снимаем комментарий с опций:

runuser = asterisk
rungroup = asterisk

. и снимем комментарий с последующим редактированием:

defaultlanguage = ru
documentation_language = ru_RU

Задаем владельца для следующих каталогов:

chown -R asterisk:asterisk /var/run/asterisk

chown -R asterisk:asterisk /etc/asterisk

chown -R asterisk:asterisk /var//asterisk

chown -R asterisk:asterisk /var/log/asterisk

и проверяем настройки:

Мы должны увидеть Asterisk Ready:

Проверка запуска Asterisk

. значит наш сервер готов к запуску. Все ошибки и предупреждения нам не помешают, однако их можно устранить разными способами, как правило, отключив неиспользуемые модули.

Читайте также: