Настройка пакетного фильтра PF для проброса SIP-телефонов или работа Asterisk через NAT.
Чтобы Asterisk за NAT работал корректно, нужно отдельное правило трансляции адресов с опцией static-port и проброс (rdr) 5060 порта, чтобы pf NAT не подменял UDP порт (получится так называемый SIP ALG).
Так как сессии у Asterisk похоже проходят по IP+UDP port, а обычный pf NAT, изменяет порт, отсюда и все проблемы.
Для машин с SIP устройствами за NAT используем следующие настройки пакетного фильтра /etc/pf.conf:
В данном кофиге не рассматривались правила фильтрации, очереди и прочее, тут важно было показать как настроить pf NAT и rdr, так, чтобы Asterisk заработал за NAT'ом и показать реализацию SIP ALG средствами pf. Конфигурация была протестирована на Asterisk 1.8, думаю SIP телефоны будут работать так же без особых проблем.
P.S. На всякий случай небольшая справка по pfctl:
Очистить таблицы состояний:
Ссылки по теме:
1. Блог пользователя argo - SIP через NAT
2. Opennet - Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT
3. OpenBSD Pf Firewall "how to" (pf.conf)
4. OpenBSD pf and Voice over IP
5. doc.pfsense.org - Static-Port
Чтобы Asterisk за NAT работал корректно, нужно отдельное правило трансляции адресов с опцией static-port и проброс (rdr) 5060 порта, чтобы pf NAT не подменял UDP порт (получится так называемый SIP ALG).
Так как сессии у Asterisk похоже проходят по IP+UDP port, а обычный pf NAT, изменяет порт, отсюда и все проблемы.
Для машин с SIP устройствами за NAT используем следующие настройки пакетного фильтра /etc/pf.conf:
#!/bin/sh # переменные ext_if = "em0" int_if = "re0" int_net = "192.168.1.0/24" ipphone1 = "192.168.1.200" sip_server = "192.168.1.4" ##### 1. Настройки # Вернет ошибку, порт заблокирован set block-policy return # тайм-аут UDP сессии должен быть равен или больше, чем время регистрации SIP # Таймер тайм-аута. Обычно достаточно 300 секунд. set timeout { udp.first 300, udp.single 150, udp.multiple 900 } # Игнорируем петлевой интерфейс set skip on lo # Собираем все части фрагментированного пакета перед отправкой (Нормализуем входящий трафик) scrub in all # Для каждого SIP устройства свое правило трансляции nat. # Параметр static-port нужен для сохранения временного порта UDP. # Это нужно чтобы удаленный SIP сервер знал к какой сессии привязан наше SIP устройство или Asterisk. nat on $ext_if inet proto udp from $ipphone1 to any -> ($ext_if) static-port # Так называемый SIP-ALG nat on $ext_if inet proto udp from $sip_server to any -> ($ext_if) static-port rdr on $ext_if inet proto udp from any to ($ext_if) port 5060 -> $sip_server # Правило NAT для остальных устройств локальной сети nat on $ext_if from $int_net to any -> ($ext_if) #### 2. Правила фильтрации # Разрешим все отовсюду pass allТеперь Asterisk будет "видеть" удаленный сервер, будет проходить на нем регистрацию, а главное абоненты будут друг-друга слышать.
В данном кофиге не рассматривались правила фильтрации, очереди и прочее, тут важно было показать как настроить pf NAT и rdr, так, чтобы Asterisk заработал за NAT'ом и показать реализацию SIP ALG средствами pf. Конфигурация была протестирована на Asterisk 1.8, думаю SIP телефоны будут работать так же без особых проблем.
P.S. На всякий случай небольшая справка по pfctl:
Очистить таблицы состояний:
pfctl -F stateПроверка правил:
pfctl -s rules -v
Ссылки по теме:
1. Блог пользователя argo - SIP через NAT
2. Opennet - Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT
3. OpenBSD Pf Firewall "how to" (pf.conf)
4. OpenBSD pf and Voice over IP
5. doc.pfsense.org - Static-Port
Комментариев нет:
Отправить комментарий