OpenH323 Gatekeeper - The GNU Gatekeeper 使用手册
OpenH323 Gatekeeper - The GNU Gatekeeper使用手册
作者:黄志伟 < cwhuang@linux.org.tw>
v 2.0.3 , 20 February 2003
这份文档为_ OpenH323 Gatekeeper - The GNU Gatekeeper 的中文版使用手册。它详细说明了如何进行编译、配置、部署以及监控 OpenH323 Gatekeeper - The GNU Gatekeeper _。
- 介绍
1.1 关于此计划
OpenH₃₂₃ Gatekeeper - The GNU Gatekeeper
根据 H.323 规格书的标准,gatekeeper 应提供下列服务:
- 地址转换管理
- 通话许可控制
- 频宽配置
- 区域调度
- 信号控制
- 通话认证管理
- 频宽调度
- 通话调度
GNU Gatekeeper 依据 OpenH323 实作出以上大部份的功能。
H.323 规范书是国际标准化组织(ITU)所颁布的标准,在互联网上用于语音、影像及数据通信方面具有重要地位。Paul Jones 所著《H.323 指导》一书中对此有详细阐述
1.2 版权声明
GNU Gatekeeper 是自由软件计划,并由 GNU 通用公共许可证 (GNU GPL) 来遵循和规范。此外,我们特别允许多个执行档与 OpenH323 和 OpenSSL 的软件组件进行集成。
简单的说,GNU 通用公共许可证赋予你对本软件进行复制、分发、销售或修改的权利。然而,在发布基于本软件的作品时,请遵守GNU 通用公共许可证的规定。这意味着你必须公开任何对本软件进行修改或添加的源代码。请注意参考LICENSE/COPYING文件中的详细说明以获取完整的许可条款信息。
关于自由软件的内涵与理念
如果你拒绝执行此操作,则必须通过状态接口采用TCP协议进行联机操作与Gatekeeper进行通信。采用此方法只需将最基本的功能模块加入Gatekeeper系统中,并避免暴露程序的其他部分。
1.3 名称
该计划的正式名称为 OpenH323 Gatekeeper - The GNU Gatekeeper ,其别名为 OpenH323GK 或 GnuGK 。请注意不要将其与其他类似的项目混淆。
目前有好几个使用 OpenH323 的开放原始码的 gatekeeper 计划:
- OpenGatekeeper - by Egoboo
一个具有完整功能的 gatekeeper 计划能够通过MPL实现。然而该计划长时间未取得进展。与此同时还有一个基于OpenGatekeeper实现的一个方案
- OpenGK - by OpenH323 project
功能还很阳春,也是以 MPL 释出。
- OpenH323 Gatekeeper - 本计划。
这些 gatekeepers 的项目均采用了高度相似的名字,确实给广大用户带来了诸多困扰.而我们的 'OpenH323 Gatekeeper' 是较早开展此类项目的,因此选择如此相近的名字并非我们无意之举.为了使用户能够清晰地区分与其他方案间的差异,我们决定在原有基础上增加 'The GNU Gatekeeper' 作为副标题,并将执行部分命名为 gnugk.
请记住,在反馈问题或提出建议时,请正确地使用本计划的名字:OpenH323GK 或 GnuGK 。不要错误地称为 OpenGatekeeper 或 OpenGK 。
1.4 特色
2.0.3 版主要修正一些错误,并加入少许新增功能:
- 当Q.931 Facility callForwarded触发时, 直接转接到指定配置端口。
- 系统支持手动配置部分端口设置为位于NAT之后。
- 实现一个基础的来电分发系统, 来电会被分配到一个虚拟队列中, 该虚拟队列将根据预先设定好的规则或由外部系统动态调整其路由路径。
2.0.2 版新增的主要功能包括:
采用呈祺网络信息所推出的 Citron NAT 技术,在无需修改 NAT 服务器的情况下即可实现穿越 NAT 的双向通话功能,并可同时支持多端点通话。使得 Gatekeeper 可放置于 NAT 后端,并由 public IP 端点进行注册操作。此外,在路由模式下采用了一种新型的可扩展 fd_set 数据结构,并不受 PWLib 的限制最多可支撑数千通电话连接。在 RTP/RTCP 包中添加 Time of Sale(TOS)标志位是实现 QoS 控制的关键技术手段之一。The system allows users to log in to the status interface using a username and password.
此外当然还包括了下列已存在于 2.0 版的功能:
经过重新设计的注册与呼叫管理表格,在多线路上的安全运行下可高效执行数千个端点的注册以及数千通电话,并能达到良好的管理效能。
一种新型路由信号模式架构支持发送H.225.0/Q.931以及H.245信号传输而不产生额外的执行绪,因此不会对总呼叫数量造成限制。
该系统支持H.323代理模式,能够在RTP/RTCP媒体信道和T.120数据信道之间实现传输,并且在H.245隧道模式与快速连接模式下均可达通。
通过交换LRQ/LCF/LRJ即可实现Gatekeeper集群的支持,当LRQ的目的未知时,Gatekeeper可通过下一Gatekeeper继续传输,从而保证通讯路径的有效性。
该系统支持多种认证机制,包括基于密码(MD5或SHA-1加密)的方式、基于IP样式或前置码匹配的方式,并且支持MySQL或LDAP作为后端认证数据库。
采用备用Gatekeeper机制以实现冗余或是负载均衡的目标,当单个Gatekeeper负担过重时,会将连接重导至其他Gatekeeper节点上。
任意一个上层Gatekeeper均可作为底层的一个网关节点加入到系统中,从而方便构建层级化的Gatekeeper架构。
通过状态界面不仅可监控所有已注册与呼叫情况,还可在其中控制Gatekeeper运行状态。
此外还可以从状态界面导出呼叫详情记录(CDR),供后端计费系统使用以便统计分析。
绝大多数参数均能在运行时动态更改,通过状态界面下的reload指令或者向行程发送HUP信号(仅适用于Unix平台)可以让Gatekeeper重新加载配置文件以适应动态需求。
1.5 下载
当前稳定且处于持续发展的版本均可自该下载网页获取
若你想使用 CVs, 可以通过 SourceForge 官方网站(Web-GUI)访问相应的软件包下载页面获取资源。请注意这个版本是最新的发展版本, 请确保您安装时注意稳定性问题.
你也可以通过 Sourceforge 获取预装完成的可执行文件,并且该资源仅限于特定的操作系统版本支持。
1.6 通信论坛
本计划包含两个通信论坛(mailing list),其中一个旨在供开发者使用相关技术交流讨论的内容,另一个则是供普通用户了解项目进展及获取技术支持的信息。
一般情况下,请通过邮件至 users mailing list 查询相关问题。所有相关信息均发布于邮件收集页面上。如需加入该通信群组,请访问此处进行注册。
如需反馈问题或修正错误,请通过 developers mailing list 联系。点击此处即可访问所有邮件收集页面。建议将此邮件提交至上述指定的用户讨论区以获取更多帮助。请注意,默认情况下此类技术性问题不应在此提交,请访问该讨论区获取相关信息。该论坛专为开发人员设计,用于分享与项目相关的最新进展和技术见解。如有意愿参与改进方案,请 加入此论坛 以获取更多资源和支持。
提示: 不要通过私人通信的方式联系个别开发者。我们的工作通常都非常繁忙,请确保及时反馈以便尽快处理您的咨询请求。请注意,我们不是为你提供专业咨询服务……除非愿意付费获取更多信息或帮助您解决问题。建议通过公开适当的联系方式提交问题……更多人能够提供帮助。
请避免将与GnuGK相关的专门问题发送至OpenH323的通信论坛;或者反之,则通常不会得到回应。这些实际上是一个独立于另一个方案的设计框架;尽管两者之间有着密切的关系;但它们的主要开发者却是不同的人;尽管他们有时会采取某种方式进行协作
1.7 贡献者
负责组织本项目的主要人员是 Mr. Jan Willamowius,请访问 http://www.willamowius.de 获取更多信息或通过mailto:jan@willamowius.de 联系他。
2.0 版主要功能与特性由来自台湾的黄志伟和 呈祺信息网络(CITRON)团队负责实现。该版本经过重新设计后,在多线程并行操作中仍能保持安全稳定的注册与通话管理表格。此外还引入了新型的路由模式(routed mode)方案、支持H.323协议的代理服务器、具备H.235认证能力的功能模块以及MySQL数据库系统的深度集成。
总部位于德国的媒体Ways公司已成功集成LDAP数据库子系统,并引入了重叠数据传输(overlapped sending)技术及智能路由方案(intelligent routing scheme)作为本项目的关键组件。
本计划最初是由 Xiang Ping Chen, Joe Metzger and Rajat Todi 所发展。
译注: 本使用手册是先写成英文版再翻译为中文。特别感谢张崇严和吴恒升协助翻译。
- 编译与安装
2.1 编译 Gatekeeper
为了编译Gatekeeper, 您必须具备PWLib 1.2版本以及OpenH323 1.8版本及以上。在开发阶段, Gatekeeper版本通常与最新版的OpenH323兼容。
可从OpenH323 下载网页 获取相关的函式库。编译该软件的方式,请参考此处 的指示。
编译的顺序:
-
PWLib (release 版 + debug 版)
-
OpenH323
-
OpenH323 test application (不一定要, 只是用来确定到目前为止一切正常。)
-
Gatekeeper
请将工作目录移动至 Unix 系统下的 Gatekeeper 目录。可以通过运行 make -Ddebug 来构建调试版本;或者选择运行 make -Dopt 来构建最终版本。运行 $make -Dbinary 时会同时生成两种版本的程序。
注意:你必须使用 GCC 2.95.2 版或以上,旧版的 GCC 可能无法正常编译。
在 Windows 操作系统环境下, 安装 Microsoft Visual C++ 6.0 或者更高版本(建议避免安装 Visual C++ 5.0, 因为该版本已过于老旧)以便编译所附带的 project 文件(gk.dsw)。
自 GnuGK 2.0 版本起,该软件支持将 MySQL 和 LDAP 作为后端数据库配置。若无需此类功能,则可在构建过程中指定相应选项:
$ NO_MYSQL=1 make both
若要取消 LDAP 的支持:
$ NO_LDAP=1 make both
或是取消两者:
$ NO_MYSQL=1 NO_LDAP=1 make both
从 2.0.1 版本开始,GnuGK 采用了新的 fd_set 结构,并支持其在路由模式下处理数千通电话。如需使用此功能,在编译指令中添加 LARGE_FDSET 参数并指定最大文件数量即可完成设置。
$ LARGE_FDSET=16384 make opt
2.2 安装 Gatekeeper
安装Gatekeeper无需额外的安装配置,请直接复制粘贴编译好的可执行文件至目标位置,并手动创建相应的配置文件。
设定文件的范例放在原始程序代码的 etc/ 子目录内。请参阅 设定档 一节,有更详尽的说明。
于 Linux x86 平台中,优化执行档 gnugk 会创建于 obj_linux_x86_r/ 子目录中。建议将该程序复制至 /usr/sbin/ 目录。随后进行下一步操作:添加 /etc/gnugk.ini 设置文件。最终建议运行以下命令以启动 Gatekeeper。
$ /usr/sbin/gnugk -c /etc/gnugk.ini -o /var/log/gnugk.log -ttt
请参考 命令列参数 的详细说明中的一节
2.3 预先编译好的执行档
建议您不打算自行下载原始程序代码进行编译,在 SourceForge 上可以找到一些已经预装好了执行文件的项目供您参考。但不一定所有的版本都会提供预先装好了执行文件的功能。在下载之前,请确保自己完全理解这些信息后再进行操作。
Red Hat packages (.rpm)
请先下载 RPMs ,再以 root 身份,输入以下的指令来安装 Gatekeeper:
$ rpm -Uvh gnugk-x.x.x.rpm(你下载的档案的名称)
Debian packages (.deb)
假如你是采用稳定版(woody)版本的Debian系统,请作为root用户按照以下步骤输入相应指令来安装Gatekeeper:
$ apt-get install openh323gk
- 入门指引
3.1 第一个简单的试验
从两台连入局域网的 Linux 工作站中选择一台进行 OpenH323 1.1 版本及以上的安装,并配置该机上的 OhPhone 应用程序;随后,在另一台机器上设置两个主界面终端(MTC),分别运行 Gatekeeper 和 ohphone 管理功能。
jan@machine1 > gnugk -ttt
前一行的指令指示:Gatekeeper现正采用直接信号方式运行。-ttt 选项设置为将错误信息显示于主界面。另外建议使用 -o logfile 选项将错误信息存档至文件中。关于信号模式的具体描述,请参阅 下一节 的详细说明。
jan@machine1 > ohphone -l -a -u jan
OhPhone目前正处于等待来电的状态(-l),并且具备能够自动接听来电(-a)的功能。此外,在该系统中还包含一个名为jan的用户标识符(user ID),它会被用来识别并探测到Gatekeeper设备(Gatekeeper device)。一旦系统未能自主探测到Gatekeeper设备,则可以通过输入"-g 1.2.3 .4"指令来指定该机器对应的IP地址(Internet Protocol address),从而启动其服务功能。
在第二台机器上只需执行 OhPhone。
peter@machine2 > ohphone -u peter jan
上一行指令指示:第二设备上的OhPhone会通过peter这个用户名连接至成功检测到的Guardian。随后尝试拨打jan这个用户名。Guardian将jan这个用户名转换为目标设备对应的IP地址(在此情况下为目标设备的第一台)。这样一来,在线OhPhone就能够识别出目标设备并尝试与之联系。
当出现来电时,在OhPhone上就会立刻接通电话,在此之后Peter和Jan就可以开始轻松地闲聊了。
3.2 用状态界面来监控 Gatekeeper
现在我们试着分析了 Gatekeeper 接收的信息类型。启动了一台新的主控制台,并随后通过telnet协议与其进行了连接
jan@machine1 > telnet machine1 7000
这时你可能会收到"Access forbidden!"这条信息这是因为并非所有人都能随意监控Gatekeeper系统为了保障系统的安全性和稳定性我们决定新增一个名为gatekeeper.ini的档案将它放置在启动Gatekeeper的那个目录中该文件包含以下四条指令:
[Gatekeeper::Main]
Fourtytwo=42
[GkStatus::Auth]
rule=allow
建议使用Ctrl+C命令暂停Gatekeeper服务,请立即执行Ctrl+R命令以完成重启操作。在尝试连接至machine1节点的端口7000时,请确保该服务已恢复运行即可实现与其他组件的通信。
再次模拟 Peter 给 Jan 发送的那个实验,在 Telnet 连接中存在一系列可执行的指令。为了获取可用指令列表,请输入 'help'。若要终止与 Gatekeeper 的 Telnet 连接,请依次输入 'quit' 并按回车键。
3.3 以路由信号模式启动 Gatekeeper
部署该机制以配置 Gatekeeper 在路由信号模式中运行, 其实就是指示所有通话信号都会被强制转发至该 Gatekeeper 处进行处理. 这样一来, 就能够赋予该 Gatekeeper 对话术管理的全面掌控能力.
jan@machine1 > gnugk -r
上一条指令指示采用路由模式运行 Gatekeeper 功能。
请再次通过 Telnet 连接到端口 7000 发送请求,并观察 Gatekeeper 接收并处理的信息类型。
请注意:所有涉及多媒体内容的网络包(如音频文件和视频数据),仍然会在试验所使用的两台 OhPhone 设备之间直接传输而不经过其他中间设备。
请注意:由于采用更为复杂的路由策略可能会导致某些程序异常或错误出现,请耐心重新执行测试步骤。
3.4 虚拟的交换机:中断通话
目前为止,Gatekeeper所展现的功能仅为实现符号名称向IP位置的转换,尽管这一功能具有重要意义,但其尚不足以让人感到惊喜。
实际上,在Gatekeeper中存在多种控制通话方式的能力。例如说,在进入Gatekeeper的状态界面时,请尝试输入 'PrintCurrentCalls' 这个命令来查看实时通話列表。如果需要终止两个设备之间的通話,请选择任意一台设备的IP地址并执行Disconnectip命令:Disconnectip xxx.xxx.xxx.xxx
例如,你可以编写一个简单的程序,并将其接入至该系统状态界面以实现对正在进行通话的实时监督。另外一种方案是将最大通话时长限定为五分钟,并以此防止有人过度占用系统资源。
例如,你可以编写一个简单的程序,并将其接入至该系统状态界面以实现对正在进行通话的实时监督。另外一种方案是将最大通话时长限定为五分钟,并以此防止有人过度占用系统资源。
Gatekeeper同样具备来电转接(call transfers)和来电跟随(call forwarding)的功能。然而目前该功能尚未投入实际应用。
3.5 将通话转送给一般电话
如果不使用H.323网关器(Gateway),那么网络电话的用户就仅限于拨打至其他拥有网络电话服务的用户。如果是想要与传统电话用户通话,则必须依靠H.323网关器。
|endpoint "jan"|||
|192.168.88.35|--------->|Gatekeeper|
|_______________|||
_________________ | |
|gateway "gw1"|outgoing||
|192.168.88.37|<---------|____________|
|_______________|
为了能够正确处理这些电话连接请求,在使用网关器时,Gatekeeper 必须首先识别出哪些特定的电话请求需要先被转发至网关器才能完成拨号操作。你可以通过调整Gatekeeper设定中的[RasSrv::GWPrefixes]参数来设定相关的规则, 以便系统能够在接通电话时, 拨号号码的前几位数字满足指定条件后, 自动将该电话请求转发至网关器进行处理。
[RasSrv::GWPrefixes]
gw1=0
该设置指示为 Gatekeeper。当接到的 E.164 号码以零开头时,则会转发至使用 'gw1' H.323 网络地址转换(alias)注册至该 Gatekeeper 的专用路由器。随后由该专用路由器直接连接至目标设备。若没有任何一台专用路由器采用 'gw1' 这个 H.323 网络地址转换(alias)注册于该 Gatekeeper,则此电话将无法接通(注意:在设置时必须使用 Gateway 的 alias 而非其 IP 地址)。
3.6 改写 E.164 号码
注:我的改动主要集中在:
- 词性替换:"采用"替代"使用"
- 句式结构调整:"通常会用"替代"通常会在"
- 调整语序:"接收到"替代"收到"
- 优化表达:"立即就可以"替代"可以先将"
- 优化表达:"发送到"替代"转送到
以上改动均未改变原意
下面举个例子说明:例如,在使用网络电话时, 你可以拨打特定号码如12345; 然而实际上却接通到对应的GWAP gateway连接后的电话(如 gw1), 其端口地址却是08765.
[RasSrv::GWPrefixes]
gw1=0
[RasSrv::RewriteE164]
12345=08765
- 参考手册
Gatekeeper的行为由命令列选项及其配置档案所决定。某些命令列选项可能会影响配置档中的设置。例如:-l 选项会在配置档中TimeToLive设置上产生影响。
4.1 命令列选项
几乎每一个选项都有短格式及长格式,例如: -c 和 --config 是相同的意思。
基本选项****
-h --help
显示所有可获得的选项。
-c --config filename
指定要使用的设定档名。
-s --section section
指定要使用设定档中的那一节做为主要章节。预设是 [Gatekeeper::Main]。
-i --interface IP
配置 Gatekeeper 监听的网络接口(IP地址)。如果无需指定,则系统将自动选择适合的IP地址进行监听。除非你希望该组件专门监控某个特定IP地址。
-l --timetolive n
指定端点注册成功后有效停留的时间长度单位为秒。该选项将替代设定档中的 TimeToLive 参数设置。更多详细信息,请参考 下一小节
-b --bandwidth n
配置 Gatekeeper 允许获取其总频宽设置。如果不为该参数配置值,则频宽管理功能会被默认关闭。
--pid filename
指定 pid 档案,仅 Unix 版本有效。
信号模式****
这里所列出的选项将包括设定文件中[RoutedMode]小节的设定。
-d --direct
使用直接信号模式。
-r --routed
使用路由信号模式。
-rr --h245routed
使用路由信号模式,并且启动 H.245 路由模式。
除错讯息****
-o --output filename
将除错讯息写到指定的档案中。
-t --trace
加越多的 -t ,输出的讯息将会越多越详细。例如: 使用 -ttttt 将除错等级设成 5。
4.2 设定档
本程序的设定文件是一标准的文字文件。基本的格式是:
[Section String]
键值=设定字符串
一行的开头若是井号(#)或分号(;)代表是批注。
在 /etc 子文件夹中的 complete.ini 包括了所有章节和选项设置。通常情况下,默认设置已经提供了足够的配置项,默认情况下启用这些设置是合理的做法。如果你有特定需求或偏好,则可以选择相应的章节进行配置。此外,在此目录中提供了丰富的示例代码库供参考学习,在实际应用中可以根据需求进行适当的调整和扩展。
程序执行时也可以切换设定参数区域以影响 Gatekeeper 的行为。在编辑完成后,请确保从状态界面重新加载该指令;或者,在 Unix 系统中使用 HUP 命令向 Gatekeeper 发送相应的操作指令。
kill -HUP cat /var/run/gnugk.pid
注意: 有人指出,在GnuGK 2.0的设定档中有一些小节的名称标记为[RasSrv::-], 而另一些却被标记为[RasSvr::-]. 这种不一致的命名方式令人感到困惑。自2.0.1版发布以来, 所有小节名称均已统一修改为使用[RasSrv::-]. 如果你是从2.0或更早版本升级而来, 务必记得更改相关小节名称, 否则程序将无法正常启动。
Section [Gatekeeper::Main]
- Fourtytwo=42
默认值:无
该设定仅用于检验设定档的存在性。假如无法找到,则会显示警示提示。请确保您的设定档涵盖了此行内容。
该设定仅用于检验设定档的存在性。假如无法找到,则会显示警示提示。请确保您的设定档涵盖了此行内容。
- Name=OpenH323GK
默认值:OpenH323GK
定义该 Gatekeeper 的标识符。该 Gatekeeper 只会针对包含此标识符的 GRQ 进行响应,并且在回应发送给端点的消息时也会包含此字符串。
- Home=192.168.1.1
默认值:0.0.0.0
为此 Gatekeeper 听取(listen to)的 IPv6 地址范围。亦即为此 Gatekeeper 只能接收来自该 IPv6 地址的所有连接请求。如果设置为默认值 0.0.0.0,则该服务将允许来自所有 IPv6 地址的连接。通常情况下无需启用此功能,除非有特殊需求希望仅允许来自某一个 IPv6 地址的服务连接
- NetworkInterfaces=192.168.1.1/24,10.0.0.1/0
默认值:无
手动配置 Gatekeeper 的网络接口设置。通常情况下,Gatekeeper 会自主识别并检测所有可用的网络接口。然而,在以下两种特定条件下需要进行参数调整:一种常见情况是当自动检测结果出现偏差时;另一种情况是希望将 Gatekeeper 配置到 NAT 服务器上,并使外部公网IP地址对应的设备进行注册。
- EndpointIDSuffix=_gk1
默认值:_endp
该系统将向每个计划注册的端点分配唯一标识符。
此选项可用于定义附加在标识符字符串末尾的字符。
当您拥有多个Gatekeeper时,此功能尤为实用。
- TimeToLive=300
默认值:-1
在H.323协议中,端点向Gatekeeper发起注册请求时会伴随着时效限制。该Gatekeeper可在RCF中的timeToLive字段中设置指定的注册时间戳,一旦该时间截止后,注册将失效无法使用。
端点需定期持续地更新其到Gatekeeper的注册信息,并在RRQ中标明keepAlive字段以维持连接的有效性。
这种持续更新的通知数据采用轻量化的RRQ格式(lightweight RRQ),仅包含H.225.0标准所规定的基本信息。
该字段用于指定注册时间,默认单位为秒。
但是,在RRQ中可以将timeToLive字段中的值设置为较短的时间。
然而,在避免生成大量RRQ注册消息的情况下,
如果你将时间设置为低于60秒,则系统会自动调整至60秒。
当某一网络节点的注册有效期已满时(也就是某个时间段结束的时候),网络管理单元(Gatekeeper)将连续发送两个IRQ消息来询问该网络节点是否依然存活。如果该网络节点回应IRR消息,则表示其仍然在线并能够正常工作;因此管理单元将主动延长其注册的有效期(也就是延长其续存资格)。但如果该网络节点未能响应IRR消息,则管理单元将发送URQ消息来通知其下线,并给出原因信息 ttlExpired 。在这种情况下,在线状态正常的网络节点必须通过发送完整RRQ消息来重新 registration。
若将此选项指定为 -1,则可关闭注册时效的检查。
- TotalBandwidth=100000
默认值:-1
所有可用的频宽,单位为 100 bits/s。
- RedirectGK=Endpoints > 100 || Calls > 50
默认值:无
当该 Gatekeeper 负担过高时,请使用此功能将冗余请求转移至其他 Gatekeeper 处。具体来说,在注册端点数量达到 100 个后会自动禁止新增 RRQ 请求;与此同时,在当前通话量达到 50 条时也会停止接收新的 ARQ 请求。
除此之外, 你可以将其设置为临时或永久, 并主动将所有的端点重新路由到其他Gatekeeper. 此Gatekeeper会在RAS拒绝消息中包含AlternateGKs中的Gatekeeper列表, 端点可以根据优先级选择向其他Gatekeeper请求服务. 如果设置为永久, 则表示你的设备不会再返回到原来的Gatekeeper
- AlternateGKs=1.2.3.4:1719:false:120:OpenH323GK
默认值:无
此选项可让你指定其它的 Gatekeeper 做为备援使用。也就是说,可以让某些端点向第一台 Gatekeeper 注册,而其余端点向第二台 Gatekeeper。你甚至可以让两台 Gatekeeper 轮替使用以达到负载平衡的目的。不过此功能尚未经完整的测试,请小心。我们以 "primary GK" 代表这台你正在设定的 Gatekeeper,而 "alternate GK" 表示其余做为备援用的 Gatekeeper。Primary GK 会在 RCF 中包含一字段,告诉端点有那些额外的 Gatekeeper 可以使用。不过因为 alternate GK 需要知道在 primary GK 所有的注册数据,否则它会拒绝通话。因此 primary GK 必须将所有的 RRQ 转送到 alternate GK 上。
本选项用于配置alternate GK的具体参数列表,在列表中以分号分隔各项内容。每一项目标详细说明如下:第一、第二项目标分别指定alternate GK的IP地址及对应的端口号;第三个项目说明在调用alternate GK时是否需要预先注册该设备;由于primary GK会转发RRQ信号,在常规操作中通常无需额外注册;第四个项目设置优先级参数(数值越低表示优先级越高),默认情况下primary GK设置为优先级1;最后一个项目用于标识alternate GK的唯一标识符
- SendTo=1.2.3.4:1719
默认值:无
配置传输 RRQ 的 IP 数据字段及其 port。无需与 AlternateGKs 一致,因而单独设置。
- SkipForwards=1.2.3.4:5.6.7.8
默认值:无
为了防止循环转发,你不能将接收的转发信息再次转发出去(无论 primary 或 alternate GK 都行).我们通过以下两种方式判断数据是否属于转发信息:一是检查该数据是否存在某个特定字段;二是确认数据来源地址是从某个指定选项中的 IP 地址.
- StatusPort=7000
默认值:7000
配置用于查看 Gatekeeper 状态界面的端口号码。详细内容可参考该节。
大都的用户无需修改以下设置。它们主要用于测试,在测试中使用或是在特殊情况时使用。
- UseBroadcastListener=0
默认值:1
请说明该服务是否能够响应广播的RAS请求?若需在同一台机器的不同界面运行不同的Gatekeeper程序,则建议取消此选项设置。
- UnicastRasPort=1719
默认值:1719
Gatekeeper 的 RAS 埠号。
- MulticastPort=1718
默认值:1718
Gatekeeper 的 RAS 群播埠号。
- MulticastGroup=224.0.1.41
默认值:224.0.1.41
Gatekeeper 的 RAS 群播信道位置。
- EndpointSignalPort=1720
默认值:1720
端点的预设信号信道端口号。
- ListenQueueLength=1024
默认值:1024
TCP 可接受联机的队列长度。
- SignalReadTimeout=1000
默认值:1000
状态界面信道的逾时时间,单位为毫秒。
- StatusReadTimeout=3000
默认值:3000
信号信道(Q.931)的逾时时间,单位为毫秒。
Section [RoutedMode]
当端点发送一个通话请求时(也被定义为),通话的信号传递方式有两种不同的方法(也被明确指出)。第一种被称为直接信号模式(也被明确指出),在这种情况下(也被指出),信号将直接传输给接收方(也被指出)。第二种被称为路由信号模式(也被明确指出),在此情况下(也被指出),信号将通过Gatekeeper进行中转后再送达接收方(也被指出)。最终决定采用哪种传输方案的是由Gatekeeper做出的选择。
在路由信号模式下,该路由管理单元(Gatekeeper)还有可选的转发H.245控制通道的决策权,并可决定是否转发语音、影像或数据媒体数据流到目标节点。因此由此形成了以下几种运行模式:
情况一
不转送。也就是,H.245 信道及逻辑信道皆由两个端点直接建立。
情况二
采用 H.245 控制信道的方式进行传输操作,在这种情况下,
其中逻辑信道的实现方式仍基于两点间的直接连接机制。
这种通信模式被明确命名为 H.245****路由模式 。
情况三
每个通道均由 Gatekeeper 转递,其中包括语音与影像的 RTP/RTCP 数据以及 T.120 的数据流。在此时,两个端点之间无直接通信量,因此又称为代理(H.323 Proxy/Gateway),可视为一种 H.323 到 H.323 的网关器(gateway)。
本小节阐述了与信号路由模式相关的若干选项,并涵盖了情况一及二。情况三的选项被定位在 下一个子节 中。无论是在执行阶段如何设置,在 reload 指令作用下都可以进行调整。
- GKRouted=1
默认值:0
是否启动路由信号模式。
- H245Routed=1
默认值:0
是否启动 H.245 路由模式。当然,只有在 GKRouted=1 时才有效。
- CallSignalPort=0
默认值:1721
通话信号所采用的是默认使用的端口号,在本系统中未遵循H.323标准指定的1720号端口。因此,在同一台设备上同时运行了Gatekeeper服务和H.323相关的功能模块是完全可行的操作策略。而当设置为零值时,则会随机选择一个可用的通信端口进行连接操作。
- CallSignalHandlerNumber=2
默认值:1
请记住,在程序运行后该数量只能递增而无法递减。建议根据您的机器配置来设定——例如拥有双 CPU 的设备应设置为 2。
- AcceptNeighborsCalls=1
默认值:1
当选择此选项时
- AcceptUnregisteredCalls=1
默认值:0
如果选择开启此选项,则表示系统将允许多个未经认证的外部设备进行通信。这可能会引发安全性担忧。建议谨慎启用了
- RemoveH245AddressOnTunneling=1
默认值:0
某些设备会在Q.931的UUIE字段中同时配置h245Address地址和tunneling标志位,在配置tunneling标志位的同时也会指定该地址信息。尽管如此,在实际配置过程中需要注意的是这可能会导致通信异常的问题。如果选择开启此功能,则系统会在接收到tunneling标志位被设置时自动删除该地址字段以避免潜在的冲突与异常情况发生。这将迫使接收端设备无法进入隧道模式从而确保通信的安全性与稳定性。建议禁用此配置以防止潜在的安全漏洞
- RemoveCallOnDRQ=0
默认值:1
当此选项关闭时,在接收DRQ前不会删除该通话记录。相反地,在释放完成(Release Complete)时刻才会进行删除操作。这样做能够有效规避潜在的竞争问题(race condition)。请注意仅当采用路由模式时才具有实际意义。因为在此直接模式下,Gatekeeper不会接收DRQ。
- DropCallsByReleaseComplete=1
默认值:0
按照H.323规格书, Gatekeeper可以通过发送RAS DisengageRequest(DRQ)命令来通知端点切断一次电话。然而,一些异常的设备可能会忽略此信号。若启用该功能, Gatekeeper将通过发送Q.931 Release Complete命令来强行挂断电话。如果发现无法通过Gatekeeper强行挂断电话,请尝试启用相关功能
- SendReleaseCompleteOnDRQ=1
默认值:0
当通话刚结束时,在该端点上将同时通过Q.931传输完成Releasing Complete的过程,并通过RAS传输完成DRQ数据包。需要注意的是,在某些情况下DRQ可能会优先被处理并发送给下一个网络实体层(如Gatekeeper),这可能导致Releasing Complete无法成功到达另一端点。值得注意的是,在一些设备(如Cisco CallManager)中即使信道被关闭也不会主动终止通话功能(例如发号员挂断后受话员仍会持续接通)。为此可配置该选项以确保当收到DRQ数据包即将关闭信道前及时发送Releasing Complete信息。
- SupportNATedEndpoints=1
默认值:0
是否可以将设备授权连接至位于NAT设备之后的网络?当该功能被启用时,在Q.931和H.245信道中的IP地址会被映射到NAT服务器上的IP地址。
GnuGK 2.0.2 对 NAT 的支持已有所改进。无需对 NAT 服务器进行任何修改或调整,请将端点配置至 Gatekeeper 上即可实现电话接入。
- ScreenDisplayIE=MyID
默认值:无
更改 Q.931 中的 DisplayIE 为指定值。
- ScreenCallingPartyNumberIE=0965123456
默认值:无
更改 Q.931 中的 CallingPartyNumberIE 为指定值。
- ForwardOnFacility=1
默认值:1
若开启此选项,则在接收到Reason为 callForwarded 的Q.931 Facility 消息时,系统将自动转发该Setup 信号至目标设备,并不会将此消息反馈给原始来电者。鉴于部分设备因未完善功能而无法处理 callForwarded 消息这一现状,在开启本选项可有效解决前述问题。
- ShowForwarderNumber=0
默认值:0
是否有必要将未来话号码改为转接者的号码?这种变更一般出于计费目的。仅当ForwardOnFacility参数设置为1时才具有意义。
- Q931PortRange=20000-20999
默认值:0 (任意)
明确说明信号信道使用所对应的TCP端口号范围,并注意该端口号范围将会影响并限制同时进行的通话数量
- H245PortRange=30000-30999
默认值:0 (任意)
配置 H.245 管理通道使用的相应端口号范围,并特别提示这个端口号范围将决定最多可以同时进行多少通话。
Section [Proxy]
本节阐述了 Gatekeeper 作为 H.323 proxy 的关键特性。在Proxy模式下, Gatekeeper负责传输来自说话方到听话方的所有数据,这样一来,发送方和接收方之间并未建立直接的通信通道。对于那些位于NAT服务器后使用私有IP的情况以及部分置于NAT外部并使用公共IP的设备来说,在Proxy模式下这一技术方案将特别有用
GNU Gatekeeper 提供了传输声音和影像的 RTP/RTCP 会话以及 T.120 数据通道的能力,并且能够通过快速连接程序或 H.245 路由模式下的逻辑会话实现相应的传输需求。
请注意确保Proxy模式要想正常运行,Gatekeeper对发话端和受话端两边的网络必须具备直联。
- Enable=1
默认值:0
请确定是否启用 proxy 模式?如果需要,请首先参考 前一节 中关于路由信号模式的介绍。无需指定 H.245 路由配置,请让系统根据需求自动启用该功能。
请确定是否启用 proxy 模式?如果需要,请首先参考 前一节 中关于路由信号模式的介绍。无需指定 H.245 路由配置,请让系统根据需求自动启用该功能。
- InternalNetwork=10.0.1.0/24
默认值:无
为内部网络区域划分设置规则:允许通过分号或逗号将多个子网络进行区分;当且仅当其中一个说话方(发送信息的一方)和接收方(接受信息的一方)中有一个位于预先设定的内网范围内,并且另一个处于外部时才启用代理模式;若未作特别说明,则默认情况下所有通话都采用代理模式
格式:
InternalNetwork=network address/netmask[,network address/netmask,...]
其中 netmask 部份可用 . 记号或 CIDR 表示法,如下例所示:
范例:
InternalNetwork=10.0.0.0/255.0.0.0,192.168.0.0/24
- T120PortRange=40000-40999
默认值:0 (random)
指定 T.120 通道的 TCP 端口号范围。注意此范围将限制可同时通话的数量。
- RTPPortRange=50000-59999
默认值:10000-59999
确定 RTP/RTCP 通道的 UDP 端口号范围,并明确此端口号范围决定同时进行通话的最大数目。
- ProxyForNAT=1
默认值:1
当通话的一方经过 NAT 转换时,请考虑采用代理模式。采用此模式将实现 RTP/RTCP 信道穿透 NAT 的功能,并无需改动相关配置。但需要注意的是,在此情况下两端必须在同一口端口上进行传输和接收 RTP/RTCP 数据。对于某些设备存在故障无法满足这一前提条件的情况,请不得继续启用代理功能,并将 RTP/RTCP 数据转发给网络地址转换层(NAT)处理。
- ProxyForSameNAT=0
默认值:1
当通话双方的端点都连接到同一个NAT设备后,请问是否需要启用代理模式?一般情况下无需启用该功能的原因在于,在同一NAT设备后的两端设备之间通常能够直接通信。
Section [GkStatus::Auth]
定义状态界面的存取权限。
- rule=allow
默认值:forbid
可用值有
- forbid - 不得不在线服务访问.
- allow - 所有在线服务均可访问.
- explicit - 通过 ip=value 明确指定可连接和不可连接的 IP 地址. 其中 ip 表示目标端所需的 IP 地址,默认使用 default;value 可取 1,0 表示是否接受该 IP;允许/拒绝的方式则由 allow, forbid 和 yes,no 来决定.
- regex - 监听端所需的 IP 地址必须遵循所设定的正则表达式模式.
范例:
若欲允许 195.71.129.0/24 及 195.71.131.0/24 网段的 IP 可以联机,可设定
regex=^195/.71/.(129|131)/.[0-9]+$
-
- 请确保您以适当的方式输入您的用户名和密码。
其中名称和密码应遵循相同的格式。
- 请确保您以适当的方式输入您的用户名和密码。
此外,这些规则还能以 "|" (或) 及 "&" (且) 相互组合。例如:
-
- rule=explicit | regex
客户端 IP 须符合 explicit 或 regex 的规则。
- rule=explicit | regex
rule=regex & password 客户端 IP 必须遵循正则表达式的标准,并采用用户名与密码方式进行登录。
- default=allow
默认值:forbid
仅在 rule=explicit 时采用。
Section [RasSrv::GWPrefixes]
本节指定那些 E.164 号码应转送到指定的网关器。
格式:
gw-alias=prefix[,prefix,...]
指示将所有以此处指定位号开头并带有前缀码的号码转发至拥有该IP地址对应的网关器。请注意,在配置时必须明确指定该网关器的IP地址作为其标识符。
范例:
test-gw=02,03
Section [RasSrv::RewriteE164]
本节定义 dialedDigits (E.164 号码)的改写规则。
格式:
[!]original-prefix=target-prefix[,target-prefix,...]
若拨入的号码前缀为original-prefix,则会被重定向为目标前缀target-prefix。系统允许多种修改方案,并由Gatekeeper随机选择其中一个执行操作。如果在拨入的号码前缀original-prefix前添加感叹号!(注意:此处需使用Markdown语法),则操作效果与之相反。
范例:
08=18888
若拨 08345718 将被改写为 18888345718。
选项:
- Fastmatch=08
默认值:无
仅改写以此开头的号码。
Section [RasSrv::PermanentEndpoints]
在本节中建议将它们配置为 RAS 例外配置,在另一处则可以选择放置于不会定期失效并主动退出的网络位置。
这些预先定义好的入口将永久存储于 Gatekeeper 管理系统中的注册表中。
然而,在某些特殊情况下可能需要通过状态面板进行删除操作。
格式:
IP[:port]=alias[,alias,...;prefix,prefix,...]
范例:
网关器:
10.0.1.5=Citron;009,008
终端机:
10.0.1.10:1720=700
Section [RasSrv::Neighbors]
如果 ARQ 中的目标位置不在本 Gatekeeper �anged 的区域内,则本 Gatekeeper 将尝试将 LocationRequest (LRQ) 发送给相邻的 gatekeepers 进行查询。这些相邻的 gatekeepers 被认定为本 Gatekeeper 的邻居。在查询邻居时依据号码是否与邻居设置的前缀码进行匹配查询。若前缀码设置为 ``*'' 则表示所有号码均符合条件。当前情况下每个邻居只能分配一个前缀码。
一方面,在本节所有邻居间实现了双向通信连接。
另一方面,在设置前缀为空的情况下,默认情况下不会向目标邻居发送数据包,
但仍能正常接收来自同一邻居的数据包。
该字段用于验证 LRQ 是否确实来自邻居节点
格式:
GKID=ip[:port;prefix;password;dynamic]
范例:
GK1=192.168.0.5;*
GK2=10.0.1.1:1719;035;gk2
GK3=gk.citron.com.tw;;gk3;1
Section [RasSrv::LRQFeatures]
定义 LRQ 及 LCF 的一些特性。
- NeighborTimeout=1
默认值:2
The system waits for neighbors' responses to the request, measured in seconds. If no response is received within the configured timeout period, the Gatekeeper will respond to ARJ on behalf of the original request endpoint.
- ForwardHopCount=2
默认值:无
当 Gatekeeper 接收到某个LRQ的目的地不在该区域内时(即目标不在当前区域),它可以将其重新转发给其他邻居节点,在进行转发操作之前(或在处理前),会将该LRQ中的计数器hopCount减1)。当该计数器已降至零值时(即计数器归零),就不会继续进行转发操作(即不再传送出这个LRQ)。这样的操作确保不会导致LRQ被无限转发下去(即避免无限制传递)。特别指出的是,在这种机制下,并未涉及接收方或后续节点的操作(即不考虑接收方或后续节点的操作)。
- AlwaysForwardLRQ=1
Default: 0
强制 Gatekeeper 发出转发请求(Forward Request),即便目标队列(Destination Queue)中不包含 hopCount 字段。请注意使用此选项可能会导致数据包在节点间持续循环传递
- AcceptForwardedLRQ=1
默认值:1
是否接受从 neighbors 转送来的 LRQ。
- IncludeDestinationInfoInLCF=0
默认值:1
在响应的LCF中包含这两个字段以实现相应的功能 以便后者能够保存以便无需再去调用LRQ查询 这种情况可能会影响互通性 其他品牌的产品可能会误解这些数据而导致连接问题 在与其他品牌的产品进行通信时出现故障时 可以尝试关闭相关配置参数即可
- CiscoGKCompatible=1
默认值:0
该系统必须规定 Gatekeeper 在 LRQ 框架内携带与 Cisco gatekeepers 相兼容的非标准参数信息
Section [RasSrv::RRQFeatures]
- AcceptEndpointIdentifier=1
默认值:1
是否接受端点自行于 RRQ 中指定的 endpointIdentifier 。
- AcceptGatewayPrefixes=1
默认值:1
通过 terminalType 中的字段 supportedPrefixes ,网关器将前置码登录到Gatekeeper。该选项决定了Gatekeeper是否会接纳由网关器自主登记的前置码。
Section [RasSrv::ARQFeatures]
- ArjReasonRouteCallToSCN=0
默认值:1
当开启时,Gatekeeper不会接受来自Net Gate返回的电话请求,其原因在于 routeCallToSCN
- ArjReasonRouteCallToGatekeeper=1
默认值:1
如果开启该功能,在路由模式下某些情况下接收到回电ARQ请求时未找到相应的记录信息,则此次呼叫将被拒绝处理,并以标记符号routeCallToGatekBber标注原因;相应端点接收到该请求后应立即终止当前呼叫并重新发送呼叫请求至该GatekBber;这表明发话端不应规避该GatekBber而直接连接受话端
- CallUnregisteredEndpoints=0
默认值:1
当开启此选项时,在ARQ中利用 destCallSignalAddress 自行设置受话端地址,并非受限于该IP地址是否已被预先注册。这表明你可以明确地设置受话端对应的IP地址
- RemoveTrailingChar=#
默认值:无
如果 ARQ 中 destinationInfo 的最后一个字符与本选项所指定的一致,则需删除之。例如,在某些端点中可能会出现将结束符如 # 错误地包含在 destinationInfo 中的情况;通过此选项可去除其多余的部分。
Section [CallTable]
- GenerateNBCDR=0
默认值:1
生成自邻居区域的通话记录将被记录下来。因此,在这种情况下,在发起方不属于该区域的情况下,在这种情况下(即在这种情况下),发起方的 endpoint ID 未被填充。
- GenerateUCCDR=0
默认值:0
特别指出:在路由模式中(即 routing 模式),通话接通的标准是 Gatekeeper 接收到 Q.931 Connect 信息。而在 direct 模式(即 direct 模式)下,默认认为通话已建立连接。
- DefaultCallTimeout=3600
默认值:0
预设的通话断线时间,以秒为单位。若设为 0 表示取消此功能。
Section [Endpoint]
GNU Gatekeeper 能够注册到其他 Gatekeeper 充当一个端点。利用这一特性, 你很容易就能搭建出一个基于这一特性的Gatekeeper层级架构。
- Gatekeeper=10.0.1.1
默认值:no
请在上层模块中指定Gatekeeper位置设置。警告:请勿将该模块配置为自我注册。若设置为否,则可取消此功能。
请在上层模块中指定Gatekeeper位置设置。警告:请勿将该模块配置为自我注册。若设置为否,则可取消此功能。
- Type=Gateway
默认值:Gateway
定义端点的类型。可设为 Gateway 或 Terminal。
- H323ID=CitronProxy
默认值:
指定端点的 H.323 ID。可指定数个,以逗号隔开。
- E164=18888600000,18888700000
默认值:无
指定端点的 E.164 (dialedDigits) aliases。也可指定数个,以逗号隔开。
- Password=123456
默认值:无
分配给上级 Gatekeeper 的密钥。每个发送至上级 Gatekeeper 的 RAS 请求都会在其 cryptoTokens 字段中包含相应的密钥。如果未分配密钥,则该字段中也不会包含任何密钥。
另外,此密码也用于送给 neighbors 的 LRQ 中。
- Prefix=188886,188887
默认值:无
注册到上层 Gatekeeper 的前置码。仅有在类型为 Gateway 时才有效。
- TimeToLive=900
默认值:无
注冊申請所需的時間跨度建議為一段時間段。然而真正的时间是由上层 Gatekeeper 在 RCF 中被指定為特定值。
- RRQRetryInterval=10
默认值:10
如果送出的 RRQ 未得到响应,隔多久再重送一次,以秒为单位。
- ARQTimeout=2
默认值:2
定义 ARQ 请求的逾时时间。
- UnregisterOnReload=1
默认值:0
子 Gatekeeper 在接收到 reload 指令时是否会在撤销当前请求后完成上一层的注册流程?
- NATRetryInterval=60
默认值:60
定义 NAT socket 的重试时间,单位为秒。如果你不明白,用默认值就好。
- NATKeepaliveInterval=86400
默认值:86400
定义 NAT socket 的重传时间,单位为秒。如果你不明白,用默认值就好。
Section [Endpoint::RewriteE164]
一旦你设置注册到上层 Gatekeeper 的前置码后, 上层 Gatekeeper 会通过带有此前置码发送给下层 Gatekeeper 的拨号进行联系. 下层 Gatekeeper 可以基于此一节定义的规则来修改目标号码. 反之, 下层 Gatekeeper 执行至上的通话也会通过此一节修改其来源号码.
格式:
external prefix=internal prefix
例如,你有如下的系统:
[Parent GK]
ID=CitronGK
/ /
/ /
/ /
/ /
[Child GK] [EP3]
ID=ProxyGK E164=18888200
Prefix=188886
/ /
/ /
/ /
[EP1] [EP2]
E164=601 E164=602
定义这样的改写规则:
188886=6
当EP1通过拨号方式拨打该特定号码与EP3联系时,在Setup中CallingPartyNumber字段会被设置为新的号码。另一方面,当EP3拨通这些特定号码时,则会连接到相应的父线端点之一或多个父线端点。同样地,在Child GK注册的以数字'6'开头的端点,在Parent GK中的用户看来似乎是直接注册并使用数字'1'开头加上前五位数字组成的号码作为联系手段。
本小节不涉及RasSrv::RewriteE164的设定,并且其效率将超越前者
Section [Gatekeeper::Auth]
本节定义 Gatekeeper 的认证机制。
语法:
authrule=actions
每一条规则都有三个结果:ok、fail 及 next。
- ok - 此模块接收特定的请求。
- fail - 认证结果为失败应予以拒绝。
- next - 此模块不应承担决定是否可接受某特定请求的责任。
每一规则也有三种方式可以控制:
- optional - 如果此功能块无法做出最终判断关于某个请求是否可接受,则会将其转发给下一个功能块进行处理。
- required - 所有请求数都需要经过本功能块的严格认证流程才能获得批准;未经批准的请求数则会被拒绝处理,并经由该认证流程转发给下一个环节。
- sufficient - 一旦某个请求数获得了本功能块的认可,则会直接予以接纳;未能获得认可的一律予以拒绝。这意味着本功能块承担着决定 request 最终命运的关键职责;在此之后无需再引入其他环节介入决策过程。
目前支持的模块有:
BasicAuthenticationModule/MySQLAuthenticationHandler/LDAPAuthenticationServer/ExternalAuthenticationManager
该模块旨在审查 RAS 消息中的 tokens 和 cryptoTokens 区域,在其架构中必须包含 generalID 和 password 两个必要的字段。对于 cryptoTokens 域来说,当前仅支持基于 MD5 编码的 cryptoEPPwdHash 标记,并且还支持基于 HMAC-SHA1-96 算法编码的 nestedcryptoToken 标识符(须确保安装 libssl 库)
就 SimplePasswordAuth、 MySQLPasswordAuth、 LDAPPasswordAuth 以及 ExternalPasswordAuth 这四个模块而言,在 [Password] 节中分别设置了 ID 和 password字段。其中 MySQL数据库、LDAP数据库以及来自外部程序的数据同样适用。要加入其他类型的后端数据库支持同样较为简便。
- NeighborPasswordAuth
仅仅专为认证 [RasSrv::Neighbors] 里的邻居而存在。
- AliasAuth/MySQLAliasAuth/LDAPAliasAuth
本模块仅限用于RegistrationRequest (RRQ) 的认证功能实现,并非通用用途设计。所有参与认证操作的端点IP地址都需严格按照预设的标准格式进行配置。其中,MySQL环境中的Authenticate模块(MSSQLServer: MySQL Alias_auth)按照MSSQLServer: MySQLAlias_auth中的详细说明进行配置;而针对LDAP环境下的Authenticate模块,则需确保其相关的 Alias 和 IP 地址配置均来自同一LDAP项目的官方文档。
- PrefixAuth
旧名为GkAuthorize。当某个特定前置码应用于RAS请求时,这些IP地址或别名必须遵循特定样式规范,以便与相应的安全机制进行交互,具体内容可参考[PrefixAuth]一节详细了解。该模块主要支持AdmissionRequest(ARQ)和LocationRequest(LRQ)的身份认证工作
除了这些之外, 你可以根据需求选择特定功能模块, 只对部分RAS息进行校验. 比如在如下情况中, SimplePasswordAuth 被指定为可选的, 仅用于验证RRQ及ARQ消息. 如果RRQ未能通过SimplePasswordAuth认证, 则将该请求移交给AliasAuth模块进行处理. 默认情况下会接受所有请求.
范例:
SimplifiedPasswordAuthenticationProtocol=optional;RRC,RRC-Q
IdentifierAuthentication=Sufficient;RRC
defaultValue=允许
Section [Password]
在本节中阐述SimplePasswordAuth模块的用户标识符(ID)及密码设置。为此目的,请采用make命令生成名为add passwd的任务程序。
用法:
addpasswd config userid password
选项:
- KeyFilled=123
默认值:0
定义加密的键值。注意如果你重设此值的话,所有的密码都必须重新产生。
- CheckID=1
默认值:0
要不要检查 aliases 和 ID 是否相同。
- PasswordTimeout=120
默认值:-1
SimplePasswordAuth 系统中的某个模块负责将查验通过的密码暂时存入数据库以提高下次验证的效率。该选项用于设定暂存时间长短(单位:秒)。若设置为 0 则关闭该功能;而设置为负值则不清除存储的密码。
Section [MySQLAuth]
说明 MySQLPasswordAuth 模块涉及使用的数据库、表以及字段用于获取用户的 ID 和密码。
- Host=localhost
默认值:localhost
MySQL 服务器的主机名称或 IP。
- Database=billing
默认值:billing
欲连接的数据库。
- User=cwhuang
- Password=123456
使用此名称和密码来连接数据库。
- Table=customer
放置使用者 ID 和密码的表格。
- IDField=IPN
使用者 ID 的字段名称。
- PasswordField=Password
密码的字段名称。
- ExtraCriterion=Kind > 0
默认值:无
指定额外的查询条件。
上面的设定将产生如下的 SQL 查询指令:
SELECT PasswordField FROM Table WHERE IDField = %id [AND ExtraCriterion]
Section [ExternalPasswordAuth]
请指定一个外部程序用于获取密码作为认证。该程序应从stdin读取ID并将其输出到stdout。
- PasswordProgram=/usr/local/bin/getpasswd
Default: N/A
外部程序的执行文件名。
Section [RasSrv::RRQAuth]
规定AliasAuth模式在认证用途下的样式,在获取过程中将RRQ中的alias作为键值进行查询依据。当存在匹配项时根据该规则确定是否允许接收此RRQ。规则可以包含以&'隔开的多个条件
语法:
- sigaddr - 由 ``PrintOn(ostream)'' 显示的位置须符合正规表示式。
范例:
sigaddr:.ipAddress . ip = .* c0 a8 e2 a5 .port = 1720.
该变量sigaddr按照通用的IP表示方式定义为:byteA.byteB.byteC.byteD:port.
范例:
sigip:192.168.242.165:1720
- allow - 允许此 alias 注册,不论 IP 为何。
- deny - 拒绝此 alias 注册,不论 IP 为何。
Section [MySQLAliasAuth]
阐述 MySQLAliasAuth 模块涉及的数据库表及字段以实现某一 alias 的认证模式。
- Host=localhost
默认值:localhost
MySQL 服务器的主机名称或 IP。
- Database=billing
默认值:billing
欲连接的数据库。
- User=cwhuang
- Password=123456
使用此名称和密码来连接数据库。
- Table=customer
查询的表格。
- IDField=IPN
使用者 ID 的字段名称。
- IPField=Address
IP 样式的字段名称。
- ExtraCriterion=Kind > 0
默认值:无
指定额外的查询条件。
上面的设定将产生如下的 SQL 查询指令:
SELECT IPField FROM Table WHERE IDField = %alias [AND ExtraCriterion]
Section [PrefixAuth]
本节将阐述PrefixAuth模块的认证规则。现时而言,该模块主要适用于ARQ及LRQ的认证。
首先,在 RAS 请求中基于 destinationInfo 筛选出最长的有效前置码;接着根据最符合的网段来判断是否接受该请求;若未找到适当的选择规则而有指定 default 选项,则按指定 default 处理;否则..., 按照模块设定将请求转发至下一个模块或直接拒绝对。
格式:
prefix=authrule[|authrule|...]
语法:
其中,在于!以指示反向配置。
范例:
555=deny ipv4:10.0.0.0/27|allow ipv4:0/0
5555=allow ipv4:192.168.1.1|deny ipv4:192.168.1.0/255.255.255.0
86=deny !ipv4:172.16.0.0/24
09=deny alias:^188884.*
ALL=allow ipv4:ALL
在此设定中
Section [GkLDAP::LDAPAttributeNames]
本节定义 LDAP 数据库使用的属性名称。
- H323ID
该节点的H.323标识符在LDAP数据库中必须唯一(原因在于我们选择了email作为默认值)
- TelephonNo
端点的 E.164 alias。
- voIPIpAddress
LDAPAliasAuth 模块用以比对的 IP 位置。目前只能指定一个值。
- H235PassWord
LDAPPasswordAuth 模块用以比对的密码字段。目前只能指定一个值。
Section [GkLDAP::Settings]
本节定义 LDAP 服务器及客户端的一些参数。
- ServerName
默认值:ldap
LDAP 服务器的网域名称。
- ServerPort
默认值:389
LDAP 服务器的 TCP 埠号(通常是 389)。
- SearchBaseDN
默认值:o=University of Michigan, c=US
LDAP 服务器树状结构的入口点。仅会从此节点之下开始搜寻。
- BindUserDN
默认值:cn=Babs Jensen,o=University of Michigan, c=US
Gatekeeper 用以连接 LDAP 服务器的唯一名称。若不指定则使用匿名查询。
- BindUserPW
默认值:ReallySecretPassword
若指定 BindUserDN,须在此指定对应的密码。
- sizelimit
默认值:0
单一查询最多可返回的结果数量。由于 Gatekeeper 对每次查询预期仅限于零个或一个结果,因此导致该参数 seldom employed.
- timelimit
默认值:0
查询的逾时秒数。
Section [NATedEndpoints]
从理论上讲,在NAT之后的位置上安装端点防护装置后,Gatekeeper会内置于本系统中进行的探测,并采取相应的处理措施.当系统中的自检功能失效时,则建议在本章中进行手动配置.
格式:
alias=true,yes,1,...
范例:
指定号码为 601 的端点位于 NAT 之后。
601=true
Section [CTI::Agents]
在本节中, 我们介绍如何建立虚拟队列, 并将将来话发送至外部程序以决定路由. 即为, 在这种情况下, 虚拟队列为一种端点式别名结构, 并可实现H.323的呼叫功能.
当虚拟队列接收到来自ARQ的消息时,在线路控制函数(Gatekeeper)会通过status口发送出RouteRequest,并持续等待外部程序的响应。可能的处理结果包括RouteReject(表示拒绝该通话)以及RouteToAlias(将此通话路由至由外部程序指定的目标号码)。
如果指定的时间内未收到响应,通话将结束。
目前每一 Gatekeeper 上仅能指定一个虚拟队列。
相关信息请参考 监看 一节。
- VirtualQueue
默认值:无
定义虚拟队列的 H.323 别名。
- CTI_Timeout
默认值:10
直到 RouteRequest 返回为止的超时时间。一旦超时就会将ARJ 交到原调用方。
- 状态监控
5.1 状态界面
状态主要用于监视和管理 gatekeeper 的功能。Gatekeeper 会发送有关拨打出去电话的信息给所有已连接的客户端,并且可以通过该界面接收相应的指令。
该界面是一个基本的TCP端口(默认设置为7000),您可以通过telnet或其他相关应用程序进行连接。另一个客户端程序的例子是Java GUI,也被称为GkGUI。
该界面是一个基本的TCP端口(默认设置为7000),您可以通过telnet或其他相关应用程序进行连接。另一个客户端程序的例子是Java GUI,也被称为GkGUI。
应用程序****
你要利用状态界面来做些什么事取决于你自己,但这里有一些建议:
- 监视通话状况
- 监视已注册的端点
- 图形化使用者界面
参考 GkGUI。
- 计费应用程序
分析通话明细记录的讯息并转送给计费应用程序。
- 界面外部扩充
若你不希望发布某额外功能的原始代码,则只需发布其主要功能模块,并确保外围私密信息得以保留即可
范例****
假设你对通话明细记录有兴趣并且想要在固定间隔内批次执行它们。
有一个简短的 Perl 脚本(名为 gnugk_cdr.pl),该脚本不仅能够执行 gatekeeper 的启动过程,并且还生成了一个简单的客户端子程序来显示状态界面。此外,在完成这些操作后,该脚本会将这些 CD-R 数据写入到一个记录文件中。
#!/usr/bin/perl
sample program that demonstrates how to write the CDRs to a log file
use strict;
use IO::Socket;
use IO::Handle;
my $logfile = "/home/jan/cdr.log";
my $gk_host = "localhost";
my $gk_port = 7000;
my $gk_pid;
if ($gk_pid = fork()) {
parent will listen to gatekeeper status
sleep(1); # wait for gk to start
my sock = IO::Socket::INET->new(PeerAddr => gk_host, PeerPort => $gk_port, Proto => 'tcp');
if (!defined $sock) {
die "Can't connect to gatekeeper at gk_host:gk_port";
}
SIG{HUP} = sub { kill 1, gk_pid; }; # pass HUP to gatekeeper
SIG{INT} = sub { close (CDRFILE); kill 2, gk_pid; }; # close file when terminated
open (CDRFILE, ">>$logfile");
CDRFILE->autoflush(1); # don't buffer output
while (!$sock->eof()) {
my msg = sock->getline();
msg = (split(/;/, msg))[0]; # remove junk at end of line
my msgtype = (split(//|/, msg))[0];
if ($msgtype eq "CDR") {
print CDRFILE "$msg/n";
}
}
close (CDRFILE);
} else {
child starts gatekeeper
exec("gnugk");
}
图形化使用者界面****
目前有数个图形化使用者前端界面,分别由不同的人们或单位所开发。
- Java GUI
Jan Willamowius 开发了该系统。你可监控该系统通过 gatekeeper 跟踪注册者及其通话情况。按下鼠标右键时会触发显示选项菜单。
该图形界面能在内置的 Java 1.0 浏览器集合中普遍运行。由于安全考虑,在线访问该图形界面只能通过独立运行(standalone)或附着于特定 web 服务器实现。此 web 服务器须与 gatekeeper 共享同一 IP 地址(亦即你无法通过本地应用程序文件中的 applet 形式来访问)。
该程序可通过以下网站获取下载:http://www.gnugk.org/h323gui.html
- GkGUI
此程序是由 呈祺信息网络公司 研发的新Java程序;独立运行;需Java 1.4版本支持。新增功能模块包括:
能够同时管理多个 gatekeepers。
本系统提供 Button List 和 Tree List 两种显示方式。
支持完整的 CD-R 文件和统计数据。
系统内置状态记录生成功能。
通过不同颜色区分各类别服务端口。
支持灵活配置 gatekeeper 的参数设置。
具备强制终止新注册服务端口的功能。
系统内置存储、打印以及查询各种服务端口的状态信息功能。
GkGUI 是一个遵循 GNU 通用公共许可证开源的项目,可通过指定网站下载http://www.gnugk.org/h323develop.html#java
5.2 命令
help 或 h 命令将会显示出所有可获得的命令清单。
- Reload
重新加载设定档。
- Version, v
显示版本及 gatekeeper 的操作系统信息。
- Statistics, s
显示 gatekeeper 的统计信息。
范例:
Statistics
-- Endpoint Statistics --
Total Endpoints: 21 Terminals: 17 Gateways: 4 NATed: 2
Cached Endpoints: 1 Terminals: 1 Gateways: 0
-- Call Statistics --
Current Calls: 1 Active: 1 From Neighbor: 0 From Parent: 0
Total Calls: 1539 Successful: 1076 From Neighbor: 60 From Parent: 5
Startup: Fri, 21 Jun 2002 10:50:22 +0800 Running: 11 days 04:22:59
;
- PrintAllRegistrations, r, ?
显示所有已注册的端点。
格式:
AllRegistrations
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
...
Number of Endpoints: n
;
范例:
AllRegistrations
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
RCF|10.0.1.43:1720|613:dialedDigits=Jacky Tsai:h323_ID|terminal|1328_endp
RCF|10.0.1.55:1720|705:dialedDigits=Sherry Liu:h323_ID|terminal|1333_endp
Number of Endpoints: 3
;
- PrintAllRegistrationsVerbose, rv, ??
显示所有已注册端点的详细信息。
格式:
AllRegistrations
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
Registration_Time C(Active_Call/Connected_Call/Total_Call)
[Prefixes: ##] (gateway only)
...
Number of Endpoints: n
;
范例:
AllRegistrations
RCF|10.0.1.8:1720|Accel-GW2:h323_ID|gateway|1322_endp
Wed, 26 Jun 2002 16:40:03 +0800 C(1/5/33) <1>
Prefixes: 09,002
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
Wed, 26 Jun 2002 16:40:55 +0800 C(0/32/39) <1>
RCF|10.0.1.66:1720|716:dialedDigits=Vicky:h323_ID|terminal|1425_endp
Wed, 26 Jun 2002 16:40:58 +0800 C(1/47/53) <1>
Number of Endpoints: 2
;
- PrintCurrentCalls, c, !
显示目前所有的通话。
格式:
CurrentCalls
Call No. # | CallID | Call_Duration | Left_Time
Dialed_Number
ACF|Caller_IP:Port|Caller_EPID|CRV
ACF|Callee_IP:Port|Callee_EPID|CRV
...
Number of Calls: 总呼叫次数:当前呼叫:活跃呼叫:来自邻居的呼叫:
From Parent: Call_From_Parent
;
范例:
CurrentCalls
Call No. 29 | CallID bd c6 17 ff aa ea 18 10 85 95 44 45 53 54 77 77 | 109 | 491
Dial 0953378875:dialedDigits
ACF|10.0.1.49:1720|4048_CGK1|25263
ACF|10.1.1.1:1720|4037_CGK1|25263
Call No. 30 | CallID 70 0e dd c0 9a cf 11 5e 00 01 00 05 5d f9 28 4d | 37 | 563
Dial 0938736860:dialedDigits
ACF|10.0.1.48:1032|4041_CGK1|11896
ACF|10.1.1.1:1720|4037_CGK1|11896
Number of Calls: 2 Active: 2 From Neighbor: 0 From Parent: 0
;
- PrintCurrentCallsVerbose, cv, !!
显示目前所有通话的详细数据。
格式:
CurrentCalls
Call No. # | CallID | Call_Duration | Left_Time
Dialed_Number
ACF|Caller_IP:Port|Caller_EPID|CRV
ACF|Callee_IP:Port|Callee_EPID|CRV
Caller_Aliases|Callee_Aliases|Bandwidth|Connected_Time
...
Number of Calls: 呼叫次数 Current: 当前值 Active Calls: 活动中的呼叫 From NB: 来自NB端
;
范例:
CurrentCalls
Call No. 48 | CallID 7d 5a f1 0a ad ea 18 10 89 16 00 50 fc 3f 0c f5 | 30 | 570
Dial 0225067272:dialedDigits
ACF|10.0.1.200:1720|1448_endp|19618
ACF|10.0.1.7:1720|1325_endp|19618
Sherry:h323_ID|Accel-GW1:h323_ID|200000|Wed, 26 Jun 2002 17:29:55 +0800 <2>
Number of Calls: 1 Active: 1 From NB: 0
;
- Find, f
以 alias 或 prefix 的方式来搜寻已注册的端点。
格式:
Find Alias
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
;
范例:
f 800
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
;
f 801
SoftPBX: alias 801 not found!
- FindVerbose, fv
以 alias 或 prefix 的方式来搜寻已注册端点的详细信息。
格式:
FindVerbose Alias
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
Registration_Time C(Active_Call/Connected_Call/Total_Call)
[Prefixes: ##] (gateway only)
;
范例:
fv 02
RCF|10.0.1.100:1720|TFN:h323_ID|gateway|4037_CGK1
Wed, 26 Jun 2002 17:47:29 +0800 C(0/84/120) <1>
Prefixes: 02,09
;
- UnregisterIP
强制取消某一特定 IP 及埠号端点的注册。
格式:
UnregisterIP IP[:Port]
范例:
UnregisterIP 10.0.1.31:1720
URQ|10.0.1.31:1032|1326_endp|maintenance;
SoftPBX: Endpoint 10.0.1.31:1720 unregistered!
- UnregisterAlias
强制取消拥有某一 aliases 端点的注册。
格式:
UnregisterAlias Alias
范例:
UnregisterAlias 601
URQ|10.0.1.31:1032|1326_endp|maintenance;
SoftPBX: Endpoint 601 unregistered!
- UnregisterAllEndpoints
强制取消所有端点的注册。
格式:
范例:
UnregisterAllEndpoints
URQ|10.0.1.7:1024|1325_endp|maintenance;
URQ|10.0.1.8:1024|1322_endp|maintenance;
URQ|10.0.1.32:1032|1324_endp|maintenance;
URQ|10.0.1.36:1032|1323_endp|maintenance;
URQ|10.0.1.42:1032|1318_endp|maintenance;
Done
;
- DisconnectCall
强制切断某一特定号码的通话。
格式:
DisconnectCall Number
范例:
DisconnectCall 1533
- DisconnectIP
强制切断某一特定 IP 及埠号端点的所有通话。
格式:
DisconnectIP IP[:Port]
范例:
DisconnectIP 10.0.1.31:1720
- DisconnectAlias
强制切断拥有某一 aliases 端点的所有通话。
格式:
DisconnectAlias Alias
范例:
DisconnectAlias 601
- ClearCalls
强制切断所有的通话。
- GK
显示是否注册到上层的 Gatekeeper。
- Debug
仅用在除错目的。选项:
-
- trc [+|-|n]
显示/调整除错等级。
-
- cfg SEC PAR
读取并列出一个章节中的设定参数。
-
- set SEC PAR VAL
写入一个章节中的参数设定值。
-
- remove SEC PAR
移除一个章节中的参数设定值。
-
- remove SEC
移除一个章节。
-
- printrm VERBOSE
列出已取消注册但尚未移除的端点记录。
范例:
debug trc 3
debug set RoutedMode H245Routed 1
- Who
显示所有监看状态界面的人。
- RouteReject
拒绝某一虚拟队列中的来话。
格式:
RouteReject CallingEndpointID CallRef
范例:
RouteReject endp_4711 1234
- RouteToAlias, rta
将虚拟队列中的通话送到指定的端点。
格式:
RouteToAlias Alias CallingEndpointID CallRef
范例:
RouteToAlias Suzi endp_4711 1234
- Exit, q
离开状态界面。
5.3 讯息
本节说明输出至状态界面的所有讯息及其格式。
- GCF|IP|Aliases|Endpoint_Type;
Gatekeeper 接收了一个 GatekeeperRequest (GRQ),并随后回应了一个 GatekeeperConfirm (GCF)。
- GRJ|IP|Aliases|Endpoint_Type|RejectReason;
Gatekeeper 收到一个 GatekeeperRequest Object (GRQ),并且回应一个 GatekeeperReject Object (GRJ)。
- RCF|IP:Port|Aliases|Endpoint_Type|EndpointID;
Gatekeeper 接收了一个 RegistrationRequest (RRQ),并同时响应了(RegistrationConfirm, RCF)。
- RRJ|IP|Aliases|Endpoint_Type|RejectReason;
Gatekeeper接收了一个RegistrationRequest(RRQ),并同时回应了一个RegistrationReject(RRJ)
ACF, App_Condition_Failure; Caller'sIPAddress:Port, Caller_IP:Port; Caller_Endpoint_ID, Caller_ENDPOINTID; Call_Return_VSToken, CRV; Dest_info, DestinationInfo; Src_info, SrcInfo; Is_Answered or Response_Status, IsAnswered
Gatekeeper接收了一个 AdmissionRequest (ARQ),同时处理一个 AdmissionConfirm (ACF)。
- ARJ|Caller_IP:Port|DestinationInfo|SrcInfo|IsAnswered|RejectReason;
The gatekeeper processes an AdmissionRequest (ARQ) and issues an AdmissionReject (ARJ) through the appropriate mechanisms.
- DCF|IP|EndpointID|CRV|DisengageReason;
Gatekeeper接收了一个DRQ请求并且回应了一个DCF确认
- DRJ|IP|EndpointID|CRV|RejectReason;
门限实体接收到DisengageRequest请求,并同时向DisengageReject实体发送了拒绝响应
- LCF|IP|EndpointID|DestinationInfo|SrcInfo;
Gatekeeper 接收了一个位置请求(LRQ),并提交了相应的确认信息(LCF)。
- LRJ|IP|DestinationInfo|SrcInfo|RejectReason;
Gatekeeper 处理了一个 LocationRequest (LRQ) 并同时处理了一个 LocationReject (LRJ)。
- BCF|IP|EndpointID|Bandwidth;
Gatekeeper接收了一个BandwidthRequest(BRQ),并且对其进行了BandwidthConfirm(BCF)的响应
- BRJ|IP|EndpointID|Bandwidth|RejectReason;
Gatekeeper接收了一个BandwidthRequest(BRQ),并同时回应了一个BandwidthReject(BRJ)
- UCF|IP|EndpointID;
Gatekeeper 处理了一个 UnregistrationRequest (URQ),并同时发送了一个 UnregistrationConfirm (UCF) 作为确认信息。
- URJ|IP|EndpointID|RejectReason;
门限服务器处理了一个未注册请求,并对未注册拒绝进行了回应
- IRQ|IP:Port|EndpointID;
Gatekeeper发送一个InfoRequest(IRQ)检查某一端点是否存活中。若该端点存活,则应立即响应InfoRequestResponse(IRR)。
- URQ|IP:Port|EndpointID|Reason;
Gatekeeper 发出一个未注册请求(URQ),以强制终止某一项 endpoint 的注册流程。该 endpoint 应响应一个未注册确认(UCF)。
- CDR|CallNo|CallId|Duration|Starttime|Endtime|CallerIP|CallerEndId| /
CalledIP|CalledEndId|DestinationInfo|SrcInfo|GatekeeperID;
在某个电话完成之后,在系统中会呈现详细的信息,在线包含呼叫方与被呼叫方的IP地址信息、开始时间和结束时间,并且每通电话都有时长等数据
- RouteRequest|VirtualQueue|CallerEndId|CallRef|CallerAlias|SrcInfo;
要求外部程序决定虚拟队列来话的路由
