В этой статье рассматривается простой пример конфигурации 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

Рассмотрим правила для SIPRTPIAXAMI

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

Сохраним новые правила

в debian и ubuntu добавили пакет iptables-persistent который использует iptables-save/iptables-restore.
Установка:
apt-get install iptables-persistent
Использование:
/etc/init.d/iptables-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

Настройка IPtables в несколько кликов

iptables -P INPUT ACCEPT &&
iptables -F &&
service iptables save &&
iptables -A INPUT -i lo -j ACCEPT &&
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT &&
iptables -A INPUT -p tcp --dport 22 -j ACCEPT &&
iptables -A INPUT -p tcp --dport 80 -j ACCEPT &&
iptables -P INPUT DROP &&
iptables -P FORWARD DROP &&
iptables -P OUTPUT ACCEPT &&
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT &&
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT &&
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 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 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 &&
service iptables save &&
iptables -L

 

FORWARD

/etc/sysctl.conf

 net.ipv4.ip_forward = 0
 net.ipv4.ip_forward = 1
 # sysctl -p /etc/sysctl.conf
 # iptables -t nat -A PREROUTING -p udp --dport 5061 -j DNAT --to-destination 192.168.0.1:5060
# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       udp  --  anywhere             anywhere            udp dpt:sip-tls to:192.168.0.1:5060

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination