背景
path 模块
的主要功能是在REGISTER
请求中添加Path
头, 这样在后续拨打该注册用户时,可以找到回去的路径。
官方文档地址: path,
path
的rfc文档为: path的rfc3327
本次测试的版本为:
version: kamailio 5.8.5 (x86_64/linux)
参数解析
1
2
3
4
5
6
7
8
9
10
|
# 将会使用第一个Route的received参数作为目的URI
modparam("path", "use_received", 1)
# 这个received的参数要和alias的参数保持一致
modparam("path", "received_format", 1)
# 设置received的名称
modparam("path", "received_name", "rcv")
# 会添加两个Path头,一个PATH的头是进来的网络socket,另一个是出去的网络socket。
modparam("path", "enable_r2", 1)
# 这个Path的uri会包含sn的参数
modparam("path", "sockname_mode", 1)
|
重要函数
add_path()
添加Path
头, 这个URI为outgoing
的地址
add_path(user)
添加Path
头, 设置URI的用户为user
add_path(user, parameters)
添加Path
头, 设置URI的用户为user
, 并添加parameters
参数。
add_path_received()
添加received
参数到Path
。
add_path_received(user)
添加received
参数到Path
, 并设置用户为user
。
add_path_received(user, parameters)
添加received
参数到Path
, 并设置用户为user
, 并添加parameters
参数。
实战
配置示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
listen=udp:172.16.4.111:5461
loadmodule "stun.so"
loadmodule "outbound.so"
loadmodule "path.so"
modparam("path", "use_received", 1)
modparam("path", "received_format", 1)
#modparam("path", "enable_r2", 1)
modparam("path", "sockname_mode", 1)
...
route[REGISTRAR] {
if (!is_method("REGISTER")) return;
if(isflagset(FLT_NATS)) {
setbflag(FLB_NATB);
#!ifdef WITH_NATSIPPING
# do SIP NAT pinging
setbflag(FLB_NATSIPPING);
#!endif
}
fix_nated_contact();
if (!save("location","0x02")) {
#if (!save("location")) {
sl_reply_error();
}
$fs="udp:172.16.4.111:5461";
$du="sip:172.16.4.114:5060";
add_path();
#msg_apply_changes();
#assign_hf_value("Contact", "<sip:$fU@172.16.4.111:5461>;expires=120");
#msg_apply_changes();
route(RELAY);
exit;
}
|
测试
测试场景

此种情况下,注册sip
信令图:

- 软电话
1005
发出的REGISTER
到kamailio
的请求信息为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
2025/08/07 10:54:41.399376 172.16.80.13:59393 -> 172.16.4.111:5461
REGISTER sip:172.16.4.111:5461 SIP/2.0
Via: SIP/2.0/UDP 172.16.80.13:59393;rport;branch=z9hG4bKPj77f2c0f3baa14df98ab811dd0e6a132b
Max-Forwards: 70
From: <sip:1005@172.16.4.111>;tag=1c4f54303f984e3bbaf7825c43e5eee4
To: <sip:1005@172.16.4.111>
Call-ID: 647cb3bee39541c8ad4491d749e727fc
CSeq: 18516 REGISTER
User-Agent: MicroSIP/3.21.6
Contact: <sip:1005@172.16.80.13:59393;ob>
Expires: 200
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Authorization: Digest username="1005", realm="172.16.4.111", nonce="be470993-7965-415f-b466-e94c2ddab774", uri="sip:172.16.4.111:
61", response="394b758a1f68f04af2998d17a59c2e96", algorithm=MD5, cnonce="0d405a7726f2402e8c9db4e3cc694603", qop=auth, nc=00000001
Content-Length: 0
|
kamailio
转发REGISTER
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
2025/08/07 10:54:41.399817 172.16.4.111:5461 -> 172.16.4.114:5060
REGISTER sip:172.16.4.111:5461 SIP/2.0
Via: SIP/2.0/UDP 172.16.4.111:5461;branch=z9hG4bK7294.4630172030dfbcb1018abcde74766f45.0
Via: SIP/2.0/UDP 172.16.80.13:59393;received=172.16.80.13;rport=59393;branch=z9hG4bKPj77f2c0f3baa14df98ab811dd0e6a132b
Max-Forwards: 69
From: <sip:1005@172.16.4.111>;tag=1c4f54303f984e3bbaf7825c43e5eee4
To: <sip:1005@172.16.4.111>
Call-ID: 647cb3bee39541c8ad4491d749e727fc
CSeq: 18516 REGISTER
User-Agent: MicroSIP/3.21.6
Contact: <sip:1005@172.16.80.13:59393;ob>
Expires: 200
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Authorization: Digest username="1005", realm="172.16.4.111", nonce="be470993-7965-415f-b466-e94c2ddab774", uri="sip:172.16.4.111:
61", response="394b758a1f68f04af2998d17a59c2e96", algorithm=MD5, cnonce="0d405a7726f2402e8c9db4e3cc694603", qop=auth, nc=00000001
Content-Length: 0
|
此时Contact
为:<sip:1005@172.16.80.13:59393;ob>
freeswitch
中的注册信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Call-ID: 647cb3bee39541c8ad4491d749e727fc
User: 1005@172.16.4.114
Contact: "" <sip:1005@172.16.80.13:59393;ob>
Agent: MicroSIP/3.21.6
Status: Registered(UDP)(unknown) EXP(2025-08-07 10:57:59) EXPSECS(137)
Ping-Status: Reachable
Ping-Time: 0.00
Host: fs
IP: 172.16.4.111
Port: 5461
Auth-User: 1005
Auth-Realm: 172.16.4.111
MWI-Account: 1005@172.16.4.114
|
- 使用
1008
拨打1005
的信令图:

