URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 61413
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Настройка пакетного фильтра PF для ..."

Отправлено auto_tips , 27-Ноя-09 15:50 
Во FreeBSD для включения PF указываем в /etc/rc.conf:
   pf_enable="YES"

При необходимости выделения гарантированной полосы пропускания для голосового трафика задействуем ALTQ.
Пересобираем ядро с поддержкой ALTQ, указав в конфигурации:
   options         ALTQ
   options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
   options         ALTQ_RED        # Random Early Detection (RED)
   options         ALTQ_RIO        # RED In/Out
   options         ALTQ_HFSC       # Hierarchical Packet Scheduler  (HFSC)
   options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
   options         ALTQ_NOPCC      # Required for SMP build

Далее для организации NAT для машин с SIP телефонами используем следующие настройки пакетного фильтра (/etc/pf.conf):

   # Вернет ошибку, порт заблокирован
   set block-policy return

   # тайм-аут UDP сессии должен быть равен или больше, чем время регистрации SIP
   # Таймер тайм-аута. Обычно достаточно 300 секунд.
   set timeout { udp.first 300, udp.single 150, udp.multiple 900 }

   # переменные
   int_if = "fxp0"
   ext_if = "fxp1"
   int_net = "192.168.1.0/24"
   ipphone1 = "192.168.1.18"
   ipphone2 = "192.168.1.19"

   # Включим очереди для внешнего интерфейса. Отделим голосовой трафик от данных
   altq on $ext_if hfsc bandwidth 512Kb queue { q_voice, q_other }
   queue q_voice bandwidth 3.84Kb priority 6 hfsc(realtime 96Kb)
   queue q_other bandwidth 416Kb hfsc { q_pri, q_std, q_low }
   queue q_pri   bandwidth 200Kb priority 3 hfsc(red realtime 64Kb)
   queue q_std   bandwidth 200Kb priority 2 hfsc(default red )
   queue q_low   bandwidth 3.84Kb priority 1 hfsc(red )

   # Для каждого IP- телефона свое правило трансляции nat.
   # Параметр static-port нужен для сохранения временного порта UDP.
   # Это нужно чтобы удаленный SIP прокси знал к какой сессии привязан наш IP телефон.
   nat on $ext_if proto udp from $ipphone1 to any -> ($ext_if) static-port
   nat on $ext_if proto udp from $ipphone2 to any -> ($ext_if) static-port

   # Правило NAT для остальных устройств локальной сети
   nat on $ext_if from $int_net to any -> ($ext_if)

   pass in  quick on lo0 all
   pass out quick on lo0 all

   # Разрешаем SIP трафик с телефонов на локальном интерфейсе
   pass in  quick on $int_if proto udp from $ipphone1 to any tag VOIP keep state
   pass in  quick on $int_if proto udp from $ipphone2 to any tag VOIP keep state

   pass in  quick on $ext_if proto tcp from any to any port 22 keep state \
     queue(q_std,q_pri)
   pass in  quick on $ext_if proto tcp from any to any port 80 keep state \
     queue q_low

   pass out quick on $ext_if tagged VOIP queue q_voice keep state
   pass out quick on $ext_if proto tcp from any to any port 22 keep state \
     queue(q_std,q_pri)
   pass out quick on $ext_if proto tcp from any to any flags S/SA keep state \
     queue(q_std,q_pri)
   pass out quick on $ext_if proto udp from any to any port 53 queue q_pri \
     keep state

   # Разрешаем с внешнего интерфейса наружу  tcp, udp, icmp
   pass out quick on $ext_if proto { tcp, udp, icmp } all keep state

   block in log all


Конфигурация была протестирована на VoIP телефоне Cisco 7960,
NAT прокси и outbound_proxy не используются, в телефоне настроен прокси-сервер SIP и порт контроля 5060/udp. Функция STUN в телефоне включена, хотя некоторые коммерческие SIP-прокси могут работать без него.

Проверить очереди:
   pfctl -vsq -v

Очистить таблицы состояний:
   pfctl -F state

Проверка правил:
   pfctl -s rules -v


URL: http://www.arg.su/ru-RU/node/128 http://www.bastard.net/~kos/pf-voip.html
Обсуждается: http://www.opennet.me/tips/info/2220.shtml


Содержание

Сообщения в этом обсуждении
"Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT"
Отправлено Добрый Дохтур , 27-Ноя-09 15:50 
а если телефонов 200-300 штук?

"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено mma , 28-Ноя-09 07:02 
а вот поэтому и не стоит использовать BSD на шлюзах общего назначения, там с pf  сюрпризов ой как много вылазит

