对于不依赖IPsec的VoLTE和VoWiFi,实现起来相对比较简单,可以在网上搜索到很多资料,本文不再赘述。
在VoLTE中,某些运营商(如:中国联通)必须要使用IPsec加密才能进行IMS注册,这也是比较容易的,因为在Linux的操作系统内核中有一个xfrm框架就是用来做这个的,我们只需要将通过“SIP注册-401”协商好的加密策略设置到系统,内核就会在后续的数据交互中自动帮我们实现IPsec加密。
然而对于VoWiFi,终端本身就需要与ePDG通过IKE协商一个IPsec隧道,这时由于运营商要求,隧道内的IMS交互还需要再协商一层IPsec加密。然而xfrm框架并不支持IPsec策略的嵌套。
那么如何解决这个问题呢?有以下几种场景:
1、使用LTE成品模组
1)如果采用的是自带VoWiFi功能的LTE模组,那么请查看LTE模组开发手册。
2)如果LTE模组不带VoWiFi功能,但模组采购量够大,可以和模组厂商定制,例如:将模组进行IPsec加密后的数据包转发到系统,由系统进行二层IPsec加密。
2、不使用LTE成品模组
1)不要使用内核 IPsec,而是在用户空间实现其中一层IPsec加密
2)使用网络命名空间来分隔两个IPsec实例
3)运行两台不同的(虚拟、物理)机器,仅限研发期间调试