从 H.248 到模拟 PSTN 线路——桥接运营商的固话网络并使固话能够独立运作
背景
这是我 2023 年的第一篇博文。很惭愧,在过去的两年里我并没有产出多少有意义、有价值的文章。但也因如此,这些被我记录在博客上的文章背后一定是我亟待解决的问题或想法被我解决/实现了而产生的。
其实这个问题我早在去年年中就已经解决了,但一直没闲下来记录我的探索过程,那就留到现在吧。
也是去年刚开年的时候,我刚完成《使用华为 MA5671A 代替我的 HN8145V 光猫》这篇文章。当时我刚用上模块式光接入设备,因此省去了光猫这一坨难管又多余的设备,但与之而来的问题也产生了——我担心家里的固定电话无法正常使用。
是的,9022 年了,我家依然存在固定电话这种上世纪的玩意。它一开始就伴随着屋子的落成而存在,在我还没拥有移动电话的时候,这路电话成了我每天早晨和晚上联络父母的唯一工具。
到了现在,虽然我平时并不会用它拨出任何通话,但是这路固话却可以用于接听紧急情况下的来电——是的,假使在深夜家里人突然遇到了紧急情况,此时拨打我们开启了勿扰/静音模式的手机不可能为他们提供任何帮助。因此,这就是我家一直保留固话的其中一个原因。不过,还有一个原因是,我家的宽带已经有非常多年的历史了,甚至连宽带拨号的账户也是这个固话的号码。
媒体网关控制协议 H.248 (MeGaCo)
换上模块式光接入设备之后,我的这一路固话要怎么办呢?由于运营商的光猫是必须支持这一协议的,光猫使用起来并没有任何问题。
另一个麻烦的玩意——IPTV 比这玩意解决起来可方便多了,在网路上有很多大佬都对桥接 VLAN 后的 IPTV 设置进行了介绍。而由于我家的 VoIP 固话是一种奇怪的协议实现的:H.248,与一种常见的协议 SIP 不同的是,这玩意并没有任何开源可用的软件支持,而后者却能使用各种软件轻松对接使用,因此从未有人对这个问题进行了探索。例如,上海电信的商业固话就是公网 SIP 协议,上海联通的固话则是 H.248 协议,山东联通和江西电信也是 H.248 协议。倒是 MGCP (RFC3435) 没见有地方在用,可能国内并没有大量集中采购支持这种协议栈的软交换设备。
MeGaCo => Media Gateway Controller => H.248 = RFC3015 或 RFC3525。维基百科说,MeGaCo 定义信号交换机制以允许媒体网关控制器控制网关来支持 PSTN 与 IP 网络或 IP 与 IP 网络之间的话音和传真电话传输。 该协议在 IETF 和 ITU 合作下由 IETF 定义成 RFC 3525,是 IETF 所给的名称。ITU 的名称为 H.248。好吧,虽然说非必要不提 ITU 的捷豹标准,但是这玩意却真实的用在了国内一部分 VoIP 设备上。
H.248 的历史演进
好了,那么我有没有办法找到运营商让他们进行修改呢?并且 SIP 协议这么成熟,一定有办法迁移过去的吧。
很遗憾,并没有。众所周知,SIP 用户上联 SBC,而 H.248 用户上联 AGCF。我所在地区的电信都用的是 H.248 协议,就连天下英雄城,文明〇〇〇也不例外。
The Access Gateway Control Function (AGCF) allows for legacy non-SIP networks to receive communication from an IMS network via a Media Gateway or Softswitch. The AGCF when working with a Media Gateway, a Call Session Controller, and Application Server function as a SIP agent within an IMS network. The role of the AGCF is to convert the H.248 signals it receives from an Access-MGW and translate them into appropriate SIP messages. This function allows for the network architecture to be IMS-compliant.
H.248,拿铁看了也头疼的协议
既然我不可能找运营商修改配置,那就只能硬着头皮去搞了。
找到一台设备
当时我的目标很明确:既然找不到这玩意的软件实现,就去找这玩意的硬件实现。我要找的玩意名字叫 IAD,也就是集成接入设备 (Integrated access device)。一开始我在闲鱼逛啊逛,买了一坨拉库的设备回来,似乎是设备太过古老,这些设备都不可用。
小黄鱼.jpg
也是去年的 2 月中旬,我刚离开家前往学校,后来我无意中注意到了一款锐捷的设备:星锐 SVG6004。当时也没多想就买了下来。
还是小黄鱼
这玩意居然能修改协议类型!我一下子觉得找到了解决方案。
星锐 SVG6000 系列设备的后台设置界面
一开始,我抄配置都不知道怎么抄,因为这些配置实在是太晦涩难懂了。
MG 设备的配置
后来我逐渐弄清楚了这些是什么玩意:
首选 MGC 地址/备选 MGC 地址:MGC 媒体网关服务器的地址,简单而言就是 MG 连接到的语音服务器地址。
首选 MGC 端口/备选 MGC 端口:MGC 媒体网关服务器的端口,2944 端口是基于文本的,2945 是基于二进制的(ASN.1)
MG 协议 ID/MG 域名:用于标识 MG 设备,类似于 hostname 又不完全是,这里我填入运营商分配的域名
MG 协议端口/MG 端口号:设备端口,同上,2944 端口是基于文本的,2945 是基于二进制的(ASN.1)
RTP 端点 ID/RTP 终结点标识:RTP TID 前缀和后面添加的数字部分组合成 RTP 端点 ID,这是 H.248 报文 Add 的内层端点 ID,一般来说是 RTP/XXXXX,我们这里沿用运营商配置 A100。一般运营商光猫里分前缀和后缀,RTP 终结点标识前缀则是 A100,后缀部分需要补全,我这里是 6 个 0,而运营商光猫里会分为 RTP 终结点标识名起始值 和 RTP 终结点标识后需要添加的数字位数,如果按照运营商的配置,前者是 0,后者是 6。组合起来就是 A100/000000。
MG 设备下级终端的配置
终端 ID 号,也就是这个 FXO 的标识号,被添加在 H.248 报文 Add 的外层。举个例子:AG58900 是一个终端 ID 号。我这里也沿用运营商配置:A0。
MG 设备的网络配置
最后把设备设置为 DHCP,再将桥接出的 VLAN 网络连接到设备即可使用。
摘机,拨打 10000,你会听到熟悉的语音!