3CX SIP 线路要求(上)

简介

在 3CX 中添加一条线路,请参见文章中的技术要求。这些要求可以分成两类:必需的和可选的:

必需项:

  1. 基于注册的线路
  2. 支持 rInstance 参数
  3. 允许的 IP 地址列表
  4. 支持 RFC2833 的 DTMF 格式
  5. 代理音频
  6. 错误代码

可选项:

  1. E164 号码格式
  2. TLS / SRTP
  3. 支持 T38
  4. 支持 SMS / MMS

由于篇幅问题,在本文中我们将会介绍必需项的技术要求,可选项的要求请查看后续文档。

必需项

基于注册

3CX 只支持基于注册的 SIP Trunk,因为与 3CX 对接的时候基于注册的 SIP Trunk 可以提供更多的功能和特性。注册也是实现 rinstance 的必要条件,后面会有 rinstance 的相关内容。

当 SIP Trunk 被添加后,3CX 会发送一条不包含验证信息的注册请求。如果接着收到 407 proxy authentication401 Unauthorized 消息,3CX 会发送一条新的注册响应,其中会包含注册所需的验证信息。

注意:三方验证(3-way authentication)也是支持的。

不包含验证信息的注册信息样例:

Via: SIP/2.0/UDP 10.10.10.10:5060;branch=z9hG4bK-524287-1;rport
Max-Forwards: 70
Contact: <sip:auth_ID@2.2.2.2:5060;rinstance=2622c879b98cfd93>
To: <sip:auth_ID@sip.domain.net:5060>
From: <sip:auth_ID@sip.domain.net:5060>;tag=6f679b75
Call-ID: TCoqe2Yl3wT50ot1-dSZYAQS..
CSeq: 1 REGISTER
Expires: 120
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REGISTER, SUBSCRIBE, NOTIFY, REFER, INFO, MESSAGE, UPDATE
Supported: replaces, timer
Content-Length: 0

对方发送的 407 挑战样例:

SIP/2.0 407 Proxy Authentication Required
Via: SIP/2.0/UDP 10.10.10.10:5060;branch=z9hG4bK-524287-1;rport=5060
Proxy-Authenticate: Digest nonce="XXXX",algorithm=MD5,realm="XXXX"
To: <sip:auth_ID@sip.domain.net:5060>;tag=2fe09c7f
From: <sip:auth_ID@sip.domain.net:5060>;tag=6f679b75
Call-ID: TCoqe2Yl3wT50ot1-dSZYAQS..
CSeq: 1 REGISTER
Content-Length: 0

包含验证信息的注册样例:

Via: SIP/2.0/UDP 10.10.10.10:5060;branch=z9hG4bK-524287-1;rport
Max-Forwards: 70
Contact: <sip:auth_ID@10.31.0.50:5060;rinstance=2622c879b98cfd93>
To: <sip:auth_ID@sip.domain.net:5060>
From: <sip:auth_ID@sip.domain.net:5060>;tag=6f679b75
Call-ID: TCoqe2Yl3wT50ot1-dSZYAQS..
CSeq: 2 REGISTER
Expires: 120
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REGISTER, SUBSCRIBE, NOTIFY, REFER, INFO, MESSAGE, UPDATE
Proxy-Authorization: Digest username="XXXX",realm="XXXX",nonce="XXXX",uri="XXXX",response="XXX",algorithm=MD5Supported: replaces, timer
Content-Length: 0

rInstance 参数

3CX 是如何使用 rinstance 参数的呢?

3CX 电话系统会使用这个参数进行呼叫源识别,为 SIP Trunk 匹配来电呼叫。这只适用于基于注册的 SIP Trunk,因为基于 IP 的线路不采用注册。简单来说,当 3CX 系统收到呼叫后,第一时间便会尝试匹配线路的 rinstance 参数。因为每个线路的 rinstance 参数不同,这样可以确保每个呼叫都会送到正确的目的地。

这样可以允许在 3CX 存在多个同一家供应商的线路,即使它们的所有其他参数都是一样的。3CX 系统会假定自己扮演 UAC(User Agent Client),向 UAS(User Agent Server,通常是 SIP 线路供应商) 发起注册请求。当 3CX 这么做的时候,会在向 UAS 发送的注册信息里包含 rinstance 参数。

这个参数是 Contact 字段的一部分,它对于每条线路都是独一无二的。当线路的注册状态是激活的时候,请确保这个参数保持不变。如果在两个 User Agents 之间的注册到期,或由另外一侧中断,下一次 3CX 将会尝试使用重新生成的 rinstance 参数发起注册。

