@@ -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