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.1 关于此计划

OpenH323 Gatekeeper - The GNU Gatekeeper 是一个自由软件(或称开放原始码)计划,目的在实作一个 H.323 gatekeeper。 H.323 gatekeeper 为 H.323 端点(endpoint)提供通话控制的服务,它是 H.323 标准的一部份。

根据 H.323 规格书的标准,gatekeeper 应提供下列服务:

  • 地址转换
  • 通话许可管制
  • 频宽控制
  • 区域管理
  • 信号管制
  • 通话认证
  • 频宽管理
  • 通话管理

GNU Gatekeeper 依据 OpenH323 实作出以上大部份的功能。

H.323 规格书是由 ITU 公布的国际标准,做为因特网上语音、影像及数据的通讯标准。详细的说明见 Paul Jones' primer on H.323

1.2 版权声明

GNU Gatekeeper 是自由软件计划,受 GNU 通用公共许可证 (GNU GPL) 所保护及规范。此外,我们特别允许执行档可与 OpenH323 及 OpenSSL 的函式库连接。

简单的说,GNU 通用公共许可证允许你可以自由的复制、散布、出售或者修改本软件。但是要求所有的衍生作品也必须以 GNU 通用公共许可证的规范释出。这表示,你必须公开所有你修改本软件的程序代码,以及任何你加进本软件的程序(如果有的话)。细节请见 COPYING 这个档案的说明。GNU 通用公共许可证的中文翻译可在 GPL 取得。

关于自由软件的概念或理想,可参考 软件自由基金会 网站的说明。

如果你不愿这样做,你必须透过状态接口以 TCP 联机的方式与 Gatekeeper 沟通。利用此方式你可以只将最基本的功能加入 Gatekeeper 中,而不公开你程序的其它部份。

1.3 名称

本计划的正式名称是 OpenH323 Gatekeeper - The GNU Gatekeeper,简称 OpenH323GKGnuGK。请不要将本计划与其它类似计划搞混了!

目前有好几个使用 OpenH323 的开放原始码的 gatekeeper 计划:

  • OpenGatekeeper - by Egoboo

一个功能完整的 gatekeeper 计划,以 MPL 释出。不过此计划已经满长一段时间没有进展了。另有一个以 OpenGatekeeper 为基础实作的

  • OpenGK - by OpenH323 project

功能还很阳春,也是以 MPL 释出。

  • OpenH323 Gatekeeper - 本计划。

这几个 gatekeeper 的计划都使用非常类似的名称,的确困扰了大多数的使用者。然而我们的 "OpenH323 Gatekeeper" 是其中最早开始的,因此选择如此类似的名称并不是我们的错。然而为了让人们能与其它计划做出更清楚的区别,我们决定加上 "The GNU Gatekeeper" 的子标题,并且使用 gnugk 做为执行档的名称。

因此请记得,当你向我们回报问题或提供建议时,请使用本计划正确的名字:OpenH323GKGnuGK。不要再说成是 OpenGatekeeperOpenGK 了!

1.4 特色

2.0.3 版主要修正一些错误,并加入少许新增功能:

  • 在收到 Q.931 Facility callForwarded 时直接转接至指定端点。
  • 可手动指定某些端点位于 NAT 之后。
  • 加入一个简单的来话分送机制。来话可送至一虚拟队列,再经由外部的程序决定路由。

2.0.2 版新增的主要功能包括:

  • 加入呈祺网络信息所研发的 Citron NAT Technology,能够在不修改调整 NAT 服务器的情况下,支持穿越 NAT 的双向通话。支持多端点同时通话。
  • 允许 Gatekeeper 置于 NAT 之后,而让 public IP 的端点来注册。
  • 新的可扩充 fd_set 结构,可在路由模式下支持上千通电话,而不受 PWLib 的限制。
  • 在 RTP/RTCP 封包加上 TOS flag 以支持 QoS。
  • 可以名称和密码来登入状态界面。

此外当然还包括了下列已存在于 2.0 版的功能:

  • 重新设计过的注册及通话管理表格,可安全的在多执行绪下执行,能有效率的管理上万个端点的注册及上千通电话。
  • 新的路由信号模式架构,支持转送 H.225.0/Q.931 以及 H.245 信号,而不须产生更多的执行绪。因此执行绪的上限不会影响总通话数。
  • 支援 H.323 proxy 模式,可转送 RTP/RTCP 媒体信道以及 T.120 数据信道。以 H.245 tunnelling 模式和快速连接(fast-connect)模式开启的信道皆可支持。在 proxy 模式下所有数据皆经由 Gatekeeper 转送,端点间无直接的通信量,因此非常适合在 NAT 的环境下使用。
  • 藉由交换 LRQ/LCF/LRJ 可支持 Gatekeeper 丛集,使通话可以跨越区域(zone)。如果 LRQ 的目的地未知,Gatekeeper 还可将其转送到下一个 Gatekeeper。
  • 支持多种认证机制,包括 H.235 密码(MD5 或 SHA-1 加密)、IP 样式或前置码匹配的方式。支持以 MySQL 或 LDAP 做为后端认证数据库。
  • 支持 alternate gatekeepers 机制以达成备援或负载平衡的目的。如果 Gatekeeper 负担过重,会将端点重导至其它的 gatekeepers 上。
  • 可注册至上层 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 贡献者

目前本计划的主持人是 Jan Willamowius <jan@willamowius.de>

2.0 版主要的功能与特性是由台湾的黄志伟和 呈祺信息网络 所实作,包括重新设计以适合在多执行绪并行仍安全无虑的注册及通话管理表格,新的路由模式(routed mode)架构、H.323 代理器(proxy)、H.235 认证模块以及 MySQL 后端连接。

位于德国的 mediaWays 公司正在为本计划加入 LDAP 数据库子系统,重迭递送(overlapped sending)以及先进路由机制。