"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено m , 28-Ноя-09 10:35 
Конкретно, каких сюрпризов?

"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено iZEN , 28-Ноя-09 17:49 
А что за сюрпризы с PF?

"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено F.Y. , 29-Ноя-09 00:26 
>а вот поэтому и не стоит

... а вот по этому и не стоит говорить о чём не ведаешь :)


"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено mma , 29-Ноя-09 08:06 
ну да, ну да....
SIP и GRE via NAT, route-to и 3-4 линка. Это то что вспомнил с ходу. Сам использую PF(OpenBSD)  но только там где заранее знаю требуемый набор функций.

"Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT"
Отправлено iZEN , 27-Ноя-09 23:00 
Макросы/переменные нужно выносить в первые строчки!

Флажки "flags S/SA" и "keep state" можно не указывать — оно и так подразумевается по умолчанию.

Конструкцию "block in log all" нужно ставить ПЕРЕД разрешающими правилами, сразу после описания трансляций NAT, и лучше заменить на тупое и беспринципное "block all", когда всё отлажено и логи ни к чему.

Набор правил:
pass in  quick on lo0 all
pass out quick on lo0 all
достаточно заменить на одну ОПЦИЮ:
set skip on { lo }

"scrub in all" до описания очередей ОБЯЗАТЕЛЬНО!


"Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT"
Отправлено netc , 29-Ноя-09 21:52 
из того, что вспомнил

не работает synproxy на tun интерфейсах, по крайней мере в 7.0-7.2 не работало, а это означает что если повесить на внешний интерфейс(tun) ssh  то контроллировать средствами pf атаки bruteforce - не представляеться возможным.

а вообще соглашусь что подводных камней ой как много, лучше использовать ipfw, но он не так "красив" и легок для начинающих.

с работой ftp есть проблемы в определенных режимах  


"Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT"
Отправлено фноним , 30-Ноя-09 14:01 
linux box
и
sudo modprobe nf_nat_sip
решат проблемы с натом сипа

"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено Nas_tradamus , 30-Ноя-09 14:35 
Во-во! Я так же решил эту проблему.

А что-то дико сложно это делается в PF.


"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено User294 , 30-Ноя-09 18:33 
> sudo modprobe nf_nat_sip

Некоторым простые решения кажутся неспортивными :-)


"Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT"
Отправлено Князь , 30-Ноя-09 16:41 
Как вариант - натить SIP и GRE трафик с помощью IPFW, а остальное гонять через PF.

З.Ы. Для кричащих "нахрена два фаерволла" - каждый фаер делает то что он умеет, pf - плюшки вроде route-to и reply-to, IPFW - натить проблемный трафик.


"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено Добрый Дохтур , 30-Ноя-09 19:49 
>pf - плюшки вроде route-to и reply-to

а что, на ipfw это совершенно невозможно сделать? :)


"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено Князь , 01-Дек-09 12:37 
если покажете как сделать аналог reply-to в ipfw буду век вам благодарен

"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено Добрый Дохтур , 02-Дек-09 00:49 
отошлю к статье Вадима Гончарова:

http://nuclight.livejournal.com/124348.html

Тот факт, что на самом деле "перепрыгивание" выполняется на параметры
действия, позволяет использовать это для интересных вещей. В частности, с
использованием появившегося во FreeBSD 6.2 параметра tag на каждый пакет можно
навешивать внутриядерный тег, что в применении со skipto позволяет сделать, к
примеру, запоминание, с какого шлюза пришел входящий пакет на машине с каналами
к двум разным провайдерам, и ответные пакеты отправлять в тот канал, откуда они
пришли (допустим, у вашей машины только один IP-адрес, и сделать fwd на базе
внешнего адреса не получится), т.е. реализовать аналог reply-to из pf:

ipfw add 100 skipto 300 tag 1 in recv $ext_if1 keep-state
ipfw add 200 skipto 300 tag 2 in recv $ext_if2 keep-state
ipfw add 300 allow { recv $ext_if1 or recv $ext_if2 }  # входящие снаружи
ipfw add 400 allow in recv $int_if   # разрешить ответы на внутреннем проходе
ipfw add 500 fwd $gw1 tagged 1      # остались ответы на внешнем интерфейсе,
ipfw add 600 fwd $gw2 tagged 2      # зарулим их куда надо


"Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT"
Отправлено Touch , 02-Дек-09 09:21 
Н-да .. тяжко оно без natd ..

"Настройка пакетного фильтра PF для проброса SIP-телефонов че..."
Отправлено Добрый Дохтур , 02-Дек-09 11:35 
зачем оно нужно?