Клиент спрятан за NAT

Когда клиент пытается инициировать сеанс связи, оно отправляет SIP-сообщение, содержащее его IP-адрес и некоторую дополнительную информацию. Получив это сообщение, Asterisk использует его, чтобы определить, куда отправить ответ на это сообщение. Поскольку устройство находится за NAT, SIP-сообщение будет иметь серый адрес, например, 192.168.1.104. Тем не менее, мы можем сообщить Asterisk, игнорировать SIP-адрес этого сообщения, а вместо этого использовать то, что поставляется сетевым стеком. Рассмотрим какие опции мы можем использовать в sip.conf для преодоления NAT:

nat=no ;Не выполнять никакой специальной обработки NAT, кроме той что указана в RFC 3581. nat=force_rport ;Даже если ни одного параметра rport не было указано, действовать, так, как если ;бы он был. nat=comedia ;Отправлять RTP пакеты обратно к порту с которого они были получены, игнорируя ;требуемый порт в SDP заголовке. nat=auto_force_rport ;Если Asterisk сможет определить, что устройство находится за NAT, установить ;опцию force_rport. Значение по умолчанию, если не указана опция nat. nat=auto_comedia ;Если Asterisk сможет определить, что устройство находится за NAT, установить ;опцию comedia. nat=force_rport,comedia ;Опция заменяющая nat=yes в более новых версия Asterisk.

Стоит заметить что начиная с версии Asterisk 11: nat=yes устарело, и необходимо использовать nat=force_rport,comedia.

RFC 3581 позволяет одному клиенту использовать параметр rport, для того чтобы передать другому клиенту, что оно должно реагировать на адрес источника IP и порт запрос, а не на IP адрес прописанный в SIP заголовке. Установка параметра rport может произойти, когда устройство знает, что он находиться за NAT и не может записать информацию, которая была бы необходима, для связи в обоих направлениях, в заголовке SIP. Asterisk всегда читает параметр rport, если он передается, но так как это происходит не так часто, как хотелось бы, мы можем заставить Asterisk предположить, что устройство будет передавать параметр rport. Выполняя это, мы заставляем Asterisk всегда отвечать на адрес IP и порт источника сообщения, от которого он получил запрос. Если настройки NAT явно не определены, Asterisk будет выполнять auto_force_rport, в качестве параметра по умолчанию. Вы можете принудительно изменить такое поведение, установив nat=force_rport.

Во многих реализациях NAT, при не получении пакетов поддержки диалога, может происходить закрытие соединения. В Asterisk для предотвращения этого используется опция qualify=yes, выполняющая отправку OPTIONS серверу каждые 2000 миллисекунд (2 секунды), не давая закрыть сессию NAT устройством. Также можно указать свое время в миллисекундах:

qualifyfreq=60 ;проверки доступности (зондирование) клиента, на дальнем конце каждые 60 секунд. qualify=10000 ;проверять соединения методом OPTIONS каждые 10 секунд. qualify=yes ;проверять соединения методом OPTIONS каждые 2 секунд.

Поддержите проект, если он помог вам

Проект продвигается за счёт личных средств и времени авторского коллектива. Если вы нашли здесь то, что искали, то вы можете выразить свою благодарность финансово. Даже небольшой платёж помогает авторам в их труде, сохраняя их вовлечённость и высокую мотивацию чтобы строить открытый мир равных возможностей для всех неравнодушных людей вокруг.