本计划最初是由 Xiang Ping Chen, Joe Metzger and Rajat Todi 所发展。

译注:本使用手册是先写成英文版再翻译为中文。特别感谢张崇严和吴恒升协助翻译。

2. 编译与安装

2.1 编译 Gatekeeper

要编译 Gatekeeper,你需要 PWLib 1.2 版和 OpenH323 1.8 版或以上。开发中的 Gatekeeper 版本通常需要搭配最新版的 OpenH323。

相关的函式库可以到 OpenH323 下载网页 取得。编译 OpenH323 的方式,请参考 这里 的指示。

编译的顺序:

1.       PWLib (release 版 + debug 版)

2.       OpenH323

3.       OpenH323 test application (不一定要, 只是用来确定到目前为止一切正常。)

4.       Gatekeeper

在 Unix 操作系统下,请先移至 Gatekeeper 目录。执行 make debug 来编译 debug 版,或执行 make opt 来编译 release 版。执行 make both 则可同时编译两种版本。

注意:你必须使用 GCC 2.95.2 版或以上,旧版的 GCC 可能无法正常编译。

在 Windows 操作系统下,需开启 Microsoft Visual C++ 6.0 or 7.0 (Visual C++ 5.0 太旧)来编译所提供的 project (gk.dsw) 。

从 2.0 版开始 GnuGK 支持以 MySQL 和 LDAP 做为后端数据库。如果你不需要这些支持,可以在 make 之前加上参数:

$ 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 结构,使得 GnuGK 能在路由模式下能支持上千通电话。欲使用此项功能,可在编译时加上 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)

如果你是使用 stable (woody) 版本的 Debian,请以 root 身份,输入以下的指令来安装 Gatekeeper:

$ apt-get install openh323gk

3. 入门指引

3.1 第一个简单的试验

选两台连上局域网络的 Linux 工作站,里面要安装 OpenH323 1.1 版或以上和 OhPhone。在第一台机器上开两个主控台,分别执行 Gatekeeper 和 ohphone。

jan@machine1 > gnugk -ttt

上一行指令表示:Gatekeeper 现在以直接信号模式执行。-ttt 参数指示 Gatekeeper 把除错讯息显示在主控台。你也可以用 "-o logfile" 把除错讯息存到一个档案里。关于信号模式的说明,请参阅 下一节 的说明。

jan@machine1 > ohphone -l -a -u jan

上一行指令表示:OhPhone 现在正在等候来电(-l),而且会自动接听来电(-a)。此外,OhPhone 会自动侦测 Gatekeeper,然后用 jan 这个使用者名称来注册到 Gatekeeper。(在某些原因下,若 OhPhone 无法自动侦测到 Gatekeeper,可以用 "-g 1.2.3 .4" 来指定运行 Gatekeeper 那一台机器的 IP 位置。)

在第二台机器上只需执行 OhPhone。

peter@machine2 > ohphone -u peter jan

上一行指令表示:第二台机器上的 OhPhone 会以 peter 这个使用者名称来注册到成功侦测到的 Gatekeeper,然后试着打电话给使用者 jan。Gatekeeper 会把使用者名称 jan 转换成 jan 所在的那一台机器的 IP 位置(在这个情形下是第一台机器)。如此一来,第二台机器上的 OhPhone 就知道应该要打给第一台机器才能找到 jan。

当有来电时,第一台机器上的 OhPhone 就会自动接通,最后 Peter 和 Jan 就能开始闲聊。

3.2 用状态界面来监控 Gatekeeper

现在我们试着来看看 Gatekeeper 处理了哪些信息。在第一台机器开一个新的主控台,然后用 telnet 来连到 Gatekeeper。

jan@machine1 > telnet machine1 7000

这时,你很有可能会收到 "Access forbidden!" 这个讯息。这是因为并非所有的人都能任意监控 Gatekeeper。现在我们新增一个档案叫 gatekeeper.ini,放到我们启动 Gatekeeper 的那个目录里。gatekeeper.ini 的内容包括以下四行:

[Gatekeeper::Main]

Fourtytwo=42

[GkStatus::Auth]

rule=allow

请先用 Ctrl-C 停止 Gatekeeper,然后再重新启动一次 Gatekeeper。当我们再次执行 telnet machine1 7000,就能与 Gatekeeper 保持联机了。

现在再重复 Peter 打给 Jan 的那个试验,看看 Gatekeeper 在直接信号模式下处理了哪些讯息。在 telnet session 里,有很多指令可以被执行。你可以键入"help" 来列出可用的指令。如果你要结束与 Gatekeeper 的 telnet session ,则先键入 "quit" ,再按 Enter。

3.3 以路由信号模式启动 Gatekeeper

启动 Gatekeeper 于路由信号模式,就是表示 Gatekeeper 会要求所有的通话信号都要经过 Gatekeeper 来转送。由于所有的信号都会通过 Gatekeeper,因此可以让 Gatekeeper 对通话行为有更大的控制权。

jan@machine1 > gnugk -r

上一行指令表示以路由模式来执行 Gatekeeper。再一次 telnet 到埠号 7000,打一通电话看看 Gatekeeper 现在会处理哪些信息。注意:所有与多媒体相关的封包(包括声音和影像),仍然是在两个端点(就是试验中那两个 OhPhone)间直接传送。注意:因为 Gatekeeper 路由模式更加的复杂,所以你很有可能在这个模式下遇到 Gatekeeper 程序上的错误。不过也无所谓,再执行一次就好啰。;-)

3.4 虚拟的交换机:中断通话

到目前为止,Gatekeeper 所表现出来的功能只是将符号名称转换成 IP 位置。虽然这是一个重要的功能,但却不足以令人感到惊奇。

