☰
Yeastar PSTN网关与FreePBX对接实战:SIP Trunk配置与避坑指南
2026/10/21 4:51:34 网站建设 项目流程

1. 项目缘起与整体设计思路

1.1 为什么要在本地环境里折腾PSTN网关

很多刚接触企业语音通信的朋友会问一个问题:现在即时通讯工具这么发达,为什么还要在机房里摆一台PSTN网关,再配一套软交换?这个问题我在过去几年被问过不下几十次。答案其实很朴素——只要还有传真机、还有对公客服热线、还有需要走传统电话线路的报警主机和POS机,PSTN这条链路就断不了。而Yeastar这类PSTN网关的价值,就是把这些"老古董"设备和现代的IP语音系统桥接起来,让它们能在一个统一的呼叫路由里被管理。

我这次要复盘的项目,就是在一个中小型办公场景里,把一台Yeastar的PSTN网关和一套FreePBX软交换对接起来。目标很明确:外线电话进来能正常振铃分机,分机拨外线能正常出局,传真能收发,语音质量稳定不掉线。听起来简单,但真正动起手来,从物理接线到SIP信令再到拨号计划,每一步都埋着坑。这篇文章我会把整个对接过程拆开揉碎,把每个环节的"为什么"讲清楚,把踩过的坑和绕过去的办法都摊开来说。

1.2 整体架构与选型考量

先说一下整体架构。这个场景里,Yeastar PSTN网关负责和运营商的外线对接,它一侧是FXO或FXS口接模拟线路,另一侧是以太网口跑SIP协议;FreePBX则作为IP-PBX核心,负责分机注册、呼叫路由、IVR、语音信箱这些业务逻辑。两者之间通过SIP Trunk互联,网关把外线呼叫转成SIP INVITE发给FreePBX,FreePBX再根据拨号计划把呼叫送到对应分机。

为什么选Yeastar而不是别的品牌?坦白说,在这个预算档位里,Yeastar的FXO口抗回声和挂机检测做得相对扎实,Web管理界面也够直观,对新手比较友好。而FreePBX选它是因为生态成熟,Asterisk底子厚,社区文档多,遇到问题搜一下基本都有答案。这两个凑一起,是很多中小项目的经典组合。

但经典组合不代表无脑对接。核心难点在于两套系统对SIP协议的理解和默认参数不一致,比如DTMF的传输方式、呼叫进度音的生成方、注册与鉴权的方向、Codec的优先级顺序。这些参数只要有一个对不上,表现就是"能注册但打不通"或者"能打通但没声音"或者"按键没反应"。下面我按实际动手顺序,把每个环节展开。

2. 核心细节解析与实操要点

2.1 物理接线与端口规划

动手第一步永远是接线。Yeastar网关的FXO口接运营商外线,FXS口接模拟话机,网口接交换机。这里有个新手极易忽略的点:FXO口和FXS口不能接反。FXO是"接外线"的口,它模拟的是一台电话机,向运营商局端发起摘机;FXS是"接话机"的口,它模拟的是局端,给模拟话机提供馈电和铃流。接反了轻则不工作,重则可能损坏端口。

我在这个项目里用的是4口FXO的网关,四条外线分别来自不同运营商。接线时我做了标记,每条线对应哪个运营商、哪个号码,全部记在表格里。这个习惯救过我很多次,因为后面排查"某条线打不通"时,能快速定位是线路问题还是配置问题。

网络侧,网关和FreePBX服务器放在同一个二层网络里,走内网SIP,避免NAT带来的麻烦。如果必须跨网段,那就要在网关和服务器两侧都正确配置SIP NAT相关参数,这个后面会细说。

2.2 SIP Trunk对接的核心参数

这是整个项目最关键的部分。Yeastar网关作为SIP客户端(UAC)向FreePBX注册,或者FreePBX作为客户端向网关注册,两种方向都行,但我推荐让网关向FreePBX注册,因为FreePBX作为注册服务器更好管理,分机状态一目了然。

在Yeastar侧,需要配置一条VoIP Trunk,填写FreePBX的IP、端口(默认5060)、以及一个在FreePBX里创建好的SIP分机账号作为鉴权用户。在FreePBX侧,创建一个SIP Trunk,类型选"Friend"或"Peer"都行,关键是host填网关的IP,context指向一个自定义的入站路由上下文。

