出国狗的福音--使用树莓派搭建跨国语音短信设备
有朋友推荐了一个设备,我还没有测试,不过原理应该跟自己用树莓派搭建的系统一样,购买地址:https://item.taobao.com/item.htm?spm=a230r.1.14.53.250350a1rJhohU&id=558848686579&ns=1&abbucket=18 – 更新于 20180208
对于出国狗来说,在国外想要使用国内手机语音短信服务是个比较头疼的事情。这篇教程将教你用树莓派基于
Asterisk 实现一个 PBX 系统。最终的效果是:你可以在国外通过互联网使用你国内的手机号,享受的是国内手机号的资费。
基本的原理图
需要准备的东西
- 树莓派3B(使用2代也可以,不过性能不是很好)
- 一个带语音支持的 3G 卡托(尽量买华为的,并且一定要注意带语音支持,一般带语音的都是要卖出海外的,卖给国内的都是阉割掉语音功能的。我手里还有4个,有需要的可以找我,亲测可用,150国内包邮,国外的可以考虑从 阿里巴巴 上搜索 3g dongle voice 来购买。按照我两年前的实验来看,50多 CNY 的带语音卡托在树莓派上识别不出来,建议优先考虑华为,另外在 这里 有一份测试通过的型号清单,不过某些型号貌似也有好几种版本,比如我曾经买到过一个E169是没法用的。)
- 一个带电源的USB HUB(一定要带电源,因为供电不足的话,来去电的时候可能不稳定)
- 一根HDMI转VGA线(如果有HDMI显示器,可以忽略该配件)
- 一张至少8G的TF卡(建议买树莓派的时候一并购买)
- 5V2A的电源
前置技能
- Linux基本知识
- 最好有折腾过树莓派
- 折腾的精神
基础配置
1.首先我们需要去 http://www.raspberry-asterisk.org/downloads/ 这里下载最新的镜像,该镜像是基于 Debian
已经封装好的 FreePBX 系统,本次教程使用的是 raspbx-03-12-2017.zip,其中 Asterisk 13.18.3, FreePBX 14.0.1.20。
备注:该网站需要翻墙访问!
2.下载后,解压 raspbx-03-12-2017.zip,使用你熟悉的烧录软件,把解压出来的 .img 文件烧录进TF卡中。推荐使用 Etcher 进行烧录操作。用 Etcher 烧录还是比较方便,只需要三步即可。第一步选择镜像文件,第二步选择你的TF卡,第三步点击 Flash 即可开始。
3.插入TF卡到树莓派中,然后上电。系统默认用户密码为: root / raspberry。
4.登陆后,先配置 WiFi (如果计划使用网线,可以跳过该步,建议使用网线,稳定),打开 /etc/wpa_supplicant/wpa_supplicant.conf
文件,
1 | country=GB |
增加配置后,输入 reboot
进行重启,重启后,ifconfig
就能看到 IP 了,系统的 ssh 默认是开启状态,现在就可以使用 ssh 了。
另外镜像默认使用 4G 空间,如果你想扩展到 TF 卡全部空间,执行下面的命令
1 | raspi-config |
选择 Advanced Options ,再选择 Expand Filesystem,即可完成扩充。除此之外,也可以用 fdisk
命令完成,具体方法可以参考我博客上很早之前的一篇 博文。
5.打开浏览器,访问你树莓派IP,会看到如下的配置页面
6.增加管理用户后,显示下面的登录界面,
7.点击 FreePBX Administration
进行管理员登陆,开始配置,登陆后进行语言和时区设置
8.设置成功后,进入了管理主界面
9.从 Application
=> Extensions
=> Add Extension
=> Add New PJSIP Extension
10.需要填写的项目有 User Extension,DisplayName,Secret,Link to a Default User.
其中 User Extension 是你的内线号码,用于呼叫和登陆客户端;
DisplayName 是用于呼叫时的显示,可选填;
Secret 是你在客户端登陆时需要填写的密码,请使用健壮的密码,详见最后的 安全 章节;
Link to Default User 是让用户自己管理自己的号码,如果不需要,则选 None。
点击 Submit 后,保存成功。用同样的方法再创建一个用户用于测试。
创建完两个用户后,点击右上角的 Apply Config 使配置生效。
11.在 Settings => Asterisk SIP Settings 页面的 General SIP Settings 标签页下面,External Address 一栏填写你的外网IP或者你的外网域名,这里我填写了我的外网IP。Local Networks 中填写你的树莓派所在的子网。RTP Port Ranges 里,填写 10000 到 10100。这里不要使用 20000,测试来看,如果你只是自己用,设置 10100 很稳定。点击 Submit 保存。
12.切换到 Chan PJSIP Settings 标签页下面,把 tcp 设置为 yes,点击 Submit 保存。
Asterisk 默认使用的是 UDP,为了能保证手机app在后台运行时,可以及时收到来电提醒,需要开启 tcp 通信。
13.去自己的路由器上,设置端口映射,需要打开 5060 和 10000-10100,可以参考下图
14.去 http://www.linphone.org/ 下载 Linphone 到你的手机和电脑上,如下图分别用刚才新建立的两个账号登陆两个客户端。
现在从手机上,拨打 102 ,如果以上设置没有问题的话,电脑上就能响铃,接起来,两边听一下,看看有没有什么问题。如果有一方听不到,很可能是端口映射的问题,重新检查下配置。端口映射这里偶尔会有莫名奇妙的问题。
配置GSM,实现呼入和呼出
1.把 SIM 卡插入 3G 卡托,把 3G 卡托插到树莓派或者 USB HUB 上。
2.SSH 连接到树莓派后,执行下面的命令安装 dongle 扩展
1 | root@raspbx:~# install-dongle |
其中①输入你插入 3G 卡托里的手机卡号,②输入你要准备接收短信的邮箱地址,③如果你不想转发短信留空即可。
安装到最后,会再问你是否需要安装网页界面的发短信工具(即访问地址就是 http://raspbx_ip/sms),按照提示输入即可
1 | Would you like to install a webpage for sending SMS with |
注意:安装 dongle 扩展需要翻墙
3.回到网页配置界面,依次访问 Connectivity => Trunks => Add Trunk => Add Custom Trunk
4.在 General 标签页下面,设置一个 Trunk Name,Outbound CallerID 中填写你的手机号
5.在 custom Settings 中设置 dongle/dongle0/$OUTNUM$
。
这里如果你只是插了一个 3G Dongle,那么就是默认 dongle0,如果你设备上插了多个设备,你需要在命令行下输入一下命令,查看下所有的 Dongle:
1 | root@raspbx:~# asterisk -rx "dongle show devices" |
6.点击 Submit 保存设置,然后点击右上角的 Apply Config 使配置生效。
7.从 Connectivity => Outbound Routes => Add Outbound Route 中,在 Route Settings 下面填写一个 Route Name,在 Trunk Sequence for Matched Routes 中选择刚才添加的 Trunk。
6.切换到 Dial Patterns 标签下,按照下图来配置拨号规则,这里配置的规则是,匹配所有0开头的电话号码,把所有0开头的号码,去除开头的0后,转发到我们设置的那个 Trunk 上,进行呼出操作。
7.点击 Submit 保存配置,点击右上角 Apply Config 使配置生效。生效后,你现在可以用你的 App 进行外呼操作了,只要在要拨打的电话前加拨0,即可完成外拨。
8.在 Connectivity => Inbound Routes => Add Inbound Route => General 下,配置 Set Destination ,选择 Extension,从已经添加的 Extension 中,选择一个即可。点击 Submit 保存配置,点击右上角 Apply Config 使配置生效。生效后,你可以拨打你的 3G Dongle 中的手机卡号,如果顺利,你手机上的 App 将会接到这个呼入操作。
配置 Email,测试收发短信
1.输入如下命令进入 Email 配置界面:
1 | # dpkg-reconfigure exim4-config |
2.选择 internet site; mail is sent and received directly using SMTP
3.配置你的发信域名
4.保持默认值
- 配置为你的发信域名
6.以下几步保持默认值
7.该步输入 root
8.完成发信配置后,使用 send_test_email <your_email>
命令进行发信测试。打开你的邮箱,检查垃圾箱,100%的会被拦截,像我用的腾讯的企业邮,在 自助查询 中可以找到拦截信息,为了收信顺利,把你上面配置的发信域名加入邮箱的域名白名单即可。
9.用手机给自己 3G Dongle 里的手机卡发条短信,应该很快就能收到邮件了,
10.如果想要发送短信的话,我们可以通过 Web 页面进行,访问 http://your_raspbx_ip/sms,会提示你输入密码,这个密码即为你安装 Dongle 扩展的时候输入的那个密码,登陆后如下所示
注意:收件人手机号一定要加国号
设备安全!!!!!
先给大家看一个截图,
这是目前我的设备被暴力破解的情况。
请一定重视安全问题
再附上我之前的悲惨遭遇:https://www.v2ex.com/t/394297#reply11
1.首先,你的 Extension 一定要给各个账号配置超强的密码
2.其次,使用 Fail2ban 来防暴破。
1 | # install-fail2ban |
3.安装 Fail2ban 后,程序会自动启动,我们需要调整下配置,打开 /etc/fail2ban/jail.conf
文件,搜索 [asterisk]
,找到 maxretry
项,修改为 2,就是说密码输入错2次,就会被 Fail2ban 拦截。再搜索下 bantime
,修改为 604800
。配置好后,意味着有人要是输入错两次密码,那么这个人的 IP 就会被屏蔽一周。保存后,执行 systemctl restart fail2ban
重启服务使配置生效。
后记
本来计划争取半天写完,结果写了一天半。最初其实是计划写一本 《面向菜鸟的 Asterisk 教程》,把各种好玩的功能写进去的,让菜鸟也能轻松的用上牛逼的 Asterisk 。不过还是感觉自己的水平和能力没有达到,于是放弃了。
目前这篇教程里还未涉及的我已经测试可用的功能,还有 语音信箱,电话会议,电话组。其中 语音信箱 功能还是很赞的,可以在自己未接听电话的时候,自动把呼入转接到 语音信箱,让给你打电话的人给你留言,留言还可以配置发送到你的邮箱。这些功能有机会我再写教程吧。
目前这套方案,收发短信很稳定,语音通话的话,会受到你在国外手机网络连接回你国内家里的网络情况的影响。按照两年前去欧洲的时候我的测试来看,当时在瑞士的时候,连接回国内打电话大约会有将近1秒的延时,勉强可以通话。
如果有什么疑问,可以在本帖下面留言,我收到 回复提醒 后,会尽力第一时间给出答复。