可以看到INVITE
的Request-URI
就是1005
注册信息中的Contact
。
此时这个请求透过了kamailio
。
放开注释:
1
2
|
msg_apply_changes();
assign_hf_value("Contact", "<sip:$fU@172.16.4.111:5461>;expires=120");
|
- 软电话
1005
发出的REGISTER
到kamailio
的请求信息为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
2025/08/07 11:07:04.155172 172.16.80.13:59393 -> 172.16.4.111:5461
REGISTER sip:172.16.4.111:5461 SIP/2.0
Via: SIP/2.0/UDP 172.16.80.13:59393;rport;branch=z9hG4bKPj3c4917ead53c4a649e796e7bb26c1779
Max-Forwards: 70
From: <sip:1005@172.16.4.111>;tag=de351588eb384435b10b45196b4040b9
To: <sip:1005@172.16.4.111>
Call-ID: 57b5c50d07b14706b046df403e99da99
CSeq: 37388 REGISTER
User-Agent: MicroSIP/3.21.6
Contact: <sip:1005@172.16.80.13:59393;ob>
Expires: 200
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Authorization: Digest username="1005", realm="172.16.4.111", nonce="f951f7e5-c53e-46f8-bfa5-ad6ff146ccc9", uri="sip:172.16.4.111:
61", response="d4d6608c547f105e00cacd4dd3820ad4", algorithm=MD5, cnonce="cf45cd14e34d435f994cdc1f82acb62d", qop=auth, nc=00000001
Content-Length: 0
|
kamailio
转发REGISTER
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
2025/08/07 11:07:04.156456 172.16.4.111:5461 -> 172.16.4.114:5060
REGISTER sip:172.16.4.111:5461 SIP/2.0
Via: SIP/2.0/UDP 172.16.4.111:5461;branch=z9hG4bK804c.e67315908cbc104f4f519092f4d97ecb.0
Via: SIP/2.0/UDP 172.16.80.13:59393;received=172.16.80.13;rport=59393;branch=z9hG4bKPj3c4917ead53c4a649e796e7bb26c1779
Max-Forwards: 69
From: <sip:1005@172.16.4.111>;tag=de351588eb384435b10b45196b4040b9
To: <sip:1005@172.16.4.111>
Call-ID: 57b5c50d07b14706b046df403e99da99
CSeq: 37388 REGISTER
User-Agent: MicroSIP/3.21.6
Contact: <sip:1005@172.16.4.111:5461>;expires=120
Expires: 200
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Authorization: Digest username="1005", realm="172.16.4.111", nonce="f951f7e5-c53e-46f8-bfa5-ad6ff146ccc9", uri="sip:172.16.4.111:
61", response="d4d6608c547f105e00cacd4dd3820ad4", algorithm=MD5, cnonce="cf45cd14e34d435f994cdc1f82acb62d", qop=auth, nc=00000001
Content-Length: 0
|
可以看到Contact
变成了<sip:1005@172.16.4.111:5461>;expires=120
freeswitch
中的注册信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Call-ID: 57b5c50d07b14706b046df403e99da99
User: 1005@172.16.4.114
Contact: "" <sip:1005@172.16.4.111:5461>
Agent: MicroSIP/3.21.6
Status: Registered(UDP)(unknown) EXP(2025-08-07 11:07:07) EXPSECS(128)
Ping-Status: Reachable
Ping-Time: 0.00
Host: fs
IP: 172.16.4.111
Port: 5461
Auth-User: 1005
Auth-Realm: 172.16.4.111
MWI-Account: 1005@172.16.4.114
|
- 使用
1008
拨打1005
的信令图:

可以看到INVITE
的Request-URI
就是1005
注册信息中的Contact
。
先不管是否拨打成功,但是这个修改是我们需要的。
使用add_path
放开注释:
- 软电话
1005
发出的REGISTER
到kamailio
的请求信息为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
2025/08/07 11:13:29.926084 172.16.80.13:59393 -> 172.16.4.111:5461
REGISTER sip:172.16.4.111:5461 SIP/2.0
Via: SIP/2.0/UDP 172.16.80.13:59393;rport;branch=z9hG4bKPj734f2bbe803b4b7b8c7da61c7cae8121
Max-Forwards: 70
From: <sip:1005@172.16.4.111>;tag=60b64f9e189d4b73973b95640e5c1894
To: <sip:1005@172.16.4.111>
Call-ID: ca33e9a8ff504a0d9e7aa0ebd558dc32
CSeq: 28980 REGISTER
User-Agent: MicroSIP/3.21.6
Contact: <sip:1005@172.16.80.13:59393;ob>
Expires: 200
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Authorization: Digest username="1005", realm="172.16.4.111", nonce="19ab3d8a-f754-48eb-b964-382a4ea6bb2a", uri="sip:172.16.4.111:
61", response="5feb7261cfafb500baa1c72efc942aa5", algorithm=MD5, cnonce="1abc1ff721484c69b50097870f1f445c", qop=auth, nc=00000001
Content-Length: 0
|
kamailio
转发REGISTER
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
2025/08/07 11:14:35.168348 172.16.4.111:5461 -> 172.16.4.114:5060
REGISTER sip:172.16.4.111:5461 SIP/2.0
Via: SIP/2.0/UDP 172.16.4.111:5461;branch=z9hG4bK3ebc.e457de15226712c7162a35cacec1aa9a.0
Via: SIP/2.0/UDP 172.16.80.13:59393;received=172.16.80.13;rport=59393;branch=z9hG4bKPjb2b73fc8e50849a5ae4aa5e71bb7c2ca
Max-Forwards: 69
From: <sip:1005@172.16.4.111>;tag=62cbc4d210e245d5b7b8bdb733825fb5
To: <sip:1005@172.16.4.111>
Call-ID: f5fbf048dd164736a91b0b8558d518e7
CSeq: 46523 REGISTER
User-Agent: MicroSIP/3.21.6
Contact: <sip:1005@172.16.80.13:59393;ob>
Expires: 200
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Authorization: Digest username="1005", realm="172.16.4.111", nonce="c8884fe9-cac0-4cf0-ab70-4f4a5f9588ef", uri="sip:172.16.4.111:
61", response="b605239c7eadc7ac5476e9e6072e615e", algorithm=MD5, cnonce="e1f085bbf949401980c867444c03f104", qop=auth, nc=00000001
Content-Length: 0
Path: <sip:172.16.4.111:5461;lr>
|
可以看到Contact
没变,但是Path
添加了<sip:172.16.4.111:5461;lr>
。
freeswitch
中的注册信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Call-ID: f5fbf048dd164736a91b0b8558d518e7
User: 1005@172.16.4.114
Contact: "" <sip:1005@172.16.80.13:59393;ob;fs_path=sip%3A172.16.4.111%3A5461%3Blr>
Agent: MicroSIP/3.21.6
Status: Registered(UDP)(unknown) EXP(2025-08-07 11:14:38) EXPSECS(177)
Ping-Status: Reachable
Ping-Time: 0.00
Host: fs
IP: 172.16.4.111
Port: 5461
Auth-User: 1005
Auth-Realm: 172.16.4.111
MWI-Account: 1005@172.16.4.114
|
新增了fs_path=sip%3A172.16.4.111%3A5461%3Blr
。
- 使用
1008
拨打1005
的信令图:

可以看到Request-URI
为sip:1005@172.16.80.13:59393
,但是发送请求到172.16.4.111:5461
。
还添加了Route
头为:172.16.4.111:5461
。
总结
当我们使用kamailio
用作注册服务器时,一方面可以通过修改REGISTER
中的Contact
达到后续的请求转发到kamailio
,
另一方面可以通过add_path
添加Path
头,达到此目的,当然前提是被注册的服务器要支持path
。
Path
是在发送INVITE
请求给注册的用户时,能往回发送INVITE
请求到注册的路径。
Record-Route
是在建立INVITE
会话接通之后,信令找回的路径。