这里第一个坑来了:Codec顺序。Yeastar默认可能把G729排在前面,而FreePBX这边如果没装G729的授权,协商就会失败或者回落到G711但音质异常。我的做法是两边都统一成G711a(PCMA)优先,G711u(PCMU)次之,G722再次。G711虽然带宽占用比G729高,但在内网环境里带宽根本不是瓶颈,音质和兼容性才是第一位的。

第二个坑是DTMF模式。默认可能是RFC2833,但有些FXO口在检测到按键后,如果网关和服务器对DTMF的处理方式不一致,就会出现"IVR按键无反应"。我的经验是:内网对接统一用RFC2833,如果遇到问题再尝试inband或SIP INFO。RFC2833的好处是DTMF作为RTP事件包传输,不受语音编码影响,最稳定。

2.3 拨号计划与路由逻辑

拨号计划是另一个重灾区。FreePBX的Outbound Route负责把分机拨的号码送到网关,Inbound Route负责把网关送来的呼叫送到分机或IVR。

出局方向,我建了一条Outbound Route,匹配规则是_9.,意思是分机先拨9再拨外线号码。为什么加前缀9?因为要和外部分机号区分开,避免误拨。Trunk顺序里把Yeastar的Trunk放在第一位。这里要注意去掉前缀的设置,FreePBX里有个"Strip"选项,填1,表示把开头的9去掉再送给网关。

入局方向,我建了一条Inbound Route,匹配网关送来的DID(如果运营商提供)或者直接匹配任意来电。Destination指向一个IVR或者振铃组。这里有个细节:Yeastar送过来的主叫号码格式可能是+86xxxxxxxx或者0xxxxxxxx,如果FreePBX这边没做号码规范化,来电显示就会很奇怪。我在Inbound Route里加了一条号码处理规则,把前缀统一去掉,保证分机上显示的是干净的号码。

2.4 传真与特殊业务的处理

传真在VoIP环境里是个老大难。T.38是专门为传真设计的协议,但实际部署中经常因为网络抖动或设备兼容性问题失败。我的策略是先试T.38,不行就回落到G711透传(T.38 fallback to G711)。Yeastar网关里有个传真模式选项,选"T.38 Relay"或者"Pass-through",FreePBX那边也要在Trunk里允许T.38。

实测下来,如果两边都是内网、网络质量好,T.38成功率很高;如果跨了公网或者有丢包,G711透传反而更稳,因为传真调制解调器对时延抖动极其敏感,T.38虽然抗丢包但实现质量参差不齐。这个没有银弹,只能根据实际线路质量来调。

3. 实操过程与核心环节实现

3.1 Yeastar网关侧配置全流程

登录Yeastar的Web界面,第一步进"System"->"Network",确认IP、网关、DNS正确。DNS很重要,因为有些运营商要求SIP服务器用域名而不是IP。

第二步进"Extension"->"VoIP Trunk",新建一条Trunk。类型选"Register Trunk",服务器地址填FreePBX的IP,端口5060,用户名和密码填FreePBX里创建的SIP分机账号。高级设置里,Transport选UDP(内网UDP足够,TCP在丢包时重传反而增加时延),Qualify选Yes(定期发OPTIONS包检测Trunk状态),From Domain填FreePBX的IP。

第三步进"Port"->"FXO",逐个端口配置。Answer Delay设成2秒左右,太短可能漏掉来电,太长用户等得着急。Ring Detection用默认的,如果运营商铃流特殊再调。Hangup Detection选"Polarity Reversal"或"Loop Current Drop",这个取决于运营商,如果挂机检测不准,会出现"对方挂了但这边还占线"的情况。

第四步进"Call Routing"->"Outbound",配置从FXO口出局的规则。这里要匹配FreePBX送来的号码,然后选择从哪个FXO口出。如果多条外线,可以设成轮询或按优先级。

3.2 FreePBX侧配置全流程

FreePBX这边,先创建SIP分机给网关用。进"Applications"->"Extensions",新建一个"Generic SIP Device",分机号比如9999,密码设复杂点。这个分机不给人用,只给网关注册。

