openwrt上运行asterisk搭建电话语音网关,对接电信ims-sip配置上遇到的一些坑
前言
本文是在路由器上运行一个asterisk以取代光猫的固话功能,作用是可以在一个固话号码下面分出多个分机号(PBX网关), 以达到分机互打的目的。当然有好多人会说现在都是都是手机时代了,联系都可以通过微信,手机拨号等方式和别人取得联系,固话用得实在是少。但是现在其实还是有部分老人不懂使用智能手机,只会用固话,还有一些值友购买了低价的静卡(无语音功能),出国留学需要用电话联系,但是国际漫游费用高等等场景是可以用到的。我的主要原因是喜欢折腾,就实现一下,本身也不用花什么钱。网上这方面的教程比较少,在实现过程中也走了许多弯路,写下本文给有这个需求的朋友避个坑
我用到的设备(仅供参考)
运行openwrt的路由:红米AX6000,固件为自编译的ImmortalWrt 此项目为加了闭源驱动的openwrt,理论上软路由和其他刷了openwrt的路由器都可以兼容本教程
光猫用的是华为的HS8145V5(需要破解超管密码,导出配置文件解密电信的sip账号密码)
导出电信sip密码(仅适用于华为光猫)
因为我用的光猫是默认密码,而且已经能通过telnet连上后台,华为telnet连接账号密码为 root 密码 adminHW 然后输入su进入特权模式,再输入display current-configuration 就能输出包括密码在内的所有信息。如下图所示
在输出的信息中找到自己的电话,因为我已经改成了自己的分机号了,所以是8003,把authpassword后面的密文复制出来,拿到一个叫华为配置文件解密的工具里面解密出真实密码(此工具可以在搜索引擎搜到)
其他型号可以在搜索引擎查找破解的方法,一般也同样适用于查找电信的sip密码,找到密码之后,用超级管理员登录光猫,把主服务器信息 sip用户信息(密码是刚刚找到那个)都记下来,并且顺便把启用按钮给关掉,因为电信sip账号同时只能登录一个,如果光猫登录了,其他地方就不能登录了
搭建电信sip专用连接
电信这个固话服务器在公网是连不上的,必须要用它专门的vlan才能访问,打开光猫,网络--网络设置页面,找到名称为tr069--voice字样的连接,记下它的vlan id和802.1p的值
然后在点左下方的新建按钮,填入封装类型IPOE,业务类型选其他,连接模式 桥接,vlan id填46 802.1p填7 绑定端口,看你想通过哪个端口来连接asterisk服务器,如果想要跟主路由的wan复用同一个,则需要在用户侧vlan填入对应的vlan id,使能DHCP也勾上
点击保存之后,在该绑定端口插入电脑应该就能自动获取到对应的ip地址和dns信息,然后用该电脑的nslookup解析一下电话设置里面 Outbound服务器地址是什么ip 记下来
路由器配置多wan (使用mwan3,openwrt网上这方面教程很多)其中一个wan插入到刚刚绑定端口,wan设置为DHCP,然后配置策略,仅上面解析到的Outbound服务器通过该wan访问(如果大家有需要的话,我出一篇关于mwan3多口设置的文章)
因为我解析到的2个ip属于同一个网段,所以只写了一条,192.168.200.1是电信那边的dns
asterisk需要安装的软件包
asterisk在openwrt上精简得非常厉害,默认情况基本不能用的(可以理解,毕竟主打嵌入式),如果是普通的debian或者ubuntu只需要apt install asterisk即可安装好,openwrt是
opkg install asterisk-codec-gsm,asterisk-codec-ulaw,asterisk-format-g723,asterisk-format-g729,asterisk-format-gsm,asterisk-format-wav,asterisk-format-wav-gsm,asterisk-func-dialplan,asterisk-func-shell,asterisk-func-uri,asterisk-pjsip,asterisk-res-http-websocket,asterisk-res-pjproject,asterisk-res-rtp-asterisk,asterisk-res-rtp-multicast,asterisk-res-sorcery,asterisk-sounds
大家也可以在编译阶段就编译好,安装好之后默认是运行不了,需要在路由器ssh运行
uci set asterisk.general.enabled='1' && uci commit
然后编辑 /etc/asterisk/modules.conf 这个文件 把里面的 noload = chan_sip.so 改成noload = chan_pjsip.so
vi /etc/asterisk/modules.conf
要这么做的原因是chan_sip属于比较老旧的实现方式 17年后就不再维护了,后面都改成pjsip,但是我在网上搜到的资料大多数是chan_sip,所以只好启用该模块,大家要是会的话也可以改用pjsip来连接
然后编辑 /etc/asterisk/sip.conf 用以下内容替换,需要根据自己的实际情况按注释内容修改
[general]
context=default
bindport=5060
bindaddr=0.0.0.0
allowguest=yes
nat=no ;视情况而定,如果asterisk服务器是放在路由器后面应该填force_rport,comedia,如果是路由器充当服务器 就填no
minexpiry=1800
registertimeout=30
usereqphone = yes
useragent=HUAWEI-EchoLife HS8145V5 ;访问sip服务器的UA 按需要修改
register=+86XXXXXXXXXX@gd.ctcims.cn:yourpassword:+86XXXXXXXXXX@gd.ctcims.cn@bac03.gz.gd.ctcims.cn:5060 ;电话号码改成你的电话 yourpassword改成你的密码 gd.ctcims.cn是宽带电话设置里的主服务器地址,bac03.gz.gd.ctcims.cn:5060是Outbound服务器地址和它的端口号,要按当地情况修改
realm=gd.ctcims.cn ;改成宽带电话设置里的主服务器地址
srvlookup=yes
udpbindaddr=0.0.0.0
transport=udp
dtmfmode = rfc2833
tcpenable=no ; Enable server for incoming TCP connections (default is no)
tcpbindaddr=0.0.0.0 ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces)
allowoverlap=dtmf ; Enable overlap dialing support using DTMF delivery
localnet=192.168.1.0/255.255.255.0 ;你的内网地址网段
[authentication]
[trunk_ims]
host=bac03.gz.gd.ctcims.cn ;改成自己的Outbound服务器地址
username=+86XXXXXXXXXX@gd.ctcims.cn ;复制宽带电话设置里面的用户名
secret=youpassword ;改成你的密码
type=friend
insecure=port,invite
fromdomain=gd.ctcims.cn ;改成主服务器地址
fromuser=+86XXXXXXXXXX ;改成你的电话
dtmfmode=inband
context=external
trustrpid=no
sendrpid=no
canreinvite=no
[8001] ;后面的都是分机号 想配多少都可以
type=friend
secret=8001
host=dynamic
context=internal
dtmfmode=rfc2833
[8002]
type=friend
secret=8002
host=dynamic
context=internal
dtmfmode=rfc2833
[8003]
type=friend
secret=8003
host=dynamic
context=internal
dtmfmode=rfc2833
[8004]
type=friend
secret=8004
host=dynamic
context=internal
dtmfmode=rfc2833
[8005]
type=friend
secret=8005
host=dynamic
context=internal
dtmfmode=rfc2833
[8006]
type=friend
secret=8006
host=dynamic
context=internal
[8007]
type=friend
secret=8007
host=dynamic
context=internal
[basic-options](!) ; a template
dtmfmode=rfc2833
context=from-office
type=friend
[natted-phone](!,basic-options) ; another template inheriting basic-options
directmedia=no
host=dynamic
[public-phone](!,basic-options) ; another template inheriting basic-options
directmedia=yes
[my-codecs](!) ; a template for my preferred codecs
disallow=all
allow=ilbc
allow=g729
allow=gsm
allow=g723
allow=ulaw
; Or, more simply:
;allow=!all,ilbc,g729,gsm,g723,ulaw
[ulaw-phone](!) ; and another one for ulaw-only
disallow=all
allow=ulaw
; Again, more simply:
;allow=!all,ulaw
然后修改hosts文件或者配置dnsmasq 让Outbound服务器地址只能指向解析出来的其中一个ip,我之前碰到过连接不稳定的情况就是因为电信的dns可能是为了负载均衡配置了2个ip地址,导致asterisk连接的时候一时可以呼出一时不可以,固定好一个之后就没问题
红框的设置,为服务器强制指定一个ip,如果电信换了ip改一下也能用
然后再到ssh启动
配置RTP端口及对应的端口转发
ssh编辑 文件 /etc/asterisk/rtp.conf 把rtpstart 和rtpend改成跟光猫里面的电话高级设置端口一致
配置分机呼入呼出规则
编辑文件 /etc/asterisk/extensions.conf 在文件最后面按照自身需要添加以下代码(不要覆盖全部)
[internal] # 呼出设置
exten => _8XXX!,1,Dial(SIP/${EXTEN}) ;实现8开头 4位数的分机号互打
exten => _1XXXXXXXXXX!,1,Dial(SIP/${EXTEN}@trunk_ims,60,r) ;1开头的11位数的电话就拨外线
exten => _0XXXXXXXXXX!,1,Dial(SIP/${EXTEN}@trunk_ims,60,r)
exten => _XXXXXXXX!,1,Dial(SIP/${EXTEN}@trunk_ims,60,r) ;8位数的固话就拨外线
exten => _1XX!,1,Dial(SIP/${EXTEN}@trunk_ims,60,r) ;110 120这种紧急呼叫的电话拨外线
exten => _10000!,1,Dial(SIP/${EXTEN}@trunk_ims,60,r) ;电信客服热线拨外线
[external] # 呼入设置,意思是呼入之后转发到8003
exten => s,1,Answer
exten => s,n,Dial(SIP/8001)
配置完后就可以启动asterisk
/etc/init.d/asterisk start
然后运行 asterisk -r可以进入到asterisk的cli界面查看运行情况
常用命令
sip show peers 查看分机号情况
sip show registry 查看外线注册情况
sip reload 重新加载sip.conf
dialplan reload 重新加载拨号规则
配置客户端
sip的客户端就比较简单了,市面上也有好多 基本上大同小异,我一般用zoiper,全平台都有客户端,基本功能免费,界面比较美观
大家也可以利用好光猫自带的电话端口作为分机之一,只要在这个信令端口绑定br0,然后路由器也桥接一个网段/端口过去 在原来用户名密码服务器等信息填入原来分机的信息就行了
祝大家折腾得开心
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~












校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案