@@ -16,17 +16,101 @@ categories:
16
16
- VPC1和VPC2使用内网IP交互
17
17
- VPC2没有公网IP
18
18
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
+
19
96
``` 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
21
99
```
22
100
101
+ 也可以使用
102
+ ``` c
103
+ advertised_address=" 1.2.3.4"
104
+ ```
23
105
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] {
28
109
110
+ set_advertised_address ("1.2.3.4");
111
+ }
112
+ ```
29
113
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