Категорії
Linux PBX (telephony)

[Linux] Sip via NAT

Розглянемо ситуацію, коли сервер asterisk’a знаходиться за NAT’ом і треба зареєструватися у SIP провайдера. В 99% випадів, проблем немає, але інколи, нічого не виходить. Більш детальний аналіз показує, що пакети SIP чомусь не NAT’яться. Чому? Відповідь трохи незвична, якщо ви працювали з іншими unix like системами. Деякі протоколи (FTP, SIP, …) використовують 2 сесії для успішної передачі даних: сигнальна (встановлення зʼєднання) і передачі даних. У інших ОС (файерволах) вам потрібно самостійно опікуватися цими проблемами, які додаткові порти відкрити або як переналаштувати зʼєднання (наприклад, перейти з active на passive режим в FTP). В Linux для цього придумали механізм conntrack (connection tracker), який “зазирає” всередину зʼєднання і дозволяє створити відповідне динамічне правило (насправді це правило треба створити окремо, але там ми не вказуємо конкретні порти, просто вказуємо, що це відноситься до, наприклад, SIP і пакети автоматично будуть проходити). Чи це добре? І так і ні. Чому добре – зрозуміло. Чому ні? Тому що, інколи виникають проблеми, про які сказано на початку статті.

Отже, у нас налаштований conntrack helper SIP:

net.netfilter.nf_conntrack_helper=1

і відповідні правила у iptables:

iptables -t raw -A OUTPUT -p udp -m udp -m conntrack --sport 5060 --ctstate NEW,RELATED,ESTABLISHED -m state --state NEW,RELATED,ESTABLISHED -m helper --helper sip -j CT
iptables -t raw -A OUTPUT -p udp -m udp -m conntrack --dport 5060 --ctstate NEW,RELATED,ESTABLISHED -m state --state NEW,RELATED,ESTABLISHED -m helper --helper sip -j CT

Але все одно нічого не працює. Подивилися через conntrack -L і там теж сесії є. В чому ж проблема? Поки немає у мене правильної відповіді, і я користуюся таким workaround’ом, як видалити всі сесії asterisk’a:

# conntrack -D -s 10.0.1.11

І після цього починає все працювати. Є припущення, що така поведінка зʼявляються після перезавантаження хоста з asterisk’ом і як це відслідковувати на conntrack, щоб він видаляв такі сесії – поки не знаю. Хтост може сказати, що треба виставити timeout’и на conntrack, але вони є і не діють:

net.netfilter.nf_conntrack_udp_timeout=30

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff