- 论坛徽章:
- 0
|
注:以下文章如需转载,请注明所属作者,转载地址,谢谢!实验——用Asterisk做PSTN网关(Lab——Using Asterisk as a PSTN Gateway)
使用本章提供的框架,写一个脚本将打给PSTN的通话传给PSTN网关。你可以使用phpMyAdmin或是MySQL命令行向数据库插入数据。
步骤1——使用SerMyAdmin向授信表中添加网关地址:
![]()
如果需要或是如果你觉得方便,可以使用MySQL命令行接口来完成同样的事情:
#mysql –u openser –p
-- enter your mysql password --
mysql> use openser;
mysql> INSERT INTO trusted ( src_ip, proto, from_pattern )
VALUES ( '10.1.30.22', 'any',
'^sip:.*$');
上面的记录告诉OpenSER脚本要允许符合下面条件的请求:来自IP地址10.1.30.22,可以是任何的传输层协议,与正则表达式“^sip:.*$”相符合。如果你不想重新加载OpenSER,你可以使用下面的命令。
#openserctl fifo trusted_reload
步骤2——在域表中包含你的服务域。(如果之前你没有做过)
openserctl domain add sermyadmin.org
你也可以使用SerMyAdmin来做这件事。
![]()
步骤3——在组中包含用户(local,ld和int)
#openserctl acl grant 1000@sermyadmin.org local
#openserctl acl grant 1000@sermyadmin.org ld
#openserctl acl grant 1000@sermyadmin.org int
#openserctl acl grant 1001@sermyadmin.org local
要使用SerMyAdmin,转向下面这一屏:
![]()
步骤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安全专家。 |
Asterisk网关(sip.conf)
[general]
context=sipincoming
#calls incoming from the SIP proxy to be terminated in the PSTN
lines
[sipproxy]
#calls incoming from the PSTN to be forwarded to clients behind
the
SIP
#proxy
type=peer
host=10.1.30.22
Asterisk (extensions.conf)
[general]
[globals]
[sipincoming]
exten=>_[0-9].,1,Dial(Zap/g1/${EXTEN:1})
exten=>_[0-9].,2,hangup()
[sipoutgoing]
# If you have a digital interface use the lines below
exten=_[0-9].,1,Answer()
exten=_[0-9].,2,dial(SIP/${EXTEN}@sipproxy)
exten=_[0-9].,3,Hangup()
#If you have analog FXO interfaces use the lines below.
exten=s,1,Answer()
exten=s,2,dial(SIP/${EXTEN}@sipproxy)
exten=s,3,Hangup()
Cisco
2601 网关(Cisco 2601 Gateway)
下面的解释可以帮的上忙,但是要完成这个配置,Cisco网关的一些知识也是需要的。Cisco网关的通话路由是由指令拨号点(instruction
dial peer)完成的。由拨号点voice1和2两条POTS(plain
old telephone system)线路的说明可以看到,任何以9打头,其他数字跟随的拨号通话都将会被前转到PSTN的1/0口或1/1口。而在拨号点voice123
voip线路的说明中,以1-9开始,任何数字跟随的拨号通话都将被直接转到IP地址为10.1.3.22的SIP代理上。
voice class codec 1
codec preference 2 g711ulaw
!
interface Ethernet0/0
ip address 10.1.30.38
255.255.0.0
half-duplex
!
ip classless
ip route 0.0.0.0 0.0.0.0
10.1.0.1
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 (80 in this example)
and send the DID number ahead.
!
dial-peer voice 123 voip
destination-pattern ....T
prefix 80
forward all
session protocol sipv2
session target ipv4:10.1.30.22
dtmf-relay sip-notify
步骤6——测试配置,打出和接受通话
使用LCR(Using LCR[Least Cost Routes])
上面的配置是好的,如果你只有一些网关,那么路由通常是不用改变的。然而,大多数的SIP服务提供者会频繁的改变路由。除此之外,他们中的大多数都有很多的网关并且会链接到更大的VoIP服务提供商那里。如果每次路由发生改变,那么修改脚本是比较麻烦的。那么LCR模块就有用武之地了。它允许你可以将路由器和网关插入数据库并且可以动态的更改他们以适应你所需求的系统要求。
想象一下下面这种情况:你有两个大的服务商,一个在欧洲,一个在亚洲。现在,你想要将本地和长途通话送到你自己的网关,到荷兰,德国和法国的通话送到欧洲的服务提供商,到日本和澳大利亚的通话送到亚洲的服务提供商。如果亚洲的服务停了,那么要求能够将通话转向你自己的网关。
LCR模块(The LCR Module)
LCR模块有两种应用功能。最重要的是将一个请求连续的前转到一个或多个网关(load_gws()和next_gw())。这些函数用来将通话送到网关上,当然你也可以使用failure_route和next_gw()将故障转移到其他网关上。你可以给网关分配优先级以决定到底哪一个网关会被优先选择。
你也可以使用LCR模块中的load_contacts()和next_contacts()函数前转基于q值的contacts。
配置图表(Configuration Diagram)
![]()
要实现上面的这幅图中的内容,我们需要了解三张表:lcr,gw和gw_grp。
VoIP服务提供商拨号方案(VoIP Provider Dial Plan)
是时候开始为我们的VoIP服务提供商仔细的作一份拨号方案的时候了。我们将实现E.164编号方案(numbering
scheme),将通话送到正确的网关上。当客户拨打本地号码时,我们在使用load_gw()函数选择网关之前,先使用正则表达式将其号码转换成它们相应的E.164地址。除了订阅者,这个服务提供商不会接受其他用户的任何非E.164格式的号码。我们假设用户接口能够帮用户拨出E.164号码。
![]()
LCR表(The LCR Table)
在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)
网关表(The Gateways Table)
![]()
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——发往网关前应用的前缀
网关组表(The Gateway Groups Table)
网关组表只是用来进行管理之用。与网关的名字息息相关。
添加,删除和显示LCR和网关(Adding,Removing,and Showing LCR and Gateways)
你可以使用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地址以通常的十进制点记法的格式直接插入数据库。
Openserctl
LCR相关的命令(Openserctl LCR-Related
Commands)
![]()
小贴士(Notes):
l
IP地址必须以点记法的格式键入,如1.2.3.4
l
和
必须以整数或文本的方式键入:
n
Transport ‘2’ 等同于 transport ‘tcp’
n
Scheme:1=sip,2=sips;transport:1=udp,2=tcp,3=tls
例子(Examples):
lcr addgw_grp usa 1
lcr addgw level3 1.2.3.4
5080 sip tcp 1
lcr addroute +1 '
' 1 1
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/74590/showart_2025959.html |
|