事实上,Gatekeeper 能够对通话进行多样化的控制,例如:中断通话。当你连接到 Gatekeeper 的状态界面,可以键入 "PrintCurrentCalls" 来列出所有进行中的通话。如果你要终止两个端点间的通话,你可以任意选择其中一台的 IP 位置,然后键入 Disconnectip xxx.xxx.xxx.xxx 来中断此通话。

你也可以写一个简单的程序,联机到 Gatekeeper 的状态界面来监控所有进行中的通话。或是限制最长的通话时间为五分钟,以免有人滥用系统资源。

Gatekeeper 也能做到来电转接(call transfers)和来电跟随(call forwarding)的功能。不过,目前尚未进行实作。

3.5 将通话转送给一般电话

要是没有用 H.323 网关器(Gateway),网络电话的使用者只能拨打给其它因特网上拥有网络电话的使用者。如果要拨打给传统电话的用户,就必须使用网关器。

_________________          ______________

| endpoint "jan"|          |            |

| 192.168.88.35 |--------->| Gatekeeper |

|_______________|          |            |

_________________          |            |

| gateway "gw1" | outgoing |            |

| 192.168.88.37 |<---------|____________|

|_______________|

使用网关器时, Gatekeeper 本身必须先知道哪些通话必须先被转送到网关器才能拨号出去,而哪些通话可以直接透过 Gatekeeper 做内部拨号。你可修改 Gatekeeper 设定档的 [RasSrv::GWPrefixes] 小节来加以规范,告知 Gatekeeper,当拨打号码的前几个号码符合设定条件时,就应该要转送到网关器。

[RasSrv::GWPrefixes]

gw1=0

以上的设定指示 Gatekeeper ,如果被拨打的 E.164 号码开头是 0 时,就将这通电话转送给用 "gw1" H.323 alias 注册到 Gatekeeper 的那一台网关器,然后再由网关器拨给目的地。这时如果没有任何一台网关器是用 "gw1" 这个 H.323 alias 注册到 Gatekeeper,那电话就无法接通(注意:设定时,必须使用 Gateway 的 alias ,不能使用网关器的 IP 位置来设定)。

3.6 改写 E.164 号码

若你使用了网关器,你通常会在网关器内部使用不同的号码。Gatekeper 在收到被拨的号码时,可以先将号码改写,然后再将改写后的号码转送到网关器,进入电话网络拨号出去。你可以使用 RasSrv::RewriteE164 这一小节来作号码的改写。

以下的例子中,你可以用网络电话拨打一个喜欢的号码 12345 ,事实上,却是接通到 "gw1" 这台 gateway 后的电话,实际号码却是 08765。

[RasSrv::GWPrefixes]

gw1=0

[RasSrv::RewriteE164]

12345=08765

4. 参考手册

Gatekeeper 的行为完全取决于命令列选项和其设定档案。一些命令列选项可能会覆盖掉设定档中的设定。例如: -l 选项将会覆盖过设定档中的 TimeToLive 设定。

4.1 命令列选项

几乎每一个选项都有短格式及长格式,例如: -c 和 --config 是相同的意思。

基本选项

-h --help

显示所有可获得的选项。

-c --config filename

指定要使用的设定档名。

-s --section section

指定要使用设定档中的那一节做为主要章节。预设是 [Gatekeeper::Main]。

-i --interface IP

指定 Gatekeeper 监听的界面(IP)。你可以省略这个选项让 Gatekeeper 自动选择监听的 IP,除非你想要让 Gatekeeper 监听特定的 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 的行为。当你修改完后,记得要从状态界面下 reload 指令,或者,在 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)的 IP 地址。也就是说,Gatekeeper 仅会接受送到此 IP 地址的联机请求。若是指定为 0.0.0.0 则表示所有的 IP 都可接受。一般来说你并不需要指定此选项,除非你想让 Gatekeeper 只绑在某个你指定的 IP 上。

  • NetworkInterfaces=192.168.1.1/24,10.0.0.1/0
    默认值:无

手动指定 Gatekeeper 的网络界面。一般来说 Gatekeeper 会自动侦测所有的网络界面。仅有在两种情况下你才可能需要使用此参数。一是自动侦测结果不正确时,二是欲将 Gatekeeper 置于 NAT 服务器之后,并让 public IP 的端点来注册。在这种情况下,将网络界面设定为和 NAT 服务器相同,就好像 Gatekeeper 是在 NAT 服务器上执行一样。

  • EndpointIDSuffix=_gk1
    默认值:_endp

Gatekeeper 会为每个来注册的端点指定一个独一无二的标识符串。本选项可用来指定要附加在标识符串后的字符。若你有好几个 Gatekeeper 此选项就特别有用。

  • TimeToLive=300
    默认值:-1

H.323 端点向 Gatekeeper 的注册是有时效性的。Gatekeeper 可在 RCF 的 timeToLive 字段中指定注册的时间。在指定的时间过后,注册就失效了。端点必须定期持续的更新注册,并且设定 RRQ 中的 keepAlive 字段。这种更新注册的讯息称为 lightweight RRQ,仅需包含 H.225.0 中规定的最少信息即可。

本选项用来指定注册的时间,单位是秒数。不过端点可以在 RRQ 中的 timeToLive 字段指定一个比这更短的时间。但为了避免产生大量的 RRQ 注册讯息,若你指定比 60 秒更短的时间,Gatekeeper 会自动调整为 60 秒。

一旦某一端点的注册期效过了,Gatekeeper 会接连送出两个 IRQ 讯息,询问此端点是否仍活着。若是此端点响应 IRR,Gatekeeper 便会主动延长注册的期效。否则,Gatekeeper 会送 URQ 通知此端点离线,理由是 ttlExpired。此时端点必须以完整的 RRQ 讯息重新注册。

若将此选项指定为 -1,则可关闭注册时效的检查。

  • TotalBandwidth=100000
    默认值:-1

