H323 FreeBSD PFsense 2.2.2 its WORK!
- 
 H323 (video&audio VoIP) в FreeBSD 10.1 
 14.05.2015
 Редакция статьи ver: 0.1
 Аксёнов Алексей /flagman/
 (infoгавlinkpro.pro)
 Доброго времени суток всем!
 Данная статья относится к ОС FreeBSD 10.1, в частности, PFsense 2.2.2 i386 х32 (на момент написания). Данная статья написана максимально понятно для начинающих, я сам таким и являюсь.
 Главная Цель: Обеспечить прием входящих звонков на устройство h323.
 Сказ:
 В моей локальной сети появилось устройство Polycom HDX6000,
 я его подключил, настроил сеть, для первого опыта прокинул на него все порты - NAT 1:1. Совершил исходящий звонок удаленному абоненту в другой город, работает! Думаю, ну хорошо, что все работает, говорю собеседнику:
 -«Звони теперь ты мне!»
 -«Да, конечно, сейчас!»
 Вижу,- звонит, нажимаю на Поликоме «принять вызов», а он продолжает звонить и все… сеанс связи не образовывается! Единственным выходом из положения, согласно инструкции, отключить поддержку h323 на Поликоме… Проверил, да действительно,- без h323 сеанс связи есть, но при этом требуется NAT (1024-65000), т.е. :- прощай все остальные сервисы, смотрящие наружу.
- и к тому же, любой пакет (например сканер портов), пришедший на порт 1720 выводит Поликом из состояния спячки, один раз позвонит и все…. А это очень раздражает руководство!
 Не наш выход!
 После долгих поисков подходящих решений, для организации связи, остановился на GNU Gatekeeper! http://www.gnugk.org
 Краткая характеристика (см. сайт изготовителя):
- может работать на Linux, Windows, MacOS X, Solaris, FreeBSD, OpenBSD and NetBSD
- support for NAT traversal (H.460.17, H.460.18, H.460.19, H.460.23 and H.460.24)
 - full H.323 proxy
 Вот что нужно!
 Процесс Работы: 
  После запуска GNUGK, Ваше устройство должно быть настроено для работы с gatekeeper, полазьте в настройках вашего устройства, и укажите локальный IP адрес шлюза:1719, на котором установлен GNUGK, там же найдите где прописывается Доб. номер H.323 (E.164). Под этим номером, ваше устройство будет регистрироваться у привратника, порт регистраций 1719. 
 - Дополнительно к GNUGK, NAT в PFsense настраивать не нужно!
 - Необходимо открыть входящие порты на WAN которые вы можете определить сами (см. функции диапазонов), следуйте эмпирическим путем…
 - Необходимо открыть входящие порты на LAN c Вашего устройства H323, желательно все, следуйте эмпирическим путем…
 -Т.е. теперь чтобы кто-то с внешнего устройства дозвонился на ваше устройство, набор номера должен быть таким: вашIP##доб. номер, например 8.8.8.8##5693.
 - Если внешний абонент не знает вашего доб. номера его вызов будет отбрасываться GNUGK. Таким образом «шальные пакеты: 1720» не будут тревожить наше устройство. Своеобразная защита.
 -Если вам нужно позвонить кому-то, за пределы вашей локальной сети, то просто набираете IP адрес нужного абонента (если конечно он не использует доб. номер, если использует, то аналогично,- IP##доб. номер)
 - А также много других конфигураций режимов работы GNUGK вас ожидают, см. оригинальное руководствоИнструкция к действию, относится к PFsense 2.2.2 i386 х32: 
 1) Установка:
 Тут нас ожидает проблема, в портах FreeBSD 10.1 отсутствует Gatekeeper! Для FreeBSD 10.1 нужен пакет формата .TXZ.
 После вежливого обращения к производителю Jan Willamowius, им был собран готовый пакет для установки на FreeBSD 10.1 i386 х32!
 gnugk-3.8-freebsd-10.1-32.txz
 Также он может собрать пакет и для х64, данные услуги стоят 20 евро, для каждого пакета…
 Итак, пакет у нас есть на нашем админском ПК, далее в PFsense разрешаем подключение к SSH (System-Advanced-Enable Secure Shell).
 Нам потребуется ПО: «PuTTY» и «WinSCP»- 
Подключаемся через «PuTTY» по SSH к PFsense, используем имя пользователя “root” пароль к нему такой же как у “admin”. 
- 
Видим встроенное меню PFsense, выбираем 8 пункт, входим в Shell. 
- 
Устанавливаем менеджер пакетов PKGNG,- в командной строке введите pkg 
 (pfsense спросит установить или нет, соглашаетесь.)
- 
Затем проверяем, 
 pkg info
 (увидите версию пакетного менеджера)
- 
Обновляем репозиторий, 
 pkg update -f
 (увидите как скачивает и обновляет)
