openwrt上运行asterisk搭建电话语音网关,对接电信ims-sip配置上遇到的一些坑

2023-05-13 20:24:28 67点赞 483收藏 29评论

前言

本文是在路由器上运行一个asterisk以取代光猫的固话功能,作用是可以在一个固话号码下面分出多个分机号(PBX网关), 以达到分机互打的目的。当然有好多人会说现在都是都是手机时代了,联系都可以通过微信,手机拨号等方式和别人取得联系,固话用得实在是少。但是现在其实还是有部分老人不懂使用智能手机,只会用固话,还有一些值友购买了低价的静卡(无语音功能),出国留学需要用电话联系,但是国际漫游费用高等等场景是可以用到的。我的主要原因是喜欢折腾,就实现一下,本身也不用花什么钱。网上这方面的教程比较少,在实现过程中也走了许多弯路,写下本文给有这个需求的朋友避个坑

我用到的设备(仅供参考)

运行openwrt的路由:红米AX6000,固件为自编译的ImmortalWrt 此项目为加了闭源驱动的openwrt,理论上软路由和其他刷了openwrt的路由器都可以兼容本教程

光猫用的是华为的HS8145V5(需要破解超管密码,导出配置文件解密电信的sip账号密码)

导出电信sip密码(仅适用于华为光猫)

因为我用的光猫是默认密码,而且已经能通过telnet连上后台,华为telnet连接账号密码为 root 密码 adminHW 然后输入su进入特权模式,再输入display current-configuration 就能输出包括密码在内的所有信息。如下图所示

输入密码的时候不会有任何显示,不要以为自己输错了输入密码的时候不会有任何显示,不要以为自己输错了

在输出的信息中找到自己的电话,因为我已经改成了自己的分机号了,所以是8003,把authpassword后面的密文复制出来,拿到一个叫华为配置文件解密的工具里面解密出真实密码(此工具可以在搜索引擎搜到)

openwrt上运行asterisk搭建电话语音网关,对接电信ims-sip配置上遇到的一些坑

我这个是点$2解密我这个是点$2解密

解密结果解密结果

其他型号可以在搜索引擎查找破解的方法,一般也同样适用于查找电信的sip密码,找到密码之后,用超级管理员登录光猫,把主服务器信息 sip用户信息(密码是刚刚找到那个)都记下来,并且顺便把启用按钮给关掉,因为电信sip账号同时只能登录一个,如果光猫登录了,其他地方就不能登录了

电话账号信息电话账号信息

搭建电信sip专用连接

电信这个固话服务器在公网是连不上的,必须要用它专门的vlan才能访问,打开光猫,网络--网络设置页面,找到名称为tr069--voice字样的连接,记下它的vlan id和802.1p的值

我这里是46和7我这里是46和7

然后在点左下方的新建按钮,填入封装类型IPOE,业务类型选其他,连接模式 桥接,vlan id填46 802.1p填7 绑定端口,看你想通过哪个端口来连接asterisk服务器,如果想要跟主路由的wan复用同一个,则需要在用户侧vlan填入对应的vlan id,使能DHCP也勾上

openwrt上运行asterisk搭建电话语音网关,对接电信ims-sip配置上遇到的一些坑

点击保存之后,在该绑定端口插入电脑应该就能自动获取到对应的ip地址和dns信息,然后用该电脑的nslookup解析一下电话设置里面 Outbound服务器地址是什么ip 记下来

openwrt上运行asterisk搭建电话语音网关,对接电信ims-sip配置上遇到的一些坑

路由器配置多wan (使用mwan3,openwrt网上这方面教程很多)其中一个wan插入到刚刚绑定端口,wan设置为DHCP,然后配置策略,仅上面解析到的Outbound服务器通过该wan访问(如果大家有需要的话,我出一篇关于mwan3多口设置的文章)

因为我解析到的2个ip属于同一个网段,所以只写了一条,192.168.200.1是电信那边的dns因为我解析到的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改一下也能用红框的设置,为服务器强制指定一个ip,如果电信换了ip改一下也能用

然后再到ssh启动

配置RTP端口及对应的端口转发