注册样例:

Message Header
Via: SIP/2.0/UDP 10.10.10.10:5060;branch=z9hG4bK-524287-1---36545f783a0e7b00;rport
Max-Forwards: 70
Contact: <sip:auth_ID@2.2.2.2:5060;rinstance=187128bdfcec4b74>
To: " "<sip:auth_ID@sip.domain.net>
From: " "<sip:auth_ID@sip.domain.net>;tag=c97b4f35Call-ID: MPdDeqSR7zUFRYpbvEfQ3wrt..
CSeq: 2555 REGISTER
Expires: 600
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REGISTER, SUBSCRIBE, NOTIFY, REFER, INFO, MESSAGE, UPDATE
Supported: replaces, timer
User-Agent: 3CXPhoneSystem
Content-Length: 0

3CX 期望在回复的 200OK 信令中看到相同的 rinstance 参数。这个参数必须在 Contact 字段。

响应注册样例:

Message Header
Via: SIP/2.0/UDP 10.10.10.10:5060; branch=z9hG4bK-524287-1---36545f783a0e7b00;
From: " " <sip:auth_ID@sip.domain.net>;tag=c97b4f35
To: " " <sip:auth_ID@sip.domain.net>
Call-ID: MPdDeqSR7zUFRYpbvEfQ3wrt..
CSeq: 2555 REGISTER
Contact: <sip:auth_id@2.2.2.2:5060;rinstance=187128bdfcec4b74>;expires=60
Content-Length: 0

3CX 期望在整个呼入的通话过程中看到相同的 rinstance 参数和数值,这样可以匹配 INVITE 到正确的 SIP 线路。呼入过程中的 rinstance 参数必须在 Request-Line 字段。

如果线路有多个 DID(Direct Inward Dialing) 号码,不管被叫是什么号码,rinstance 参数都必须存在。

INVITE 样例:

Session Initiation Protocol (INVITE)
Request-Line: INVITE sip:DID@2.2.2.2:5060;rinstance=187128bdfcec4b74 SIP/2.0
Message Header
Via: SIP/2.0/UDP 1.1.1.1:5080;branch=z9hG4bK-f61ce555f5248ee834b54d1e1d541acf
From: " " <sip:NUMBER@sip.domain.net>;tag=5878966a
To: " " <sip:DID@sip.domain.net>
Call-ID: 3v1Vw8SxET87TOpNAZ9JYg..
CSeq: 2 INVITE
Max-Forwards: 13
Contact: <sip:NUMBER@1.1.1.1:5080;transport=udp>
Supported: replaces, timerAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REGISTER, SUBSCRIBE, NOTIFY, REFER, INFO, MESSAGE, UPDATE
Content-Length: 321

白名单 IP 列表

为了避免客户无法注册到他们的 SIP 线路,线路供应商必须确保下列事项:

  1. 如果线路供应商需要在客户的 3CX里添加白名单 IP 列表,这一点需要清晰的阐述。
  2. 线路供应商也应该能接收 3CX 的 IP 列表,以便在短时间内将其添加到白名单 IP 中。
  3. 如果可能,供应商需要可以通过添加 FQDN 作为白名单。必须遵循 FQDN 的 TTL 值,以确保任何 IP 变化都能及时更新。
  4. 线路供应商也应该提供一个电子邮件地址,当 3CX 需要新增 IP 列表时,通过该电子邮件接收这些更新并把 IP 添加到白名单内。
  5. 如果线路供应商不需要添加 IP 白名单(不封禁 IP 地址),也应该阐述清楚。

支持 RFC2833

RFC 2833 应该作为默认的 DTMF 方法,用于接收和发送 DTMF 音频。

这必须在所有通话的 SDP 中的 media attribute 下的 telephone-event 中表示支持。采样率可以通过使用的编码决定。

音频代理

线路供应商需要可以同时代理两个中断的音频,而不是通过将 SDP 发送给另一端。由于不是所有的防火墙都支持 hairpin 数据,这可能会导致音频问题。如果两个终端不支持相同的编码,音频代理也会开启音频转码。

错误代码

如果 3CX 系统使用错误的注册凭证向线路发起注册,返回的错误代码必须是下面之一:

  • 403 Forbidden
  • 404 Not Found
  • 603 Declined
  • 401 Unauthorized(不推荐)
  • 407 Proxy Authentication Required(不推荐)

这些错误代码会让 3CX 理解发送的凭证不对,并停止发起注册。直到注册的凭证被修改,或用户手动发起尝试。