- 
Подключаемся через «WinSCP» по SSH к PFsense, копируем пакет gnugk-3.8-freebsd-10.1-32.txz в удобную для нас директорию, для примера пусть будет в /root 
- 
Используя «PuTTY» заходим в каталог /root 
- 
Просматриваем каталог, убеждаясь что наш пакет там лежит: 
 ls
- 
Производим установку пакета,- 
 pkg install gnugk-3.8-freebsd-10.1-32.txz
 (Запрашивает установку дополнительных пакетов, соглашаемся)
 Дополнительные пакеты (на всякий случай они прикреплены в архиве):
 libedit-3.1.20150325_1
 libssh-0.6.4
 lua52-5.2.4
 openldap-client-2.4.40_1
 openssl-1.0.2_1
- 
После завершения установки всех пакетов, проверяем gatekeeper, в командной строке вводим: 
 gnugk
 (Должны увидеть информационное сообщение о том что не может найти файл конфигурации и принимает настройки по умолчанию)
 Проверить вы его также можете в Diagnostics: Sockets
 Процесс установки завершен
 2) Настройка: 
 Вся настройка сводится к конфигурированию файла gatekeeper.ini (или gnugk.ini - это как настроите, об этом позже)
 Для первоначальной настройки, удобнее всего, запускать gatekeeper из командной строки, введя команду gnugk
 При этом gnugk будет искать конфигурационный файл в той директории, в который вы находились на момент набора команды gnugk
 *Например, Вы зашли по SSH под root-ом, попали в домашнюю директорию /root, запускаете gnugk, и он ищет конфигурационный файл gatekeeper.ini в директории /root . Завершить процесс Ctrl+C или killall gnugk.
 GNUGK слушает после брандмауэра, т.е. для проверки откройте все порты, потом после настройки затяните гайки…Краткий обзор конфигурационного файла. Для начала небольшие вводные: 
 - САМОСТОЯТЕЛЬНО ОЗНАКОМТЕСЬ С ОРИГИНАЛЬНЫМ РУКОВОДСТВОМ!- Файл имеет простой текстовый формат, состоит из секций, в квадратных скобках.
- Ниже секций указаны функции со значениями относящиеся к этой секции.
- Символ «;» означает комментарий, данную строчку начинающуюся с «;» gnugk не читает
 - ПРОБЕЛОВ НЕТ!
 - После изменения параметров желательно перезагружать процесс gnugk (не во всех случаях см. оригинальное руководство)
 Для примера, с объяснениями, мой конфиг:
 [Gatekeeper::Main] - Секция глобальных фукций
 Name=gatekeeper - Имя гейткипера, которое будут видеть ваши устройства
 TraceLevel=5 - Уровень детализации информационных сообщений, которые
 gnugk будет вам выводить в командной строке.
 CompareAliasType=0 - Игнорирование разницы типа псевдонима E164
 CompareAliasCase=0 - Игнорирование регистра имени алиаса
 Home=192.168.93.1,192.168.94.1,внешний IP - Указаны адреса на которых gnugk слушает порты
 ExternalIP=внешний IP - Указать Ваш внешний IP, без этого значения корректного приема входящих вызовов не будет
 [RoutedMode] - Секция ответственна за параметры направления сигналов
 GKRouted=1 - Включение направления сигналов
 H245Routed=1 - Включение управления каналом h245
 ;H245TunnelingTranslation=1 - Разрешить только одной стороне использовать
 туннелирование h245. При активации этой функции
 у меня пропадал звук…
 Q931PortRange=20000-20999 - Определить диапазон портов Q931
 H245PortRange=30000-30999 - Определить диапазон портов H245
 ;RemoveH245AddressOnTunneling=1
 ;RemoveH245AddressFromSetup=1
 ;TreatUnregisteredNAT=1
 AcceptNeighborsCalls=1 - Разрешить вызовы без проверки CallTable
 ;DisableRetryChecks=1
 ;ForwardOnFacility=1
 ;TranslateFacility=1
 AcceptUnregisteredCalls=1 - Разрешить не зарегистрированные конечные точки
 SupportNATedEndpoints=1 - Разрешить вызовы с конечных точек за NAT
 EnableH450.2=1 - Включить поддержку H450 если нужно
 ;EnableH46017=1
 ;EnableH46018=1
 ;EnableH46026=1
 ;DropCallsByReleaseComplete=1 - Если сеанс не завершается самостоятельно
 ;SendReleaseCompleteOnDRQ=1 - Если сеанс не завершается самостоятельно
 [Proxy] - Секция ответственна за ПРОКСИ режим, т.е. 
 Привратник направляет и управляет каналом H.245, а также
 все медиа каналы, включая RTP/RTCP для аудио и видео,
 и канал Т.120 для данных. В этом случае трафик не
 передается напрямую между конечными точками.Enable=1 - Режим Прокси включен 
 ProxyAlways=1 - Проксировать все вызовы без исключенияТаким образом, мой gatekeeper.ini, с которым Polycom успешно работает, выглядит вот так (пока не занимался с диапазоном портов): 
 [Gatekeeper::Main]
 Name=gatekeeper
 TraceLevel=5
 CompareAliasType=0
 CompareAliasCase=0
 Home=192.168.93.1,192.168.94.1,мой IP
 ExternalIP=мой IP[RoutedMode] 
 GKRouted=1
 H245Routed=1
 AcceptNeighborsCalls=1
 AcceptUnregisteredCalls=1
 SupportNATedEndpoints=1
 EnableH450.2=1
 ;EnableH46017=1
 ;EnableH46018=1
 ;EnableH46026=1
 ;DropCallsByReleaseComplete=1
 ;SendReleaseCompleteOnDRQ=1[Proxy] 
 Enable=1
 ProxyAlways=1Копируйте себе, вставляйте, и пользуйтесь!  
 
