我想使用 netsed 来改变在 Linux 系统(debian 10 stretch)上运行的 PBX 服务器上的传入 SIP 流量(UDP 端口 5060)。
在第一步中,我只是尝试设置手机连接到 UDP/5061,并使用该命令启动 netsed:
./netsed udp 5061 127.0.0.1 5060 s/profile-level-id=4280D/profile-level-id=42800D
流量被拦截、更改并转发至 PBX 软件的 5060 端口。
不幸的是,SIP 协议“注意到”电话使用的端口与 PBX 不匹配(由于端口转发,PBX 使用 5060,而电话使用 5061)。现在的问题是如何使用 netsed 来实现这一点。
所以问题是如何在与 pbx 相同的系统上创建透明代理。
或者有没有办法使用已经在端口 5060 上监听的 netsed,然后将其传递给端口 5060 上的 pbx 软件?
更深层次的背景是,用于拨出电话的 Mobotix 门电话没有正确编码配置文件级别 ID 字段(它应该是六个 base16 字符长,但只有五个字符长)。我的想法是,只要 SIP-Invite 进入 PBX,就简单地更改配置文件级别 ID。
相同问题堆栈溢出。
答案1
首先...问题是:SIP 不是用于 VoIP 的唯一协议。SIP 只是握手机制。它的工作是提供状态更新,并告诉端点在哪里发送/接收音频。其他协议实际上负责传输音频...(即 RTP)。SIP 在端点音频编解码器以及端点之间进行协商以发送音频。服务器告诉客户端将 RTP 发送到特定的 IP 和端口...并且由于 RTP 是 UDP 并且无连接...客户端无法知道服务器是否正在接收音频。即使您对所有内容(SIP 和 RTP)进行 NAT...服务器可能仍会拒绝大量流量,因为源/目标 IP 和端口与预期不匹配。
您真正需要的是能够理解 NAT 和 SIP 协议的东西。有些 sip 代理/网关可以正确地进行协议转换。(siproxyd、ALG、STUN、ICE 和许多其他)大多数 SIP 服务器软件都有一种机制来执行 sip NAT 处理。例如:
Asterisk:您可以在conf中指定一些全局变量,如下所示:
externip=x.x.x.x
localnet=y.y.y.y/m
在对等配置中,你可以nat=yes
使用 RFC3581 指定或依赖端点nat=no
Freeswitch:您可以根据需要在指定时指定“internal.xml”和“external.xml”
<param name="ext-sip-ip" value="x.x.x.x"/>
<param name="ext-rtp-ip" value="x.x.x.x"/>
由于没有关于您正在运行什么类型的 SIP 服务器的更多信息,我只能提供一些提示。