Skip to content

Commit 11a7726

Browse files
author
eddie
committed
update
1 parent 8504bbf commit 11a7726

File tree

1 file changed

+92
-8
lines changed
  • content/kamailio/adv-ip-record-route

1 file changed

+92
-8
lines changed

content/kamailio/adv-ip-record-route/index.md

Lines changed: 92 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,101 @@ categories:
1616
- VPC1和VPC2使用内网IP交互
1717
- VPC2没有公网IP
1818

19+
```mermaid
20+
flowchart LR
21+
jssip --> opensips --> freeswich
22+
```
23+
24+
25+
节点 | 内网IP | 公网IP | 监听端口wss | 监听端口udp
26+
--- | --- | --- | --- | ---
27+
opensips | 192.168.0.10 | 1.2.3.4 | 4443 | 5060
28+
freeswich | 192.168.0.11 | 无 | | 5060
29+
30+
31+
# 场景1: OpenSIPS不增加Record-Route
32+
33+
```mermaid
34+
sequenceDiagram
35+
autonumber
36+
client->>opensips: INVITE/WSS
37+
opensips->>freeswich: INVITE/UDP
38+
freeswich-->>opensips: 200 Ok/UDP
39+
opensips-->>client: 200 Ok/WSS
40+
note right of client: 无任何Record-Route头,客户端的ACK由根据200 Ok的Contact决定
41+
client ->> WhereToGo: ACK
42+
```
43+
44+
client收到200OK, 由于无Record-Route头,client的ACK由根据200 Ok的Contact决定。
45+
46+
WhereToGo 那么有以下几种可能:
47+
48+
1. 200 OK Contact 是 opensips的内网地址 192.168.0.10, ACK发往192.168.0.10, 这个肯定是不通的。
49+
2. 200 OK Contact 是 freeswich的内网地址 192.168.0.11, ACK发往192.168.0.11, 这个也肯定不通。
50+
2. 200 Ok Contact 是 opensips的公网地址 1.2.3.4, ACK发往opensips的公网地址 1.2.3.4, 这个请求opensips可以收到
51+
52+
结论:如果200 Ok 没有Record-Route, 那么OpenSIPS再发出200 OK的时候,Contact必须设置成自己的OpenSIPS的公网地址。
53+
54+
# 场景2: OpenSIPS 增加Record-Route头
55+
56+
```mermaid
57+
sequenceDiagram
58+
autonumber
59+
client->>opensips: F1 INVITE/WSS
60+
opensips->>freeswich: F2 INVITE/udp
61+
freeswich-->>opensips: F3 200 Ok/UDP
62+
opensips-->>client: F4 200 Ok/WSS
63+
```
64+
65+
再F2步骤:添加Record-Route头。
66+
67+
```sh
68+
Record-Route: <sip:192.168.0.10:5060;transport=udp;r2=on;lr>
69+
Record-Route: <sip:192.168.0.10:4443;transport=wss;r2=on;lr>
70+
```
71+
72+
一般被叫侧不会改写Record-Route头,在响应消息中,Record-Route会原封不动的回复给client。
73+
74+
在F4: 当client在 200 ok里发现Record-Route头后
75+
76+
```sh
77+
Record-Route: <sip:192.168.0.10:5060;transport=udp;r2=on;lr>
78+
Record-Route: <sip:192.168.0.10:4443;transport=wss;r2=on;lr>
79+
```
80+
81+
ACK将会根据record-route进行路由。
82+
83+
```mermaid
84+
flowchart LR
85+
client --> 192.168.0.10:4443 --> 192.168.0.10:5060
86+
```
87+
88+
这里发现了 client将会把ACK发送给 opensips的内网地址,这个显然是不通的。
89+
90+
# 解决问题
91+
92+
既然知道问题的原因,那么解决这个问题就非常简单了,只需在Record-Route设置正确的ip地址就可以了。
93+
94+
在opensips里,可以使用
95+
1996
```c
20-
client --- 1.2.3.4/udp ---> VPC1 --- 192.168.0.10/udp ---> VPC2
97+
socket = wss:192.168.0.10:4443 as 1.2.3.4:4443
98+
socket = udp:192.168.0.10:5060
2199
```
22100

101+
也可以使用
102+
```c
103+
advertised_address="1.2.3.4"
104+
```
23105

24-
节点 | 内网IP | 公网IP
25-
--- | --- | ---
26-
VPC1 | 192.168.0.10 | 1.2.3.4
27-
VPC2 | 192.168.0.11 | 无
106+
也可以使用
107+
```c
108+
route [some_route] {
28109

110+
set_advertised_address("1.2.3.4");
111+
}
112+
```
29113

30-
1. client通过1.2.3.4访问VPC1
31-
2. VPC1因为要在后续请求中也保持在路径中,所以要做record-route
32-
3.
114+
# 延伸方案
115+
除了用record-route来路由,我们还可以使用拓扑隐藏。
116+
拓扑隐藏模块将会删除的record-route, 并修改200 Ok的Contact, ack路由将会根据200 ok的Contact地址来路由,

0 commit comments

Comments
 (0)