Kamailio 网络拓扑案例分享
网络拓扑比较特别
Kamailio 单网卡
IMS -------------- Kamailio ------------ Fs
10.2.3.4 listen 192.168.1.100 172.16.1.99
外网地址 10.2.3.5
外网地址 172.16.1.100
对于 IMS 来说,只能用 10.2.3.5 访问 Kamailio
对于 Fs 来说, 只能用 172.16.1.100 访问 Kamailio
Kamailio 配置如下:
listen=udp:192.168.1.100:5060
alias=10.2.3.5:5060 # myself 逻辑
alias=172.16.1.100:5060 # myself 逻辑
路由脚本需要特别处理:
如果 INVITE 来自 IMS , 设置分支标志 FLB_SRC_IMS_DST_FS,不能调用 record_route(Kamailio 理解不了这种网络拓扑),而是 route(RR)
如果 INVITE 来自 Fs, 设置分支标志 FLB_SRC_FS_DST_IMS,同理,需要 route(RR)
下面是 route[RR] 的具体实现:
route[RR] {
if (isbflagset(FLT_SRC_FS_DST_IMS)) {
record_route_preset("10.2.3.5:5060", "172.16.1.100:5060");
add_rr_param(";r2=on");
else if (isbflagset(FLT_SRC_IMS_DST_FS)){
record_route_preset("172.16.1.100:5060", "10.2.3.5:5060");
add_rr_param(";r2=on");
} else {
record_route();
}
return;
}
rtpengine.conf 这样配置:
interface=ims/192.168.1.100!10.2.3.5;fs/192.168.1.100!172.16.1.100
...
NATMANAGE 的路由代码为:
route[NATMANAGE] {
...
if (is_request() && !has_totag()) {
if (isbflagset(FLT_SRC_FS_DST_IMS)) {
$xavp(r=>$T_branch_idx) = $xavp(r=>$T_branch_idx) + " direction=ims direction=fs";
} else if (isbflagset(FLT_SRC_IMS_DST_FS)) {
$xavp(r=>$T_branch_idx) = $xavp(r=>$T_branch_idx) + " direction=fs direction=ims";
}
}
...}
if (is_request() && !has_totag()) 的意思是,direction 调用一次就行,rtpengine 非常聪明
Kamailio 的中文好文章在哪里?^_^