然后进"Connectivity"->"Trunks",新建SIP Trunk。Trunk Name随便起,Outbound CallerID填外线号码,PEER Details里填host=网关IP、type=friend、context=from-trunk、dtmfmode=rfc2833、disallow=all、allow=ulaw&alaw&g722。USER Details里填type=user、context=from-trunk、secret=分机密码。

接着进"Connectivity"->"Outbound Routes",新建路由。Dial Patterns填_9.,Trunk Sequence选刚才建的Trunk,Strip填1。再进"Inbound Routes",新建路由,DID Number留空表示匹配所有,Set Destination指向IVR或振铃组。

最后进"Settings"->"Asterisk SIP Settings",确认NAT设置正确。如果服务器有公网IP且网关在内网,NAT选Yes;如果都在内网,NAT选No。Local Networks填内网网段,避免Asterisk把内网包当成外部包处理。

3.3 联调与验证步骤

配置完两边,先看Trunk状态。Yeastar的"Status"->"VoIP Trunk"里应该显示"Registered";FreePBX的"Reports"->"Asterisk Info"->"SIP Peers"里应该能看到网关的IP和状态"OK"。

然后测试出局:用分机拨9加一个手机号,听有没有回铃音,对方接不接得通。如果没声音,检查Codec和RTP端口范围(默认10000-20000)有没有被防火墙挡。

再测试入局:用手机拨外线号码,听分机响不响。如果不响,看FreePBX的CDR(呼叫详单)里有没有记录,有记录说明信令通了,问题在路由或分机;没记录说明信令没到,问题在Trunk或网关。

最后测试DTMF:拨入后按IVR提示按键,看能不能正确跳转。不行就换DTMF模式再试。

3.4 参数计算与选择依据

有人问RTP端口范围怎么定。默认10000-20000是20000个端口,每个呼叫占2个(收发各一),理论上支持10000路并发,对中小场景绰绰有余。但如果防火墙规则太宽泛有安全顾虑,可以缩小到10000-10100,支持50路并发,够用且更安全。

Codec带宽方面,G711每路约87.2kbps(含IP头),G729约31.2kbps,G722约87.2kbps但音质更好。内网千兆环境,100路G711也就8.7Mbps,毫无压力。所以内网优先选G711或G722,别为了省带宽牺牲音质。

4. 常见问题与排查技巧实录

4.1 注册失败类问题

现象:Trunk一直显示Unregistered或Rejected。

排查顺序:先ping对方IP通不通;再telnet对方5060端口通不通;然后看用户名密码对不对(注意大小写);最后看FreePBX的"fail2ban"有没有把网关IP封了。我遇到过好几次是fail2ban误封,因为网关重试注册太频繁被当成攻击。解决办法是在fail2ban的白名单里加上网关IP。

还有一个隐蔽的坑:SIP端口的传输协议。如果一边用UDP一边用TCP,注册包发过去对方不认。两边必须一致,内网统一UDP最省事。

4.2 单通与无声类问题

现象:能打通,但一方听不到另一方。

这是NAT和RTP的经典问题。如果网关和服务器都在内网,检查FreePBX的SIP设置里externip和localnet有没有配对。如果服务器有双网卡,Asterisk可能把SIP信令从一张网卡收,RTP却从另一张网卡发,导致对方收不到包。解决办法是在sip.conf或pjsip.conf里显式绑定网卡。

另一个原因是Codec协商失败。用asterisk -rvvv进控制台,看呼叫建立时的SIP信令,如果看到488 Not Acceptable Here,就是Codec不匹配。把两边的allow列表改成完全一致即可。

4.3 DTMF失灵类问题

现象:通话正常,但按键无反应。

先确认两边DTMF模式一致。如果都是RFC2833还不行,试试在FreePBX的Trunk里加dtmfmode=rfc2833并重启Asterisk。有些FXO口对DTMF的检测有延迟,可以在Yeastar里调DTMF检测灵敏度。

还有一个偏方:如果IVR是FreePBX自带的,试试换成自定义的AGI脚本处理DTMF,有时候是IVR模块本身的问题。

4.4 挂机检测异常类问题