- 
 3) Мониторинг работы: 
 Здесь несколько способов:- При запуске с командной строки, дав команду gnugk, все логи действий отображаются прямо в консоли, увидите точно.
 Уровень детализации информационных сообщений, которые gnugk будет вам выводить в командной строке, определяются значением (от 1 до 5) функции TraceLevel, в секции [Gatekeeper::Main]. Например, TraceLevel=3.
- Если вы закрыли консоль, gnugk продолжает работу, а вы через некоторое время хотите увидеть как он там себя ведет, через консоль, то необходимо:
 (Пока не знаю что)
- Используйте соединение Telnet через “PuTTY” на 7000 порт, для этого изучите секцию [GkStatus::Auth]. Также ознакомьтесь с командами управления через Telnet.
 Для начала сделайте так, добавьте ниже приведенную секцию в ваш конфиг:
 [GkStatus::Auth]
 rule=allow
 Shutdown=allow
 - Также обратите свое внимание на модули для мониторинга GNUGK на сайте разработчика, я думаю на базе них можно для PFsense и пакет для мониторинга собрать…
 http://www.gnugk.org/gnugk-addon.html
 4) Автозапуск GNUGK 
 Вводная от производителя была такая:
 To let it start automatically on boot, you have to add
 gnugk_enable="YES" to /etc/rc.conf.
 And of course you should edit /etc/gnugk.ini to match your
 requirements.
 Regards,
 Jan
 …..
 Теперь подробнее. После установки появляется файл gnugk в /etc/rc.d/
 Если его попробуем запустить набрав в командной строке: /etc/rc.d/gnugk
 Gnugk выдаст перечень команд:
 Usage: /etc/rc.d/gnugk fast|force|one|quiet
 Вводим:
 /etc/rc.d/gnugk start
 Gnugk не стартует и выдаст предупреждение:
 WARNING: $gnugk_enable is not set properly - see rc.conf(5).
 Cannot 'start' gnugk. Set gnugk_enable to YES in /etc/rc.conf or use 'onestart' instead of 'start'.
 Открываем /etc/defaults/rc.conf . Добавляем в «Important initial Boot-time options»
 после строчки rc_conf_files="/etc/rc.conf /etc/rc.conf.local" добавляем:
 gnugk_enable="YES" Сохраняем, закрываем.
 Вводим:
 /etc/rc.d/gnugk start
 Получаем:
 Starting gnugk.
 Смотрим в Diagnostics: Sockets, GNUGK работает!
 ВАЖНО! При таком запуске GNUGK ищет конфигурационный файл в /etc/gnugk.ini . если его там нет, будет сообщение:
 WARNING: Config file /etc/gnugk.ini doesn't exist! Use the -c switch to specify the config file.
 Так что мы берем свой gatekeeper.ini ранее настроенный из /root, переименовываем в gnugk.ini и кладем в /etc/. Пусть там теперь и живет!
 Теперь если мы изменили конфигурационный файл и нужно принять
 изменения, вводим:
 /etc/rc.d/gnugk restart или reload
 Для остановки соответственно:
 /etc/rc.d/gnugk stop
 Также необходимо добавить в CRON
 * * * * * root /etc/rc.d/gnugk start**Перезагружаем наш PFsense, после загрузки идем в Diagnostics: Sockets и видим что GNUGK работает! И входящие звонки передаются на наше устройство и сеанс связи работает!!!!** 
- При запуске с командной строки, дав команду gnugk, все логи действий отображаются прямо в консоли, увидите точно.
- 
 В прикрепленных архив, не знаю админ поругает или нет, но не знаю как выложить… 
 В нем статья и сам пакет gnugk-3.8-freebsd-10.1-32.txz
 А также мои переводы мануала GNUGK 4 и 5 глава, правда 5 главу перевел не до конца...
 С уважением ко всем! Надеюсь эта статья поможет тем кто не может разрешить проблему с пробросом портов по протоколу H323
