Asterisk + IPTables
В этой статье рассматривается простой пример конфигурации iptables для работы с Asterisk
Проверим установлено ли IPTables
[root@localhost ~]# rpm -q iptables iptables-1.3.5-5.3.el5_4.1
Посмотрим текущие правила используя параметр -L
[root@localhost ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
Настройка общих правил.
Создадим новые правила
# iptables -P INPUT ACCEPT
Эта команда разрешит все входящие подключения что позволит нам избежать блокировки нашего соединения, если конфигурирование производится через ssh.
# iptables -F
Данная команда сбросит все текущие правила по умолчанию и применит только созданное нами правило.
# iptables -A INPUT -i lo -j ACCEPT
Это простое правило разрешает все подключения на адаптер loopback. Интерфейс loopback определяется системой как lo и по умолчанию имеет адрес 127.0.0.1 Команда -А добавляет новое правило в конец заданной цепочки INPUT. Опция -i вместе именем интерфейса lo разрешает все виды трафика через заданный интерфейс. Опция -j указывает на цель данного правила ACCEPT, принять все подключения.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Некоторые части этого правила уже вам знакомы. Далее присутствует опция -m которая используется для загрузки модуля state. Модуль state проверяет состояние пакета и определяет является ли он новым-NEW, уже созданным-ESTABLISHED или новым, но связанным-RELATED с уже установленным соединением. Состояние ESTABLISHED указывает на то, что пакет принадлежит уже установленному соединению через которое пакеты идут в обоих направлениях. Признак NEW подразумевает, что пакет открывает новое соединение или пакет принадлежит однонаправленному потоку. Признак RELATED указывает на то что пакет принадлежит уже существующему соединению, но при этом он открывает новое соединение.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Это правило добавляется к цепочке INPUT и говорит, что все пакеты, приходящие по протоколу TCP (-p tcp), на порт 22 (–dport 22), должны быть приняты(-j ACCEPT). Используется для подключения по ssh c портом по умолчанию.
Если вам требуется открыть доступ к веб серверу цепочка будет выглядеть также, за исключением номера порта.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Хочу заметить, что php приложения являются очень уязвимым местом часто используемым для взлома Asterisk.
iptables -P INPUT DROP
Помните, первое правило? Когда мы устанавливаем политику по умолчанию для входных цепей принять? Это правило меняет политику по умолчанию для входных цепочек обратно в DROP, что и требуется, если вы хотите на самом деле блокировать трафик поступающий на ваш сервер.
iptables -P FORWARD DROP
Запретим маршрутизацию трафика
iptables -P OUTPUT ACCEPT
Разрешим весь исходящий трафик.
service iptables save
Сохраним созданные правила.
Правила для Asterisk
Рассмотрим правила для SIP, RTP, IAX, AMI
iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT iptables -A INPUT -p udp -m udp --dport 5061 -j ACCEPT iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT
Если вы используете TCP:
iptables -A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 5061 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT – это правило разрешает инициацию SIP подключений к вашему серверу Asterisk от удаленных пользователей или провайдера.
Если у вас нет удаленных пользователей, а например только sip транк от провайдера, хорошая идея разрешить доступ только с определенных ip адресов или сетей.
iptables -A INPUT -p udp -m udp -s 123.123.123.123 --dport 5060 -j ACCEPT iptables -A INPUT -p udp -m udp -s 192.168.0.0/24 --dport 5060 -j ACCEPT
Первое правило разрешает соединение только с адреса 123.123.123.123, второе только с адреса 125.125.125.125. Третье из сети 192.168.0.XXX для ваших локальных абонентов.
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT – Данное правило разрешает RTP трафик. Кода иницировано SIP соединение по порту 5060 голосовые потоки направляются на порты из указанного диапазона. Некоторые АТС используют для инициации SIP соединения и для RTP трафика разные интерфейсы. Т.е. если адрес SIP сервера вашего провайдера 123.123.123.123, то RTP трафик, к примеру, может исходить с ip адреса 123.123.123.124 и т.п.
Диапазон rtp портов задается в файле /etc/asterisk/rtp.conf.
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.
service iptables save
Сохраним новые правила
Установка:
apt-get install iptables-persistent
Использование:
/etc/init.d/iptables-persistent {start|restart|reload|force-reload|save|flush}
или
/usr/sbin/netfilter-persistent {start|restart|reload|force-reload|save|flush}
Фильтрация по именам сканеров
iptables -I INPUT -p udp --dport 5060 -m string --string "friendly-scanner" --algo bm -j DROP iptables -I INPUT -p udp --dport 5060 -m string --string "sip-scan" --algo bm -j DROP iptables -I INPUT -p udp --dport 5060 -m string --string "sundayddr" --algo bm -j DROP iptables -I INPUT -p udp --dport 5060 -m string --string "iWar" --algo bm -j DROP iptables -I INPUT -p udp --dport 5060 -m string --string "sipsak" --algo bm -j DROP iptables -I INPUT -p udp --dport 5060 -m string --string "sipvicious" --algo bm -j DROP
Разрешить ping с определенного источника
Разрешить входящий ICMP трафик с указанного ip или подсети.
iptables -A INPUT -p icmp --icmp-type 8 -s <source_ip> -d <local_ip> -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Разрешить исходящий ICMP трафик на указанный ip или подсеть.
iptables -A OUTPUT -p icmp --icmp-type 8 -s <local_ip> -d <source_ip> -m state --state ESTABLISHED,RELATED -j ACCEPT
Проброс порта (forward) на другой компьютер в локальной сети
Включим поддержку форвардига для протокола ipv4 в файле /etc/sysctl.conf
net.ipv4.ip_forward = 1
Применим:
# sysctl -p /etc/sysctl.conf
Пример для порта 80 TCP:
iptables -A FORWARD -i enp5s2 -o enp4s0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT && iptables -A FORWARD -i enp5s2 -o enp4s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT && iptables -A FORWARD -i enp4s0 -o enp5s2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT && iptables -t nat -A PREROUTING -i enp5s2 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2 && iptables -t nat -A POSTROUTING -o enp4s0 -p tcp --dport 80 -d 192.168.0.2 -j SNAT --to-source 192.168.0.1
Проброс с одного порта на другой
Легенда:
- external interface - enp5s2
- internal interface - enp4s0
- internal interface ip - 192.168.0.1
- forwarding ip - 192.168.0.2
- source ip - 123.123.123.123
- external port - 8080
- forwarding port - 80
Разрешим форвардинг между интерфейсами:
iptables -A FORWARD -i enp5s2 -o enp4s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i enp4s0 -o enp5s2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Перепишем запрос на порт 8080 внешнего интерфейса,
на адрес и порт компьютера в локальной сети: 192.168.0.2:80.
iptables -t nat -A PREROUTING -i enp5s2 -p tcp -s 123.123.123.123/32 --dport 8080 -j DNAT --to-destination 192.168.0.2:80
Перенаправим запрос c внешнего интерфейса enp5s2 на внутренний интерфейс enp4s0.
iptables -I FORWARD 1 -i enp5s2 -o enp4s0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
Отправим запрос с внутреннего интерфейса на адрес 192.168.0.2 порт 80
iptables -t nat -A POSTROUTING -o enp4s0 -p tcp --dport 80 -d 192.168.0.2 -j SNAT --to-source 192.168.0.1
Будет работать только для запросов с адреса 123.123.123.123
Классная картика:
Смотрите также:
NAT, SIP и Asterisk
Asterisk + Fail2Ban