OPS
<<<----------------------------- ingress
内网 | 公网
|
|
192.168.2.11 | 1.2.3.4
INNER_IP | OUTER_IP
|
|
------------------------------>>> egress
常见共有云的提供的云服务器,一般都有一个内网地址如192.16.2.11和一个公网地址如1.2.3.4。 内网地址是配置在网卡上的;公网地址则只是一个映射,并未在网卡上配置。
我们称从公网到内网的方向为ingress,从内网到公网的方向为egress。
对于内网来说OpenSIPS的广播地址应该是INNER_IP, 所以对ingress方向的SIP请求,Via应该是INNER_IP。对于公网来说OpenSIPS的广播地址应该是OUT_IP, 随意对于egress方向的SIP请求,Via应该是OUTER_IP。
我们模拟一下,假如设置了错误的Via的地址会怎样呢?
例如从公网到内网的一个INVITE, 如果Via头加上的是OUTER_IP, 那么这个请求的响应也会被送到OPS的公网地址。但是由于网络策略和防火墙等原因,这个来自内网的响应很可能无法被送到OPS的公网地址。
一般情况下,我们可以使用listen的as参数来设置对外的广告地址。
listen = udp:192.168.2.11:5060 as 1.2.3.4:5060
这样的情况下,从内网发送到公网请求,携带的Via就被被设置成1.2.3.4。
但是也不是as设置的广告地址一定正确。这时候我们就可以用OpenSIPS提供的核心函数set_advertised_address或者set_advertised_port()来在脚本里自定义对外地址。
例如:
if (请求来自外网) {
set_advertised_address("192.168.2.11");
} else {
set_advertised_address("1.2.3.4");
}