Розглянемо ситуацію, коли сервер 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