现象:对方挂了,这边还占线,分机拿起来没声音。

这是FXO口挂机检测没配好。Yeastar里FXO的"Hangup Detection"有几种模式:Polarity Reversal(极性反转,最可靠但需要运营商支持)、Loop Current Drop(回路电流中断)、Busy Tone(忙音检测)。国内运营商多数支持极性反转,如果不支持就选忙音检测,但要确保忙音频率和网关预设的一致。

我遇到过一次运营商既不发极性反转,忙音频率又和网关默认的450Hz不一样,最后是抓包分析忙音频率,手动填进去才解决。

4.5 常见问题速查表

问题现象可能原因排查动作解决方向
Trunk未注册账号密码错/端口不通/被封ping、telnet、看fail2ban改密码、开端口、加白名单
能拨通无声音NAT/RTP/Codec问题看SIP信令、抓RTP包配NAT、统一Codec
按键无反应DTMF模式不一致对比两边DTMF设置统一RFC2833
挂机后占线挂机检测未配好看FXO口状态调挂机检测模式
传真失败T.38兼容性差看传真日志回落G711透传
音质断续网络抖动/Codec问题ping测丢包、看Codec换G711、优化网络

4.6 独家避坑心得

第一个心得:改配置前先备份。Yeastar和FreePBX都支持导出配置,改之前导一份,改坏了能快速回滚。我有次改Codec顺序把整个Trunk搞挂了,幸好有备份,五分钟恢复。

第二个心得:一次只改一个参数。同时改多个参数,出问题不知道是哪个引起的。这是调试的基本纪律,但很多人一着急就忘了。

第三个心得:善用抓包。tcpdump -i eth0 -w capture.pcap port 5060 or portrange 10000-20000,然后用Wireshark分析。SIP信令看INVITE、200 OK、ACK的交互,RTP看有没有单向流。抓包能解决90%的疑难杂症。

第四个心得:日志级别调高。FreePBX的Asterisk日志默认级别较低,调试时在logger.conf里把console和full都设成debug,能看到更多细节。Yeastar的日志也可以在Web界面里导出。

5. 国内VoIP发展的一些个人观察

5.1 从模拟到IP的迁移现状

做了这些年语音项目,一个明显的感受是:纯模拟PBX的新装项目几乎绝迹了,但存量设备的替换和利旧需求一直存在。很多单位不是不想上IP,而是手里的模拟话机、传真机、报警主机还能用,全换掉成本太高。PSTN网关正好卡在这个缝隙里,让老设备继续发挥余热,同时享受IP系统的管理便利。

国内运营商对SIP Trunk的开放程度这几年在提高,但各地差异很大。有的地区可以直接申请SIP中继,有的地区还是只能给模拟线或者数字中继。这就导致PSTN网关在很长时间内仍有市场,尤其是需要保留多个运营商线路做冗余的场景。

5.2 技术选型的现实考量

选型时别只看参数表。稳定性、兼容性、售后响应速度这三样比多几个花哨功能重要得多。我见过太多项目因为贪便宜选了小众品牌,结果一个挂机检测问题折腾两周,最后换设备了事。

另外,文档和社区是隐形成本。FreePBX之所以流行,很大程度上是因为遇到问题能搜到答案。Yeastar的文档也算齐全,但中文资料相对少一些,有些细节得自己摸索。这个心理准备要有。

5.3 给后来者的几点建议

如果你正准备做类似的项目,我的建议是:先在实验室搭一套最小环境跑通,再去现场。实验室里用两台虚拟机加一台网关,把注册、呼叫、DTMF、传真全测一遍,把参数记下来。现场施工时直接套用,效率高很多。

还有,和运营商确认线路参数。是极性反转还是忙音检测?铃流频率多少?有没有提供DID?这些信息提前问清楚,能省掉现场一半的调试时间。

最后,别怕抓包。语音问题的排查,抓包是最直接的手段。学会看SIP信令和RTP流,你的排障能力会上一个台阶。

这个项目做完,我最大的体会是:VoIP对接没有玄学,所有问题都能从信令和参数里找到答案。坑之所以是坑,往往是因为我们对某个参数的默认值想当然了。把每个参数的来龙去脉搞清楚,坑自然就填平了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询