Asterisk 一直混淆 public 和私有 IP,因此当软电话位于 NAT 后面时,呼叫没有音频

Asterisk keeps confusing public and private IPs so calls have no audio when softphones are behind NAT

我正在尝试使用星号和定制的移动应用程序建立一个 voip 系统,以便在用户之间进行通话。 该系统在同一网络上设置时运行完美,但一旦部署到在线服务器上,由于软电话位于 NAT 之后,音频无法通过,但所有 SIP 数据包都已正确接收,软电话响铃,但当呼叫打开时, 两个端点都听不到音频。 我到处都在寻找关于如何设置 asterisk 以与 NAT 后面的端点一起工作的信息,但是网上的所有内容都在谈论 sip 在旧版本的 Asterisk 上。但我使用的是最新版本的 Asterisk,它使用 Pjsip.conf,我已经为端点尝试了不同的设置,但 RTP 仍然混淆了 IP 并尝试将 RTP 数据包路由到私有 IP 而不是 public 知识产权。 我试过 rewrite_contact、direct_media、force_rport、ice_support、rtp_symmetric 不同的选项,似乎没有找到完美的设置。

以前有人做过吗?你有任何我可以查看的 Asterisk 最新版本的文档吗?

肯定有很多人以前这样做过。

官方网站上有相关文档

https://wiki.asterisk.org/wiki/display/AST/Configuring+res_pjsip+to+work+through+NAT

显然,在 asterisk 部署上不需要做任何事情。这是一个客户端问题,客户端 sip phone 需要为媒体启用 RPORT,而我使用的 MizuDroid 没有该功能。一旦我切换到 Zoiper 并设置该选项,一切都开始正常工作。

在你的 pjsip 传输中(type=你的扩展使用的传输)你必须设置 local_net, external_media_address, external_signaling_address :

[transport-udp-nat]
type = transport
protocol = udp
bind = 0.0.0.0
local_net = (your local network like 192.168.0.0/24)
external_media_address = (your external IP)
external_signaling_address = (your external IP)

此外,您必须在扩展中使用:

rewrite_contact = yes
direct_media = no 
force_rport = yes
rtp_symmetric = yes