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-3.8-freebsd-10.1-32.txz
    А также мои переводы мануала GNUGK 4 и 5 глава, правда 5 главу перевел не до конца...
    С уважением ко всем! Надеюсь эта статья поможет тем кто не может разрешить проблему с пробросом портов по протоколу H323

    GNUGatekeeper.zip.txt
    perevod.zip.txt



  • Спасибо огромное!



  • werter! Тебе тоже спасибо! Ты пытался мне помочь!!!
    Следующий мой этап в этом направлении, добавить в веб интерфейс PFsense модуль мониторинга для Gnugk!
    Тогда это будет полноценный мощный инструмент, а главное удобный!
    В этом направлении, бесплатные варианты:

    1. GkGui http://www.gnugk.org/gkgui.html выполнен на Java
    2. 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 это опасно, без з/п остаться надолго и с записью в трудовую книжку о не соответствии с занимаемой должностью



  • ну не знаю, проблем с возвратом (если поставщик нормальный нет). А перепрошивка устройства не попадает под раздел

    о не соответствии с занимаемой должностью

    . Это одна из обязанностей. Вот если это делать без бесперебойника то тогда да.