所有可用的频宽,单位为 100 bits/s。

  • RedirectGK=Endpoints > 100 || Calls > 50
    默认值:无

当此 Gatekeeper 负担过重时,利用此选项你可将过多的请求重导至其它的 Gatekeeper 上。例如,上述的设定表示若是注册的端点数量到达 100 个时,更多的 RRQ 将会被拒绝,或者是同一时间的通话数量到达 50 时,再多的 ARQ 也将会被拒绝。

此外,你还可以将此选项设为 temporary 或 permanent 而主动将所有的端点都重导至其它的 Gatekeeper。此 Gatekeeper 在响应的 RAS 拒绝讯息中,会包含一个定义在 AlternateGKs 中的 Gatekeeper 清单,端点可根据优先权选择向其它的 Gatekeeper 要求服务。注意若是设为 permanent 表示你的端点将一去不回,再也不会向原来的 Gatekeeper 注册了。另外还请注意这个功能只有对支持 H.323 version 4 的端点有效。

  • 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 及 port,第三小项指定端点在使用 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),可视为一种 H.323 到 H.323 的网关器(gateway)。

本小节定义与信号路由模式相关的一些选项,包括情况一及二。情况三的选项定义在 下一小节。本节所有的设定都可在执行时期透过 reload 指令调整。

  • GKRouted=1
    默认值:0

是否启动路由信号模式。

  • H245Routed=1
    默认值:0

是否启动 H.245 路由模式。当然,只有在 GKRouted=1 时才有效。

  • CallSignalPort=0
    默认值:1721

通话信号所使用的端口号,预设是 1721。我们不使用 H.323 规定的 1720,因此你可以在同一台机器上同时执行 Gatekeeper 及 H.323 端点程序。若设为 0 则会任选一个可用的埠号。

  • CallSignalHandlerNumber=2
    默认值:1

指定信号处理器的数目。若你的 Gatekeeper 负担很重,你可以试着增加此数目以改善效率。注意程序执行后此数目仅能增加不能减少。如果你不知道该设多少,就设为你机器上的 CPU 数目(也就是,双 CPU 的机器就设为 2)。

  • AcceptNeighborsCalls=1
    默认值:1

打开这个选项的话,Gatekeeper 会接受来自邻近 Gatekeeper 或是上层 Gatekeeper 打进自己的区域,前题是 Setup 中的 destinationAddress 字段符合某一已注册的端点。此外,Gatekeeper 还会用它自己的信号地址放进响应 LRQ 的 LCF 中。这表示,在 GK-GK 的通话中信号会经由第二个 Gatekeeper 来转送。因此第二个 Gatekeeper 可以正确的在 CDR 中记录通话时间。

  • AcceptUnregisteredCalls=1
    默认值:0

打开这个选项的话,Gatekeeper 会接受任意未注册的端点打电话进来。不过,这将引起安全上的疑虑。除非你的网络是可信任的,否则不要轻易开启这个选项。

  • RemoveH245AddressOnTunneling=1
    默认值:0

某些端点会在 Q.931 的 UUIE 字段中包含 h245Address,同时又设定 h245Tunneling 旗号。虽然这是合法的,然而在某些不良的实作上会导致互通性的问题。如果打开此选项,Gatekeeper 会在 h245Tunneling 旗号被设定时移除 h245Address 字段。因此将迫使另一端点停留在 tunnelling 的模式,而避免互通性的问题。建议将此选项打开。

  • RemoveCallOnDRQ=0
    默认值:1

关闭此选项时,Gatekeeper 不会在收到 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 送出 Release Complete,以及透过 RAS 送出 DRQ。有可能因为 DRQ 先被收到处理,导致 Gatekeeper 关闭信号信道,而使得 Release Complete 无法被送到另一端点。某些端点(例如 Cisco CallManager)即使当信号信道关闭时也不会自动切断通话,而导致问题,例如假使发话端挂断了,受话端仍持续响钤。将此选项打开可让 Gatekeeper 在收到 DRQ 而关闭信号信道前主动送出 Release Complete。

  • SupportNATedEndpoints=1
    默认值:0

是否允许端点从 NAT 服务器后面来注册。如果打开的话,Gatekeeper 会将 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

若打开本选项,当收到理由为 callForwarded 的 Q.931 Facility 讯息时,Gatekeeper 将会直接将 Setup 讯号转送给被转接的端点,而非将讯息回传给呼叫端。由于某些实作不完整的端点无法处理 Q.931 Facility callForwarded,打开本选项可解决此问题。

  • ShowForwarderNumber=0
    默认值:0

是否将来话号码改成转接者的号码。通常是为了计费的目的。仅有在 ForwardOnFacility=1 才有意义。

  • Q931PortRange=20000-20999
    默认值:0 (任意)

指定 Q.931 信号信道使用的 TCP 端口号范围。注意此范围将限制可同时通话的数量。

  • H245PortRange=30000-30999
    默认值:0 (任意)

指定 H.245 控制通道使用的 TCP 端口号范围。注意此范围将限制可同时通话的数量。

Section [Proxy]

本节定义 Gatekeeper 作为 H.323 proxy 的一些特性。在 proxy 模式下,Gatekeeper 将转送所有从发话端到受话端的所有数据,因此两个端点之间没有直接的通信。如果你有一些端点位于 NAT 服务器之后使用私有 IP,而有些端点在 NAT 外使用公用 IP 的话,proxy 模式将对你非常有用。

GNU Gatekeeper 支持转送传送声音及影像的 RTP/RTCP 信道,以及传送数据的 T.120 通道。不论是透过快速连接(fast-connect)程序或是 H.245 tunnelling 模式开启的逻辑信道都能够支持。

请注意,要让 proxy 模式顺利运作,Gatekeeper 对发话端和受话端两边的网络必须要有直接的联机

  • Enable=1
    默认值:0

