SIP через NAT или работоспособность VOIP в серых и белых сетях
Рубрики: IP-телефония
11 Ноя 2015На практике о Network Address Translation
В некой организации существует локальная сеть с приватными IP адресами. В связи с тем, что такие IP адреса предназначены для использования в локальных сетях и не маршрутизируются Интернет провайдерами, между локальной сетью и Интернет размещен NAT-шлюз, основной функцией которого является трансляция приватных IP адресов в один публичный.
Для приватных IP выделено три диапазона адресов:
- 10.0.0.0 — 10.255.255.255
- 172.16.0.0 — 172.31.255.255
- 192.168.0.0 — 192.168.255.255
Реальными — маршрутизируемыми IP адресами являются все другие адреса, которые не попадают в вышеуказанные диапазоны.
В качестве примера используем следующую адресацию:
NAT-шлюз построен на базе операционной системы Linux ядра версии 2.4.20. По умолчанию в ядра Linux включена сетевая подсистема Netfilter обеспечивающая, как фильтрацию проходящих сетевых пакетов, так и трансляцию приватных IP адресов. Netfilter управляется утилитой iptables.
Синтаксис правил следующий:
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -j SNAT —to-source 85.115.165.18
Данное правило iptables позволяет всем пользователям локальной сети с адресами из диапазона 192.168.0.0/24 получить относительно полный доступ к сети Интернет. В этом случае все пакеты проходящие NAT-шлюз будут проходить обработку, тело пакета в этом случае не изменится, но заголовок в свою очередь будет видоизменен.
Приватный IP адрес источника переписывается публичным IP адресом шлюза. Аналогичным маршрутом возвратится и ответный пакет.
Данная схема является работоспособной при соблюдении первого правила трансляции:
IP адрес приемника исходящего пакета должен соответствовать IP адресу источника входящего пакета. (исходящий пакет: от пользователя к серверу, входящий пакет от сервера к пользователю)
Первое правило трансляции сетевых адресов не соблюдено – приведенная выше схема не работоспособна.
Транспортные протоколы такие, как UDP, TCP в составе своего заголовка содержат порт приемника и порт источника. Сетевой порт может принимать любое значение из диапазона от 1 до 65535. Назначением портов занимаются клиентские и серверные приложения. Обычно за некоторыми распространенными сетевыми протоколами закреплены стандартные номера портов.
Сервер или сервис | Прикладной протокол | Транспортный протокол | Порт |
WEB | HTTP | TCP | 80 |
FTP | FTP | TCP | 21 |
SIP | SIP | UDP или TCP | 5060 |
Существование сетевых портов значительно расширяет возможности, как фильтрации так и трансляции сетевых пакетов. Сетевая подсистема Netfilter умеет достаточно гибко манипулировать сетевыми портами.
Простейшим примером тому может служить нижеследующее правило, организующее доступ пользователей локальной сети лишь к WEB-серверам Интернет.
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -p tcp –dport 80 -j SNAT —to-source 85.115.165.18
Данная схема является работоспособной при соблюдении второго правила трансляции правила:
Сетевой порт источника исходящего пакета должен соответствовать сетевому порту приемника входящего пакета.
Возможны отказы при работе NAT в том случае когда сервер или сервис изменяет сетевой порт источника в ответном пакете. (Необходима проверка)
Ранее нами были рассмотрены варианты в которых пользователь локальной сети используя приватный IP адрес, являлся инициатором соединения с публичным сервером или сервисом Интернет. Предположим в локальной сети необходимо установить общедоступный WEB-сервер. Топология сети принимает вид:
Правило сетевой подсистемы netfilter обеспечивает транспорт до WEB-сервера.
iptables -t nat -A PREROUTING -d 85.115.165.18 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.100:80
В этом случае пользователь публичной сети инициирует соединение с публичным адресом NAT-шлюза, который и выдает себя за WEB-сервер. Публичный IP адрес источника переписывается приватным IP адресом шлюза и отправляется на приватный IP WEB-сервера. Аналогичным маршрутом возвратится и ответный пакет.
На базе изложенной информации и используя существующую техническую документацию по теме netfilter/iptables появляется возможность строить достаточно интересные сценарии маршрутизации приватных IP адресов.
SIP через NAT
Предположим у организации появилась необходимость в установке нескольких IP-телефонов. Телефоны используют для сигнализации SIP протокол, для мультимедиа RTP протокол. Поставленную задачу нужно решить на базе существующей локальной сети, без внесения каких либо глобальных изменений в действующую топологию, адресное распределение, не нарушая ее прежней функциональности и что немало важно достаточно дешево.
Наша локальная сеть принимает вид:
Одной из технически сложных задач в IP-телефонии является прохождение трафика сигнальных и мультимедиа протоколов через NAT-шлюзы. Разберем несколько существующих на данный момент способов преодоления проблемы NAT в SIP. Все эти решения прямо или косвенно будут связаны с использованием netfilter/iptables и попадают под правила трансляции приватных IP адресов.
Для более детального понимания, рассмотрим пару схем, иллюстрирующих движение SIP и RTP трафика:
Tel-x имеет публичный IP адрес, tel-1 имеет приватный IP адрес.
Телефоны tel-1 и tel-x при включении регистрируются на SIP-сервере и поддерживают с ним периодический обмен.
Tel-1 набирает tel-x либо наоборот tel-x вызывает tel-1, запрос на соединение приходит на SIP-сервер, тот в свою очередь проверяет состояние второй стороны и при благополучном исходе дает добро на установку мультимедийного соединения.
Соединение по протоколу RTP между tel-1 и tel-x может проходить в нескольких режимах. Первый через SIP-сервер, второй напрямую tel-1 с tel-x либо по третьему варианту – комбинированному: tel-1 гонит трафик на SIP-сервер тот в свою очередь (проксирует) перенаправляет на tel-x, tel-x прямым маршрутом отвечает tel-1. Из чего следует, что при использовании в данной конфигурации трансляции адресов, режим номер три автоматически нарушает правила трансляции. Но это не является единственной проблемой. Представим что SIP-сервер имеет не один а десяток IP адресов на одном сетевом интерфейсе. Пакет адресованный на десятый интерфейс будет принят и обработан сервером, а так же будет сформирован ответный пакет но отправлен он будет с первого интерфейса. И снова нарушение правил трансляции.
Как один из вариантов решения данной проблемы – применить технологию переназначения портов. Создадим определенный сценарий для iptables который обеспечит прохождение пакетов сигнализации и мультимедийного трафика от приватного пользователя до SIP-сервера или публичного пользователя и гарантирует прием ответов приватной стороной.
Обязательное условие — фиксированный исходящий SIP и RTP порт на устройстве абонента. Установим нижеследующие настройки в аппаратах:
tel-1:
IP Address: 192.168.0.30
Subnet Mask: 255.255.255.0
Default Router: 192.168.0.1
SIP Server: ip.sip.server
local SIP port: 5060
local RTP port: 10000
tel-2:
IP Address: 192.168.0.31
Subnet Mask: 255.255.255.0
Default Router: 192.168.0.1
SIP Server: ip.sip.server
local SIP port: 5062
local RTP port: 10002
tel-3:
IP Address: 192.168.0.32
Subnet Mask: 255.255.255.0
Default Router: 192.168.0.1
SIP Server: ip.sip.server
local SIP port: 5064
local RTP port: 10004
Добавим к существующим правилам следующие:
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 5060 -j DNAT —to-destination 192.168.0.30
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 5062 -j DNAT —to-destination 192.168.0.31
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 5064 -j DNAT —to-destination 192.168.0.32
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 10000 -j DNAT —to-destination 192.168.0.30
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 10002 -j DNAT —to-destination 192.168.0.31
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 10004 -j DNAT —to-destination 192.168.0.32
iptables -t nat -A POSTROUTING -s 192.168.0.30 -p udp –-sport 5060 -j SNAT —to-source 85.115.165.18:5060
iptables -t nat -A POSTROUTING -s 192.168.0.31 -p udp –-sport 5062 -j SNAT —to-source 85.115.165.18:5062
iptables -t nat -A POSTROUTING -s 192.168.0.32 -p udp –-sport 5064 -j SNAT —to-source 85.115.165.18:5064
iptables -t nat -A POSTROUTING -s 192.168.0.30 -p udp –-sport 10000 -j SNAT —to-source 85.115.165.18:10000
iptables -t nat -A POSTROUTING -s 192.168.0.31 -p udp –-sport 10002 -j SNAT —to-source 85.115.165.18:10002
iptables -t nat -A POSTROUTING -s 192.168.0.32 -p udp –-sport 10004 -j SNAT —to-source 85.115.165.18:10004
Определенные UDP порты закрепляем за конкретным IP адресом из локальной сети. UDP пакеты приходящие от любых публичных IP адресов Интернет на публичный IP адрес NAT-шлюза, на порты 5060 и 10000 предаем аппарату tel-1 с приватным адресом 192.168.0.30. Исходящие UDP пакеты с tel-1 выводим из приватной сети закрепляя за ними порты 5060 и 10000 для благополучного приема. По той же схеме работают и другие два аппарата. В этом случае теряет свою силу первое правило трансляции IP адресов. NAT-шлюз руководствуется только вторым правилом трансляции.
Общий набор правил iptables для NAT-шлюза:
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -p tcp –dport 80 -j SNAT —to-source 85.115.165.18
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -p tcp —dport 25 -j SNAT —to-source 85.115.165.18
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -p tcp —dport 110 -j SNAT —to-source 85.115.165.18
iptables -t nat -A PREROUTING -d 85.115.165.18 -p tcp —dport 80 -j DNAT —to-destination 192.168.0.100:80
iptables -t nat -A POSTROUTING -s 192.168.0.100 -p tcp —sport 80 -j SNAT —to-source 85.115.165.18
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 5060 -j DNAT —to-destination 192.168.0.30
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 5062 -j DNAT —to-destination 192.168.0.31
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 5064 -j DNAT —to-destination 192.168.0.32
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 10000 -j DNAT —to-destination 192.168.0.30
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 10002 -j DNAT —to-destination 192.168.0.31
iptables -t nat -A PREROUTING -d 85.115.165.18 -p udp —dport 10004 -j DNAT —to-destination 192.168.0.32
iptables -t nat -A POSTROUTING -s 192.168.0.30 -p udp —sport 5060 -j SNAT —to-source 85.115.165.18:5060
iptables -t nat -A POSTROUTING -s 192.168.0.31 -p udp —sport 5062 -j SNAT —to-source 85.115.165.18:5062
iptables -t nat -A POSTROUTING -s 192.168.0.32 -p udp —sport 5064 -j SNAT —to-source 85.115.165.18:5064
iptables -t nat -A POSTROUTING -s 192.168.0.30 -p udp —sport 10000 -j SNAT —to-source 85.115.165.18:10000
iptables -t nat -A POSTROUTING -s 192.168.0.31 -p udp —sport 10002 -j SNAT —to-source 85.115.165.18:10002
iptables -t nat -A POSTROUTING -s 192.168.0.32 -p udp —sport 10004 -j SNAT —to-source 85.115.165.18:10004
В итоге получаем:
- Локальную сеть с выходом в Интернет через фильтрующий шлюз,
- Собственный WEB-сервер,
- Доступ к ресурсам почтовых и web-серверов Интернет,
- Возможность использования IP-телефонии.
- Комментарии к записи SIP через NAT или работоспособность VOIP в серых и белых сетях отключены
Возможность комментирования закрыта модератором.