PDA

Bekijk de volledige versie : Решение проблемы с ip-телефонией



Bizzone
04-08-2009, 11:54
Возможно, данное решение поможет кому-то в схожей ситуации.

Столкнулся сегодня с проблемой с IP-телефонией. Имеется роутер ASUS WL-500gp с подключенным к нему VoIP шлюзом Quintum Tenor AF. Судя по спецификации, он использует стандарты G.723.1a, G.729ab, G.711 (какой из них конкретно не выяснял). Оператор - Телеком-Финанс (хотя, думаю, это не суть важно).

Шлюз требует входящих соединений по портам 10240-11240 UDP, 20000 TCP, 20000 UDP, 8080 TCP для соединения по telnet. Для данных портов требуется создать правила во вкладке Virtual Server.

Тем не менее, телефония после данных настроек не желает работать: не слышен голос, приходящий на телефонный аппарат, подключенный к шлюзу, голос от аппарата при этом слышен. Техподдержка упорно настаивала на неправильно перенаправленых портах, хотя telnet с удаленного сервера на реальный адрес роутера по указанным портам успешно попадал во внутреннюю сеть и доходил до VoIP-шлюза. При звонках в tcpdump была явно видна сетевая активность шлюза.

После долгого ковыряния решил оставить в iptables только самое необходимое, удалив многие правила, созданные автоматически. И тут телефония заработала. После изучения правил, которые были удалены, обнаружил такую логику. Транзитный трафик до VoIP-шлюза попадает в цепочку FORWARD, а далее в цепочку SECURITY по следующему правилу:



num pkts bytes target prot opt in out source destination
8 6881 1375K SECURITY all -- !br0 any anywhere anywhere state NEW


А вот в ней стоят интересные ограничения limit:



num pkts bytes target prot opt in out source destination
3 708 142K RETURN udp -- any any anywhere anywhere limit: avg 5/sec burst 5
4 0 0 RETURN icmp -- any any anywhere anywhere limit: avg 5/sec burst 5


В эти ограничения пакеты, видимо, не попадали, возврат по RETURN к цепочке FORWARD, где далее все пакеты пропускались, не выполнялся, а следующим действием в цепочке SEQURITY шло:



num pkts bytes target prot opt in out source destination
6 1951 390K DROP all -- any any anywhere anywhere


Насколько я понял, пакеты, не укладывающиеся в ограничение, считались DDoS атаками и блокировались. Суть ограничения я понял не до конца. Вот здесь (http://www.citforum.ru/operating_systems/linux/iptables/1.shtml) дано такое объяснение:


Расширение -m limit подразумевает наличие ключей --limit и --limit-burst. Если вы не указываете эти ключи, то они принимают значение по-умолчанию.

Ключ --limit-burst - это максимальное значение счетчика пакетов, при котором срабатывает ограничение.

Ключ --limit - это скорость, с которой счетчик burst limit "откручивается назад".

Таким образом, если приходит больше 5 пакетов в секунду, емкость limit-burst из 5 пакетов переполняется и пакеты больше не будут подпадать под критерий, а значит, будут блокироваться следующим правилом.

Видимо, ip-телефония генерит явно больше пакетов, и часть из них блокируется. Решений может быть много, самое простое ИМХО добавить правило


iptables -t filter -I SECURITY 5 -s IP_шлюза_провайдера_VoIP -j RETURN

После добавления этого правила телефония заработала. Не забудьте прописать эту строчку в /usr/local/sbin/post-firewall и сохранить измаенения на флеш командой


flashfs save && flashfs commit && flashfs enabled'