是否开启 proxy 模式。当然你必须先使用 前一节介绍的路由信号模式。你不须指定使用 H.245 路由,Gatekeeper 会在必要时自动使用。

  • InternalNetwork=10.0.1.0/24
    默认值:无

定义内部网络区段。可指定多个网段,以分号或逗号区隔。仅有在发话端及受话端其中之一位于这里所定义的内部网络区段,而另一个位于内部网络之外时,proxy 模式才会开启。如果未指定,所有的通话都会使用 proxy 模式。

格式:

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 之后,是否使用 proxy 模式。在此情况下使用 proxy 模式将确保 RTP/RTCP 信道可穿过 NAT 而不需修改之。然而,位于 NAT 之后的端点必须使用同一个 port 来传送及接收 RTP/RTCP。某些实作有问题的端点不符合这个前提,这时你只能关闭这项功能,而让 NAT 为你转送 RTP/RTCP。

  • ProxyForSameNAT=0
    默认值:1

如果通话双方端点位于同一个 NAT 之后,是否使用 proxy 模式。一般来说你无需开启这项功能,因为通常在同一个 NAT 之后的端点可以直接通讯。

Section [GkStatus::Auth]

定义状态界面的存取权限。

  • rule=allow
    默认值:forbid

可用值有

  • forbid - 不允许任何联机。
  • allow - 允许任何联机。
  • explicit - 透过 ip=value 的方式明确指定那些 IP 可以联机,那些不行。其中 ip 就是欲监听端的 IP,而 value 可为 1,0、allow,forbid 或是 yes,no。如果找不到对应的 ip 则使用 default。
  • regex - 监听端的 IP 须符合此处指定的正规表示式。

范例:

若欲允许 195.71.129.0/24 及 195.71.131.0/24 网段的 IP 可以联机,可设定

regex=^195/.71/.(129|131)/.[0-9]+$

  • password - 使用者须以适当的名称和密码来登入。名称和密码的格式与 [Password] 一节相同。

此外,这些规则还能以 "|" (或) 及 "&" (且) 相互组合。例如:

    • rule=explicit | regex
      客户端 IP 须符合 explicit regex 的规则。
    • rule=regex & password
      客户端 IP 须符合 regex 的规则,并且以名称和密码来登入。
  • default=allow
    默认值:forbid

仅在 rule=explicit 时采用。

Section [RasSrv::GWPrefixes]

本节指定那些 E.164 号码应转送到指定的网关器。

格式:

gw-alias=prefix[,prefix,...]

表示将所有以此处指定之前置码开头的号码转送至某一拥有此 alias 的网关器,请注意你必须以网关器的 alias 来指定,不可用 IP。

范例:

test-gw=02,03

Section [RasSrv::RewriteE164]

本节定义 dialedDigits (E.164 号码)的改写规则。

格式:

[!]original-prefix=target-prefix[,target-prefix,...]

若所拨的号码以 original-prefix 开头,将被改写为 target-prefix。可指定多种改写方式,Gatekeeper 会任选其中一种。如果在 original-prefix 之前加 `!',则意义刚好相反。

范例:

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 所管理的区域,Gatekeeper 会尝试送 LocationRequest (LRQ) 到邻近的 gatekeeper 询问,这些邻近的 gatekeeper 称为此 Gatekeeper 的 neighbors。Gatekeeper 会询问那些 neighbors 取决于号码是否符合该 neighbor 的前置码。若前置码为 ``*'' 表示都符合。目前一个 neighbor 只能指定一个前置码。

另一方面,Gatekeeper 仅会响应从本节定义的 neighbors 送来的 LRQ。你可以指定空的前置码,这种情况下 Gatekeeper 不会送 LRQ 到那个 neighbor,但会接受那个 neighbor 送来的 LRQ。

password 字段用来认证 LRQ 是否确从 neighbors 送来。见 [Gatekeeper::Auth] 的详细说明。

格式:

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

等待 neighbors 响应的逾时时间,以秒为单位。如果超过时间仍等不到响应,Gatekeeper 会响应 ARJ 给原提出请求的端点。

  • ForwardHopCount=2
    默认值:无

如果 Gatekeeper 收到的 LRQ 目的地也不在此区域中,它可将其再转送至其它的 neighbors。在转送前,Gatekeeper 会将 LRQ 中的 hopCount 减一。若是 hopCount 已到达 0,则不会再转送。如此才不会造成 LRQ 被无限制的转送下去。本选项定义 LRQ 的转送次数。注意它影响的是 LRQ 的发送端而非转送端。

  • AlwaysForwardLRQ=1
    Default: 0

强迫 Gatekeeper 转送 LRQ,即使该 LRQ 中不含 hopCount 的字段。使用此选项时请小心,否则可能导至 LRQ 循环循环。

  • AcceptForwardedLRQ=1
    默认值:1

是否接受从 neighbors 转送来的 LRQ。

  • IncludeDestinationInfoInLCF=0
    默认值:1

Gatekeeper 会在响应的 LCF 中包含 destinationInfodestinationType 字段,让 neighbor gatekeeper 可以储存下来。如此下次就不用再用 LRQ 来询问了。然而,某些其它厂牌的 gatekeeper 会误用此信息,而造成互通性的问题。如果你与其它厂牌的 gatekeeper 互通时遭遇问题,可试着关闭此选项。

  • CiscoGKCompatible=1
    默认值:0

要求 Gatekeeper 在 LRQ 中包含与 Cisco gatekeepers 兼容的 NonStandardParameter 信息。

Section [RasSrv::RRQFeatures]

  • AcceptEndpointIdentifier=1
    默认值:1

是否接受端点自行于 RRQ 中指定的 endpointIdentifier

  • AcceptGatewayPrefixes=1
    默认值:1

网关器可透过 terminalType 里的 supportedPrefixes 向 Gatekeeper 注册前置码。本选项指定 Gatekeeper 是否要接受网关器自行注册的前置码。

Section [RasSrv::ARQFeatures]

  • ArjReasonRouteCallToSCN=0
    默认值:1

若打开的话,Gatekeeper 将拒绝从网关器打来再打回去的通话,理由是 routeCallToSCN

  • ArjReasonRouteCallToGatekeeper=1
    默认值:1

若打开的话,在路由模式下 Gatekeeper 在收到回电 ARQ 时若在通话表格中没有对应的记录,此通话将被拒绝,理由是 routeCallToGatekeeper。端点在收到后应立刻结束通话,并重新送通话请求至 Gatekeeper。这就是说,发话端不能绕过 Gatekeeper 而直接连至受话端。

  • CallUnregisteredEndpoints=0
    默认值:1

若打开本选项的话,Gatekeeper 会接受端点于 ARQ 中透过 destCallSignalAddress 自行指定受话端地址,不论此地址是否属于某一已注册的端点。这表示说,你可以明白的指定受话端的 IP 地址。

  • RemoveTrailingChar=#
    默认值:无

若 ARQ 中 destinationInfo 的最后一个字符与本选项指定的相同,则移除之。例如,某些端点会错误的将结束字符如 `#' 放进 destinationInfo,你可以透过此选项拿掉它。