- 
 Спасибо огромное! 
- 
 werter! Тебе тоже спасибо! Ты пытался мне помочь!!! 
 Следующий мой этап в этом направлении, добавить в веб интерфейс PFsense модуль мониторинга для Gnugk!
 Тогда это будет полноценный мощный инструмент, а главное удобный!
 В этом направлении, бесплатные варианты:- GkGui http://www.gnugk.org/gkgui.html выполнен на Java
- GnuGK Console Viewer https://www.vc.dfn.de/download/ (a graphical Console viewer in Perl)
 Но я в этом не силен, кто сможет помочь?
 Скачал GkGui, разархивировал, папка с файлами, стартовый gkgui.html , т.е. хороший вариант для добавления в PFsense!
 Но он не запускается, что нужно сделать не знаю…
 
- 
 Попробуйте в англоветке разработчикам написать. Может и пакет сварганят с веб-фейсом. 
- 
 "Q931PortRange=20000-20999 - Определить диапазон портов Q931 
 H245PortRange=30000-30999 - Определить диапазон портов H245"Qsig сигнализация работает на порту 5004 (что у моего провайдера что у панасоника, с другими не имел дела, хотя это наверно все равно определено каким нибудь стандартом) 
 Р245 или RTP почти все оборудование которое встречалось работало на портах от 8000 до 20000 но в спецификации к передаче голоса определены порты 10000-20000 поэтому лучше указывать их.не проще ли сделать так 
 алиас ваших белых ип
 алиас портов для h323 1718-1720, 5004, и для ртп 10000-20000
 и указать в порт форварде алиас адресов, алиас портов редирект на ип в локалке
 и с локалки ип алиас портов на алиас адресов
 и зачем мучаться придумывать велосипед.
 стоял раньше tda-200 c ipgw-16 между подразделениями гонял так трафик. Сейчас уехали панасоники по подразделениям и дальше продолжают свою работу по такой же схеме.
 теперь еще и сип добавился. но опять же схема не намного усложнилась. добавил в алиас 5060-5061 и все.
 ну а на оборудовании указывал что rtp начинать с 10000 (как в панасонике)
 ну а если нет белых ип то только впн поможет.
 хотя это может и работает для меня, я наоборот стремлюсь все упростить и автоматизировать, но за проделанную работу все равно отлично.
- 
 "Q931PortRange=20000-20999 - Определить диапазон портов Q931 
 H245PortRange=30000-30999 - Определить диапазон портов H245"
 В данных дипазонах указываются порты не те что просто слушает GNUGK, а те которые GNUGK будет сообщать устройству для работы именно в этом диапазоне…"алиас ваших белых ип 
 алиас портов для h323 1718-1720, 5004, и для ртп 10000-20000
 и указать в порт форварде алиас адресов, алиас портов редирект на ип в локалке"
 Не совсем так, Polycom отказывался работать при такой конфигурации, может другие устройства и заработали бы но Polycom нет...
 Он может работать при простом форвардинге, но тогда нужно отключить поддержку H323, а это не гуд...Спасибо за оценку 
- 
 для h323 первые порты 1718-1723 и 5004 это его сигнализация. 
 голос уже идет потом по портам 10000-20000
 поэтому не вижу абсолютно никакого смысла ставить лишнюю прокладку. от устройства до устройства а с натом или без, железка будет решать по портам 1718-1723 и 5004 и эти порты для него самые важные.Не совсем так, Polycom отказывался работать при такой конфигурации, может другие устройства и заработали бы но Polycom нет… не видел вреднее железа чем плата ipfw-16 от панасоника. По началу я с ним намучался, придумывали самые разные схемы и остановились на таком примере как указал. 
 с Polycom не работал, хотя я не думаю что будет сильно отличаться от h323 протокола, хотя это больше похоже для видеоконференций. то может быть и правильно что использовался сторонний софт.Он может работать при простом форвардинге, но тогда нужно отключить поддержку H323, а это не гуд… так тут вроде как шла речь при работе устройства связи (голоса или видео) по протоколу h323. для видео может еще порты нужны, но вот для h323 нет. а не пробовали ли вы его прошить под sip например как audiucodes mp-118, когда можно перепрошить его под нужную конфигурацию. 
- 
 Перепрошить POLYCOM это опасно, без з/п остаться надолго и с записью в трудовую книжку о не соответствии с занимаемой должностью 
- 
 ну не знаю, проблем с возвратом (если поставщик нормальный нет). А перепрошивка устройства не попадает под раздел о не соответствии с занимаемой должностью . Это одна из обязанностей. Вот если это делать без бесперебойника то тогда да.