知行合一
全部博文(31)
分类: 系统运维
2009-08-12 22:50:11
使用本章提供的框架,写一个脚本将打给PSTN的通话传给PSTN网关。你可以使用phpMyAdmin或是MySQL命令行向数据库插入数据。
步骤1——使用SerMyAdmin向授信表中添加网关地址:
如果需要或是如果你觉得方便,可以使用MySQL命令行接口来完成同样的事情:
#mysql –u openser –p
#openserctl fifo trusted_reload
步骤2——在域表中包含你的服务域。(如果之前你没有做过)
openserctl domain add sermyadmin.org
你也可以使用SerMyAdmin来做这件事。
步骤3——在组中包含用户(local,ld和int)
#openserctl acl grant 1000@sermyadmin.org local
步骤4——配置Asterisk做网关。
对于OpenSER来说,两个非常流行的网关是Asterisk和Cisco
AS5300。
其他厂商的网关也可以使用;检查他们的文档说明作为配置的指导。让我们看看怎样配置带两个FXO的Cisco
2601和带一个E1 PSTN卡Asterisk。
| 警告:防止将SIP包直接发送给网关是很重要的。SIP网关 |
| 应该在gateway的前面,并且要有防火墙防止用户直接将SIP |
| 请求发送给网关。 |
步骤5——建立Asterisk服务器或是Cisco网关
我们现在认为Asterisk网关的PSTN方面已经配置好了。让我们来改变我们网关的SIP配置(sip.conf)和它的拨号方案(extensions.conf)。我们将配置Asterisk来处理从PSTN来的或是打给PSTN的通话。Asterisk的一些基本知识是需要的。下面是最简单的一个能够让Asterisk与OpenSER进行交互的配置。请按照你的布局对这个脚本进行调整。
| 警告:只允许来自你的SIP服务器的SIP包传到你的 |
| asterisk服务器。不允许来自其他地方的SIP包。你 |
| 可以用IP
Tables来达到目的,如果你还是有疑问,请 |
| 资讯Linux安全专家。 |
[general]
Asterisk (extensions.conf)
下面的解释可以帮的上忙,但是要完成这个配置,Cisco网关的一些知识也是需要的。Cisco网关的通话路由是由指令拨号点(instruction
dial peer)完成的。由拨号点voice1和2两条POTS(plain
old telephone system)线路的说明可以看到,任何以9打头,其他数字跟随的拨号通话都将会被前转到PSTN的1/0口或1/1口。而在拨号点voice123
voip线路的说明中,以1-9开始,任何数字跟随的拨号通话都将被直接转到IP地址为
voice class codec 1
codec preference
!
interface Ethernet0/0
ip address
half-duplex
!
ip classless
ip route
no ip http server
ip pim bidir-enable
!
voice-port 1/0
!
voice-port 1/1
!
mgcp profile default
!
! The dial-peer pots commands will handle the calls coming from SIP
!dial-peers. Any call matching 9 followed by any number of digits will
be !forwarded to the PSTN with the 9 striped.
dial-peer voice 1 pots
destination-pattern 9T
port 1/0
!
dial-peer voice 2 pots
destination-pattern 9T
port 1/1
!
!The dial-peer voip commands will handle the calls coming from the
pots !dial peers (PSTN). You can prefix a number (
and send the DID number ahead.
!
dial-peer voice 123 voip
destination-pattern ....T
prefix 80
forward all
session protocol sipv2
session target ipv4:
dtmf-relay sip-notify
步骤6——测试配置,打出和接受通话
上面的配置是好的,如果你只有一些网关,那么路由通常是不用改变的。然而,大多数的SIP服务提供者会频繁的改变路由。除此之外,他们中的大多数都有很多的网关并且会链接到更大的VoIP服务提供商那里。如果每次路由发生改变,那么修改脚本是比较麻烦的。那么LCR模块就有用武之地了。它允许你可以将路由器和网关插入数据库并且可以动态的更改他们以适应你所需求的系统要求。
想象一下下面这种情况:你有两个大的服务商,一个在欧洲,一个在亚洲。现在,你想要将本地和长途通话送到你自己的网关,到荷兰,德国和法国的通话送到欧洲的服务提供商,到日本和澳大利亚的通话送到亚洲的服务提供商。如果亚洲的服务停了,那么要求能够将通话转向你自己的网关。
LCR模块有两种应用功能。最重要的是将一个请求连续的前转到一个或多个网关(load_gws()和next_gw())。这些函数用来将通话送到网关上,当然你也可以使用failure_route和next_gw()将故障转移到其他网关上。你可以给网关分配优先级以决定到底哪一个网关会被优先选择。
你也可以使用LCR模块中的load_contacts()和next_contacts()函数前转基于q值的contacts。
要实现上面的这幅图中的内容,我们需要了解三张表:lcr,gw和gw_grp。
是时候开始为我们的VoIP服务提供商仔细的作一份拨号方案的时候了。我们将实现E.164编号方案(numbering
scheme),将通话送到正确的网关上。当客户拨打本地号码时,我们在使用load_gw()函数选择网关之前,先使用正则表达式将其号码转换成它们相应的E.164地址。除了订阅者,这个服务提供商不会接受其他用户的任何非E.164格式的号码。我们假设用户接口能够帮用户拨出E.164号码。
在lcr表中,我们将实现路由。lcr的各个字段描述如下。本地通话和长途通话将以号码+1305作为前缀。
l
Prefix——这个前缀要和URI(phone
number)的用户部分(user part)相符合
l
From_uri——From_uri可能会包含需要匹配的URI。有时候当你想要用主叫用户信息来进行路由的时候使用这个字段。
l
Grp_id——Grp_id标识网关组(gateway
group)
l
Priority——网关优先级(Gateway
priority)
l
gw_name——网关名称(Gateway name)
l
grp_id——网关组标识(Gateway group identification)
l
ip_addr——网关IP地址(IP address of the gateway(对于1.2.x一下的版本,使用反转的十进制记法))
l
port——(UDP/TCP端口)
l
uri_scheme——sip(1),sips(2)
l
transport——udp(1),tcp(2),tls(3)
l
strip——删除的字符的数量
l
prefix——发往网关前应用的前缀
网关组表只是用来进行管理之用。与网关的名字息息相关。
你可以使用openserctl或SerMyAdmin来添加,删除,和吸纳是LCR表和网关表。你也可以手动进行该项工作。
| 如果你正使用OpenSer1.0.x或1.1.x,需要观察,这个字段的 |
| IP地址要是反转的十进制记法。 |
要将IP地址转换成十进制反转记法。需要做如下计算:
l
IP Address=a.b.c.d
l
反转十进制记法的IP地址 = d*224+c*216+b*28+a
如果你不想计算,那么就使用openserctl工具。它对于所有的版本都工作良好。在OpenSER的1.2.x版本中,你可以将IP地址以通常的十进制点记法的格式直接插入数据库。
l
IP地址必须以点记法的格式键入,如
l
n
Transport ‘
n
Scheme:1=sip,2=sips;transport:1=udp,2=tcp,3=tls
lcr addgw_grp
lcr addgw level3
lcr addroute +1 ' ' 1 1