Section [CallTable]

  • GenerateNBCDR=0
    默认值:1

产生从 neighbor 区域打来的通话明细。由于发话端不属于此区域,其 endpoint ID 会显示为空的。

  • GenerateUCCDR=0
    默认值:0

产生未接通电话的通话明细。通常仅使用于侦错的目的。请注意通话接通的定义为,在路由模式下,以 Gatekeeper 收到 Q.931 Connect 讯息为准。在直接模式下,通话总是认为已接通。

  • DefaultCallTimeout=3600
    默认值:0

预设的通话断线时间,以秒为单位。若设为 0 表示取消此功能。

Section [Endpoint]

GNU Gatekeeper 可以注册至其它的 Gatekeeper 成为一个端点。利用此一特性,你可以轻易的建立 Gatekeeper 的阶层架构。

  • Gatekeeper=10.0.1.1
    默认值:no

定义上层的 Gatekeeper 位置。不要注册到你自己哟,除非你疯了。若设为 no 可取消此一功能。

  • Type=Gateway
    默认值:Gateway

定义端点的类型。可设为 Gateway 或 Terminal。

  • H323ID=CitronProxy
    默认值:<Name>

指定端点的 H.323 ID。可指定数个,以逗号隔开。

  • E164=18888600000,18888700000
    默认值:无

指定端点的 E.164 (dialedDigits) aliases。也可指定数个,以逗号隔开。

  • Password=123456
    默认值:无

指定送给上层 Gatekeeper 的密码。所有送到上层 Gatekeeper 的 RAS 请求都会将密码包含在 cryptoTokens 字段中。若未指定,则不会加上 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 指令时是否先取消再重新注册至上层 Gatekeeper。

  • 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 打 18888200 呼叫 EP3,在 Q.931 Setup 中的 CallingPartyNumber 字段会被改写为 18888601。相反的,EP3 可打 18888601 或 18888602 来呼叫 EP1 或 EP2。换句话说,每一个注册在 Child GK 上开头号码为 '6' 的端点,对注册在 Parent GK 的端点来说,看起来就像是直接注册在 Parent GK 且开头号码为'188886'。

本小节与 RasSrv::RewriteE164 的设定无关,而且后者会优先生效。

Section [Gatekeeper::Auth]

本节定义 Gatekeeper 的认证机制。

语法:

authrule=actions

<authrule> := SimplePasswordAuth | AliasAuth | PrefixAuth | ...

<actions>  := <control>[;<ras>,<ras>,...]

<control>  := optional | required | sufficient

<ras>      := GRQ | RRQ | URQ | ARQ | BRQ | DRQ | LRQ | IRQ

每一条规则都有三个结果:ok、fail 及 next。

  • ok - 此模块认可某个请求。
  • fail - 认证失败应予回拒。
  • next - 此模块无法决定是否可接受某个请求。

每一规则也有三种方式可以控制:

  • optional - 如果此模块无法决定是否可接受某个请求,它将被送到下一模块。
  • required - 所有请求必须通过此模块的认证,否则将被回拒。通过请求的认证将被送到下一模块。
  • sufficient - 如果某个请求被认可,则它将被接受,否则将被回拒。这表示,这个模块决定请求的最后命运。在此模块之后不应再放其它模块,因为那将不会用到。

目前支持的模块有:

  • SimplePasswordAuth/MySQLPasswordAuth/LDAPPasswordAuth/ExternalPasswordAuth

此系列的模块检查 RAS 讯息中的 tokenscryptoTokens 字段,其中至少要包含 generalID 及 password 两个字段。若是 cryptoTokens 字段,目前仅支持 MD5 编码的 cryptoEPPwdHash 标记,以及由 HMAC-SHA1-96 编码的 nestedcryptoToken 标记(必须安装 libssl)。

对 SimplePasswordAuth、 MySQLPasswordAuth、 LDAPPasswordAuth 及 ExternalPasswordAuth 模块而言,ID 及 password 分别存于 [Password] 一节,MySQL 数据库、LDAP 数据库以及从外部程序取得。要加上其它后端数据库的支持也很容易。

  • NeighborPasswordAuth

仅使用于认证 [RasSrv::Neighbors] 里定义的 neighbors 而已。

  • AliasAuth/MySQLAliasAuth/LDAPAliasAuth

本模块仅能用来做 RegistrationRequest (RRQ) 的认证。端点的 IP 必须符合某一指定的样式。AliasAuth 模块的样式定义于 [RasSrv::RRQAuth] 一节,MySQLAliasAuth 模块定义于 [MySQLAliasAuth],而对 LDAPAliasAuth 模块而言,alias 及 IP 必须定义于 LDAP 项目中。

  • PrefixAuth

