Настройка пакетного фильтра 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:
#!/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