我们有一对面向互联网的 SIP PROXY/REGISTRAR 服务器(用于弹性和负载平衡)。当 SIP 电话注册时,它将由其中一个 REGISTRAR 服务器(循环 DNS)处理 - 并且由于此注册是续订的,因此防火墙端口/地址转换得以维护。因此,当要将呼叫发送回电话时,INVITE 消息会成功通过防火墙。
但是,也可能出现手机在其中一个服务器上注册,但 INVITE 却来自另一个服务器的情况。在这种情况下,由于防火墙上没有转换功能,通话会失败。
SIP 协议中是否有一个功能可以实现这一点?还有其他想法吗?随着流量的增长,我们无疑会拥有两台以上的服务器 - 因此问题将会加剧。
谢谢,
麦克风
答案1
我们在 Junos 12.1R2.9 上的 Juniper SRX 上遇到了同样的问题。
SIP 提供商有 4 个 IP 地址,这些地址通过 DNS 循环更改,并且显然有数百个(最多 512 个)IP 地址发送 RTP 数据包。
之前的防火墙是 Snapgear,比较旧,但使用起来很方便。Juniper 有对称 NAT,似乎更严格。
我们设法使用持久源 nat 将音频从内部传输到外部。
对于从外部到内部的音频,我们必须添加源 nat 规则:
- 使用时禁用 SIP ALG。
- 确保始终连接到 SIP 提供商的同一 IP(例如 131.131.160.2)。
- 如果流量来自 SIP 提供商的 IP 范围,则将源地址映射到相同的 IP 地址 131.131.160.2。
持久 NAT 确保允许流量。显然它有效。也许可以跳过第 2 步,但考虑到迄今为止的停机时间,我还是保留了它。
nat { 源 { 池 sip-zipt-nl-no-round-robin { 地址 { 131.131.160.2/32; } } 地址持久; 接口 { 端口过载关闭; } 规则集 trust-to-untrust { 从区域 trust; 到区域 untrust; 规则源 nat 规则 { 匹配 { 源地址 0.0.0.0/0; } 然后 { 源 nat { 接口 { 持久 nat { 允许任何远程主机; } } } } }
规则集 sip-incoming { 来自区域 untrust; 到区域 trust; 规则 sip-zipt-nl-no-round-robin { 匹配 { 源地址 131.131.160.0/23; 目标地址 0.0.0.0/0; } 然后 { 源 nat { 池 { sip-zipt-nl-no-round-robin; } } } } }
答案2
实际的问题是您的代理/注册商不共享注册数据库。