原先叫 GkAuthorize。具有某一前置码的 RAS 请求而言,其 IP 或 aliases 必须符合某一指定的样式。见 [PrefixAuth] 的详细说明。目前本模块仅能做 AdmissionRequest (ARQ) 及 LocationRequest (LRQ) 的认证。

另外,你可以设定某一模块只针对某些 RAS 讯息做检查。例如下例中,SimplePasswordAuth 被定为 optional,仅针对 RRQ 及 ARQ 做检查。若某个 RRQ 未被 SimplePasswordAuth 认可,再交由 AliasAuth 模块检查。预设是接受所有的请求。

范例:

SimplePasswordAuth=optional;RRQ,ARQ
AliasAuth=sufficient;RRQ
default=allow

Section [Password]

本节定义 SimplePasswordAuth 模块的使用者 ID 及密码。请使用 `make addpasswd' 产生 addpasswd 工具程序来加入 ID 及密码。

用法:

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。规则可以包含以 `&' 隔开的多个条件。

语法:

<authrules> :=  empty  |  <authrule> "&" <authrules>

<authrule>  := <authtype> ":" <authparams>

<authtype>  := "sigaddr" | "sigip"

<autparams> := [!&]*

<authparams> 记号的意义依 <authtype> 而定:

  • sigaddr - 由 ``PrintOn(ostream)'' 显示的位置须符合正规表示式。

范例:

sigaddr:.*ipAddress .* ip = .* c0 a8 e2 a5 .*port = 1720.*

  • sigip - 特殊的 `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|...]

语法:

<authrule> :=  <result> <authrule>

<result>    := deny | allow

<authrule>  := [!]ipv4:<iprule> | [!]alias:<aliasrule>

其中 <iprule> 可用点表示法或 CIDR 表示法,而 <aliasrule> 须为正规表示法。如果前面加 `!' 旗号表示意义相反。

范例:

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

在此设定中,除了 10.0.0.0/27 网段外所有的端点都可以打 555 但非 5555 开头的号码。除了 192.168.1.1 外 192.168.1.0/24 网段来的端点都不能拨 5555 开头的号码。除了 172.16.0.0/24 网段外的端点都不能拨 86 开头的号码。而 alias 开头为 188884 的端点不能拨 09。此外所有的情形都是允许的。

Section [GkLDAP::LDAPAttributeNames]

本节定义 LDAP 数据库使用的属性名称。

  • H323ID

端点的 H.323 ID。在 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 预期每次查询应该只有零个或一个结果,所以此参数很少用到。

  • timelimit
    默认值:0

查询的逾时秒数。

Section [NATedEndpoints]

理论上 Gatekeeper 会自动侦测端点是否位于 NAT 之后,而做适当的处置。但若自动侦测失效时,可以从本节来手动指定。

格式:

alias=true,yes,1,...

范例:

指定号码为 601 的端点位于 NAT 之后。

601=true

Section [CTI::Agents]

本节用来设定虚拟队列,将来话送至外部程序决定路由。所谓的虚拟队列就像一个端点一样可用 H.323 的别名来呼叫。

当收到属于虚拟队列的 ARQ 时,Gatekeeper 会透过 status port 送出 RouteRequest,并且等待外部程序的响应。可能的结果有 RouteReject,表示拒绝此一通话,或是 RouteToAlias,将此通话导到由外部程序指定的号码。

如果指定的时间内未收到响应,通话将结束。

目前每一 Gatekeeper 上仅能指定一个虚拟队列。

相关的讯息及响应请见 监看 一节。

  • VirtualQueue
    默认值:无

定义虚拟队列的 H.323 别名。

  • CTI_Timeout
    默认值:10

等待 RouteRequest 响应的逾时时间。若超过这个时间的话,会送出 ARJ 给原呼叫端。

5. 状态监控

5.1 状态界面

状态界面是一个用来监视和控制 gatekeeper 的外部界面。Gatekeeper 将会传送关于拨打出去之电话的讯息给所有有接通的客户端,并且可以透过这个界面接受指令。

这个界面是一个简单的 TCP port (预设是 7000),你可以使用 telnet 或是其它相关程序来联机。另一个不同的客户端程序范例即是 Java GUI,亦称为 GkGUI。

应用程序

你要利用状态界面来做些什么事取决于你自己,但这里有一些建议:

  • 监视通话状况
  • 监视已注册的端点
  • 图形化使用者界面

参考 GkGUI。

  • 计费应用程序

分析通话明细记录的讯息并转送给计费应用程序。

  • 界面外部扩充

若你不想发布某额外功能的原始码,那就仅发布通过状态界面主要的核心机能和界面并保留外在私密部份即可。

范例

假设你对通话明细记录有兴趣并且想要在固定间隔内批次执行它们。

这里有个简单的 Perl script (gnugk_cdr.pl),它启动 gatekeeper 并且产生一个状态界面的简单客户端子程序,并且把 CDRs 写入到一个记录文件中。

#!/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 的注册者和通话状况。对 endpoint 按下鼠标右键时将会弹出一个选单。

这个图形化使用者界面能够在内建 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。
  • 详细通话记录(CDR)和统计资料。
  • 可产生状态记录文件。
  • 不同的类型的端点使用不同的颜色来区别。
  • 可调整 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) <r>

[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: Current_Call Active: Active_Call From Neighbor: Call_From_Neighbor /

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 <r>

...

Number of Calls: Current_Call Active: Active_Call From NB: Call_From_Neighbor

;

范例:

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) <r>