ssh编辑 文件 /etc/asterisk/rtp.conf 把rtpstart 和rtpend改成跟光猫里面的电话高级设置端口一致

openwrt上运行asterisk搭建电话语音网关,对接电信ims-sip配置上遇到的一些坑

配置分机呼入呼出规则

编辑文件 /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,然后路由器也桥接一个网段/端口过去 在原来用户名密码服务器等信息填入原来分机的信息就行了

openwrt上运行asterisk搭建电话语音网关,对接电信ims-sip配置上遇到的一些坑


祝大家折腾得开心


作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
29评论

  • 精彩
  • 最新
  • 十年前刚搬家,家里手机信号不好,就折腾了这个呼叫转移。不用破解电信密钥,几十块买个asterisk x100p卡插电脑上直接电话线,搭配asterisk就可以用,手机还有app软件

    校验提示文案

    提交
    [惊喜] 我这个主要是不用花钱买啥设备,电信本来就是基于voip的电话了,10年前用adsl的话估计还是原始的电话交换线路

    校验提示文案

    提交
    老司机

    校验提示文案

    提交
    收起所有回复
  • 电信内部的吧。这个也能摸索出来?

    校验提示文案

    提交
    [狂汗] 其实网上有好多类似的做法,只不过教程不是很详细

    校验提示文案

    提交
    收起所有回复
  • 我12月到2月折腾了3个月的商用VOIP,最后选的是3CX本地版,其他的真的太晦涩难懂了

    校验提示文案

    提交
    [惊喜] 我刚开始用freepbx折腾的,要么能打进电话打不出去,要么能打出打不进来,后来一步步排查才发现是nat和没有把ip固定住的问题

    校验提示文案

    提交
    收起所有回复
  • 你好猫猫,我现在弱电箱放着光猫,软路由2,交换机,交换机分别连接客厅主路由tp的ax5400用AP模式和电脑,现在电脑房间无线弱,如果用你这个方案怎么设计,谢谢

    校验提示文案

    提交
    不知道你的软路由系统支持不支持vlan标记,如果支持的话,直接在软路由多添加一个vlan接口然后在光猫设置里面添加一个用户侧vlan就可以了

    校验提示文案

    提交
    收起所有回复
  • 顺便友情提醒,在自己局域网这么玩可以,千万不要把asterisk的服务映射出去,否则分分钟请喝茶,而且被盗打了电话费要上天。

    校验提示文案

    提交
    [绷带] 我在外面用时都是套了一层openxxx的

    校验提示文案

    提交
    收起所有回复
  • 非常有意思的研究,这方面还从来没有接触过,对于一些需要内线电话的小单位来说有一定的价值,不过大部分人估计直接微信电话了,不过这个研究还是很值得敬佩的,感谢分享

    校验提示文案

    提交
  • 大佬牛批

    校验提示文案

    提交
  • 这个厉害了

    校验提示文案

    提交
  • 不明觉厉!!! [得意]

    校验提示文案

    提交
  • 震惊高某人

    校验提示文案

    提交
  • 这个跟刑,境外高价收购线路 [喜极而泣]

    校验提示文案

    提交
  • 这是折腾的乐趣。不一定实用

    校验提示文案

    提交
  • 这个不错,正好嫌现在电话线麻烦,借鉴一下,家里改无线ip电话

    校验提示文案

    提交
  • 高手在大妈

    校验提示文案

    提交
  • 牛呀!技术贴!

    校验提示文案

    提交
  • 这个真是牛批 [赞一个]

    校验提示文案

    提交
  • 牛*🐮

    校验提示文案

    提交
  • 一个字都看不懂

    校验提示文案

    提交
  • 去年把单位的30个固定电话改成voip的了,也是把综合网关配置导出来获取账号密码,然后将vlan绑定取消,用单位的ippbx接入后注册到电信ims网,最后各个办公室用ip话机接打

    校验提示文案

    提交
  • 其实我也有过这个想法,留学打电话用,后来发现墙和外面链路不一定有直连回国,还是微信语音好

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章

ubitsp

Ta还没有介绍自己

关注 打赏
最新文章 热门文章
483
扫一下,分享更方便,购买更轻松