[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 (GRQ) 并且回应一个 GatekeeperReject (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|Caller_IP:Port|Caller_EndpointID|CRV|DestinationInfo|SrcInfo|IsAnswered;

Gatekeeper 收到一个 AdmissionRequest (ARQ) 并且回应一个 AdmissionConfirm (ACF)。

  • ARJ|Caller_IP:Port|DestinationInfo|SrcInfo|IsAnswered|RejectReason;

Gatekeeper 收到一个 AdmissionRequest (ARQ) 并且回应一个 AdmissionReject (ARJ)。

  • DCF|IP|EndpointID|CRV|DisengageReason;

Gatekeeper 收到一个 DisengageRequest (DRQ) 并且回应一个 DisengageConfirm (DCF)。

  • DRJ|IP|EndpointID|CRV|RejectReason;

Gatekeeper 收到一个 DisengageRequest (DRQ) 并且回应一个 DisengageReject (DRJ)。

  • LCF|IP|EndpointID|DestinationInfo|SrcInfo;

Gatekeeper 收到一个 LocationRequest (LRQ) 并且回应一个 LocationConfirm (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;

Gatekeeper 收到一个 UnregistrationRequest (URQ) 并且回应一个 UnregistrationReject (URJ)。

  • IRQ|IP:Port|EndpointID;

Gatekeeper 送出一个 InfoRequest (IRQ) 询问某一端点是否仍存活着。如果该端点仍活着的话,应立即响应一个 InfoRequestResponse (IRR)。

  • URQ|IP:Port|EndpointID|Reason;

Gatekeeper 送出一个 UnregistrationRequest (URQ) 以强制取消某一端点的注册。该端点应回应 UnregistrationConfirm (UCF)。

  • CDR|CallNo|CallId|Duration|Starttime|Endtime|CallerIP|CallerEndId| /
    CalledIP|CalledEndId|DestinationInfo|SrcInfo|GatekeeperID;

当某一通话结束后,会显示所有的通话明细,包括发话端及受话端的 IP、起始和结束时间,以及通话时间等。

  • RouteRequest|VirtualQueue|CallerEndId|CallRef|CallerAlias|SrcInfo;

要求外部程序决定虚拟队列来话的路由

OpenH323 Gatekeeper - The GNU Gatekeeper 使用手册相关推荐

  1. GNU Make 使用手册!

    GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...

  2. 10047.GNU Make 使用手册中译版(转)

    http://blog.chinaunix.net/resserver.php?blogId=2652&resource=gunmake.htm GNU Make 使用手册(中译版) 翻译:于 ...

  3. GNU Bison 中文手册

    GNU Bison 中文手册 2005年06月22日 22:31:00 阅读数:41743 20050620 GNU Bison 中文手册翻译完成 GNU Bison实际上是使用最广泛的Yacc-li ...

  4. 20050620 GNU Bison 中文手册翻译完成

    20050620 GNU Bison 中文手册翻译完成 GNU Bison实际上是使用最广泛的Yacc-like分析器生成器,使用它可以生成解释器,编译器,协议实现等多种程序. 它不但与Yacc兼容还 ...

  5. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  6. GNU Make 使用手册(中译版)

    如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的M ...

  7. GNU gcc 使用手册

    最权威各版本的GNU 手册见 http://gcc.gnu.org/onlinedocs/ ------------------------------------------------------ ...

  8. GNU make 中文手册 第一二章 概述与介绍

    一.第一章:概述 准备知识 在开始我们关于 make 的讨论之前,首先需要明确一些基本概念: 编译:把高级语言书写的代码,转换为机器可识别的机器指令.编译高级语言后生成的指令虽然可被机器识别,但是还不 ...

  9. arm02gnu/linux,2.1. 支持的硬件 - Debian GNU/Linux 安装手册(PPC架构)

    Debian 不会超出 Linux 内核与 GNU 工具集所支持的硬件范围之外. 因此,任何被移植了 Linux 内核,libc, gcc等,并拥有对应的 Debian 移植版的硬件体系或平台都可以运 ...

最新文章

  1. mysql同步出现错误
  2. STM32 FSMC 外部使用SRAM
  3. 公共基础知识计算机,公共基础知识计算机基础知识试题
  4. kibana操作elasticsearch:多字段查询(multi_match)
  5. 菜鸟成长日记(五)之WMIC简单命令应用
  6. 为什么存png还有白色底_PNG的算法原理
  7. 【二分】抄书 (jzoj 2123)
  8. ARM开发板上iconv_open(utf-8, gb2312) 调用失败的解决方法(转)
  9. java学习(151):字节输出流
  10. SQuirreL SQL Client3.8 连接 HIVE2.2
  11. 一种被忽视的构造和整数溢出重现
  12. 第二个冲刺周期第五天
  13. 开源网管工具 汇总比较
  14. 升级在谷歌电子市场上传的应用
  15. 2016 hack.lu-ctf redacted RSA数据恢复
  16. STVD环境下开发STM8,如何查看工程占用的Flash、EEPROM、RAM的情况
  17. 2022 各国程序员薪资大揭秘!
  18. 头条小程序可以使用uniapp的地图选择(uni.chooseLocation)
  19. ​特拉华大学彭曦教授招收2021 Fall全奖博士生
  20. 爬虫报错requests.exceptions.ProxyError:/Failed to establish a new connection: [WinError 10061]

热门文章

  1. oracle数据库时钟,oracle11g巡检RAC数据库
  2. 移动web:翻页场景动画(结婚浪漫请柬)
  3. 【智能金融】机器学习在风控领域的应用
  4. 装黑苹果卡在苹果图标_解决黑苹果启动logo变形过程小记。
  5. 《数据科学导论》期末复习整理~2020
  6. 5-8 构造一个银行账户类
  7. 图像处理/人工智能/opencv之深入理解模板匹配算法
  8. 菜鸟教程 python_开始Python的新手教程
  9. 21岁的北师大才女吴莹莹
  10. python报告水印怎么弄_Python如何为图片添加水印