ADC

对一组 SIP 服务器进行负载平衡

会话初始协议 (SIP) 旨在启动、管理和终止多媒体通信会话。它已成为互联网电话(VoIP)的标准。SIP 消息可以通过 TCP 或 UDP 传输。SIP 消息有两种类型:请求消息和响应消息。

基于 SIP 的通信系统中的流量通过专用设备和应用程序(实体)路由。在多媒体通信会话中,这些实体交换消息。下图显示了基于 SIP 的基本通信系统:

图 1. 基于 SIP 的通信系统

SIP

NetScaler 使您能够通过 UDP 或 TCP(包括 TLS)对 SIP 消息进行负载平衡。您可以将 NetScaler 配置为对一组 SIP 代理服务器的 SIP 请求进行负载平衡。为此,您需要创建负载平衡虚拟服务器,将负载平衡方法和持久性类型设置为以下组合之一:

  • 没有持久性设置的 call-ID 哈希负载平衡方法
  • 基于呼叫 ID 的持久性,采用最少连接或循环负载平衡方法
  • 具有最少连接或循环负载均衡方法的基于规则的持久

此外,默认情况下,NetScaler 通过 SIP 请求的标头附加 RPORT,以便服务器将响应发回请求的源 IP 地址和端口。

注意:要使负载平衡起作用,您必须配置 SIP 代理,以便它们不会将专用 IP 地址或私有域添加到 SIP 标头/负载中。SIP 代理必须在 SIP 标头中添加一个解析为 SIP 虚拟服务器的 IP 地址的域名。此外,SIP 代理必须与公共数据库通信才能共享注册信息。

服务器发起的流量

对于 SIP 服务器发起的出站流量,在 NetScaler 上配置 RNAT,以便将客户端使用的专用 IP 地址转换为公有 IP 地址。

如果您配置了包含 RNAT 源端口或目标端口的 SIP 参数,则设备会将请求数据包的源端口和目标端口的值与 RNAT 源端口和 RNAT 目标端口的值进行比较。如果其中一个值匹配,则设备使用 RPORT 更新 VIA 标头。然后,来自客户端的 SIP 响应会遍历与请求相同的路径。

对于服务器启动的 SSL 流量,NetScaler 使用内置的证书密钥对。 如果您想使用自定义证书密钥对,请将自定义证书密钥对绑定到名为 nsrnatsip-127.0.0.1-5061 的 NetScaler 内部服务。

对策略和表达式的支持

NetScaler 默认表达式语言包含多个在会话初始协议 (SIP) 连接上运行的表达式。这些表达式只能绑定到基于 SIP 的(sip_udp、sip_tcp 或 sip_ssl)虚拟服务器和全局绑定点。您可以在内容切换、速率限制、响应程序和重写策略中使用这些表达式。

为 TCP 或 UDP 上的 SIP 信号流量配置负载平衡

NetScaler 可以对通过 UDP 或 TCP 发送请求的 SIP 服务器(包括由 TLS 保护的 TCP 流量)进行负载平衡。ADC 提供以下服务类型来对 SIP 服务器进行负载平衡:

  • SIP_UDP — 在 SIP 服务器通过 UDP 发送 SIP 消息时使用。
  • SIP_TCP — 在 SIP 服务器通过 TCP 发送 SIP 消息时使用。
  • SIP_SSL — 用于使用 SSL 或 TLS 保护 TCP 上的 SIP 信号流量。NetScaler 支持以下模式:
    • 客户端、ADC 和 SIP 服务器之间的端到端 TLS 连接。
    • 客户端与 ADC 之间的 TLS 连接,以及 ADC 与 SIP 服务器之间的 TCP 连接。
    • 客户端与 ADC 之间的 TCP 连接,以及 ADC 与 SIP 服务器之间的 TLS 连接。

下图显示了配置为对一组通过 TCP 或 UDP 发送 SIP 消息的 SIP 服务器进行负载平衡的设置的拓扑。

图 2. SIP 负载平衡拓扑

SIP LB 拓扑

实体类型 名称 IP 地址 Port(端口) 服务类型/协议
虚拟服务器 Vserver-LB-1 10.102.29.65 80 SIP_UDP/SIP_TCP/SIP_SSL
服务 Service-SIP-1 192.168.1.6 80 SIP_UDP/SIP_TCP/SIP_SSL
  Service-SIP-2 192.168.1.5 80 SIP_UDP/SIP_TCP/SIP_SSL
显示器 默认值 80 SIP_UDP/SIP_TCP/SIP_SSL

以下是为 SIP 流量配置基本负载平衡的概述:

  1. 配置服务,为要进行负载平衡的每种 SIP 流量配置虚拟服务器:

    • SIP_UDP — 如果您要通过 UDP 对 SIP 流量进行负载平衡。
    • SIP_TCP — 如果您要通过 TCP 对 SIP 流量进行负载平衡。
    • SIP_SSL — 如果您正在通过 TCP 进行负载平衡和保护 SIP 流量。

    注意:如果您使用 SIP_SSL,请务必创建 SSL 证书密钥对。有关更多信息,请参阅添加证书密钥对。

  2. 将服务绑定到虚拟服务器。

  3. 如果要使用默认监视器(tcp-default)以外的监视器监视服务的状态,请创建自定义监视器并将其绑定到服务。NetScaler 提供两种自定义监视器类型,即 SIP-UDP 和 SIP-TCP ,用于监视 SIP服务。

  4. 如果使用 SIP_SSL 虚拟服务器,请将 SSL 证书密钥对绑定到虚拟服务器。

  5. 如果您在部署中使用 NetScaler 作为 SIP 服务器的网关,请配置 RNAT。

  6. 如果要将 RPORT 附加到从 SIP 服务器启动的 SIP 消息中,请配置 SIP 参数。

使用命令行界面为 SIP 流量配置基本负载平衡设置

创建一项或多项服务。在命令提示符下,键入:

add service <name> <serverName> (SIP_UDP | SIP_TCP | SIP_SSL) <port>
<!--NeedCopy-->

示例:

add service Service-SIP-UDP-1 192.0.2.5 SIP_UDP 80
<!--NeedCopy-->

根据需要创建尽可能多的虚拟服务器来处理您创建的服务。虚拟服务器类型必须与绑定到虚拟服务器的类型匹配。在命令提示符下,键入:

add lb vserver <name> <serverName> (SIP_UDP | SIP_TCP | SIP_SSL) <port>
<!--NeedCopy-->

示例:

add lb vserver Vserver-LB-1 SIP_UDP 10.102.29.60 80
<!--NeedCopy-->

将每项服务绑定到虚拟服务器。在命令提示符下,键入:

bind lb vserver <name> <serverName>
<!--NeedCopy-->

示例:

bind lb vserver Vserver-LB-1 Service-SIP-UDP-1
<!--NeedCopy-->

(可选)创建 SIP-UDP 或 SIP-TCP 类型的自定义监视器,并将该监视器绑定到服务。在命令提示符下,键入:

add lb monitor <monitorName> <monitorType> [<interval>]

bind lb monitor <monitorName> <ServiceName>
<!--NeedCopy-->

示例:

add lb monitor mon1 sip-UDP -sipMethod REGISTER -sipuRI sip:mon@test.com -sipregURI sip:mon@test.com -respcode 200

bind monitor mon1 Service-SIP-UDP-1
<!--NeedCopy-->

如果您创建了 SIP_SSL 虚拟服务器,请将 SSL 证书密钥对绑定到虚拟服务器。在命令提示符处,键入:在命令提示符处,键入:

bind ssl vserver <vServerName> -certkeyName <certificate-KeyPairName> -CA –skipCAName
<!--NeedCopy-->

示例:

bind ssl vserver Vserver-LB-1 -certkeyName CertKey-SSL-1
<!--NeedCopy-->

根据您的网络拓扑要求配置 RNAT。在命令提示符下,键入以下命令之一,分别创建使用网络地址作为条件和 SNIP 作为 NAT IP 地址的 RNAT 条目、使用网络地址作为条件并使用唯一 IP 地址作为 NAT IP 地址的 RNAT 条目、使用 ACL 作为条件并使用 SNAT IP 地址的 RNAT 条目,或者使用 ACL 作为条件的 RNAT 条目和作为 NAT IP 地址的唯一 IP 地址:

add rnat <name> (<network> | (<aclname> [-redirectPort <port>]))

bind rnat <name> <natIP>@ …

show rnat
<!--NeedCopy-->

示例:

add rnat RNAT-1 192.168.1.0 255.255.255.0

bind rnat RNAT-1 -natip 10.102.29.50
<!--NeedCopy-->

如果您想使用自定义证书密钥对,请将自定义证书密钥对绑定到名为 nsrnatsip-127.0.0.1-5061 的 NetScaler 内部服务。

add ssl certKey <certkeyName> -cert <string> [-key <string>]

bind ssl service <serviceName> -certkeyName <string>
<!--NeedCopy-->

示例:

add ssl certKey c1 -cert cert.epm -key key.ky

bind ssl service nsrnatsip-127.0.0.1-5061 -certkeyName c1
<!--NeedCopy-->

如果要将 RPORT 附加到 SIP 服务器启动的 SIP 消息中,请在命令提示符处键入以下命令:

set lb sipParameters -rnatSrcPort <rnatSrcPort> -rnatDstPort<rnatDstPort> -retryDur <integer> -addRportVip <addRportVip> - sip503RateThreshold <sip503_rate_threshold_value>
<!--NeedCopy-->

通过 UDP 对 SIP 流量进行负载平衡的示例配置

add service service-UDP-1 10.102.29.5 SIP_UDP 80

Done

add lb vserver vserver-LB-1 SIP_UDP 10.102.29.60 80

Done

bind lb vserver vserver-LB-1 service-UDP-1

Done

add lb mon mon1 sip-udp -sipMethod REGISTER -sipuRI sip:mon@test.com -sipregURI sip:mon@test.com -respcode 200

Done

bind mon mon1 service-UDP-1

Done

add rnat RNAT-1 192.168.1.0 255.255.255.0

Done

set lb sipParameters -rnatSrcPort 5060 -rnatDstPort 5060 -retryDur 1000 -addRportVip ENABLED -sip503RateThreshold 1000

Done
<!--NeedCopy-->

通过 TCP 对 SIP 流量进行负载平衡的配置示例

add service service-TCP-1 10.102.29.5 SIP_TCP 80

Done

add lb vserver vserver-LB-1 SIP_TCP 10.102.29.60 80

Done

bind lb vserver vserver-LB-1 service-TCP-1

Done

add lb mon mon1 sip-tcp -sipMethod REGISTER -sipuRI sip:mon@test.com -sipregURI sip:mon@test.com -respcode 200

Done

bind mon mon1 service-TCP-1

Done

add rnat RNAT-1 192.168.1.0 255.255.255.0

Done

set lb sipParameters -rnatSrcPort 5060 -rnatDstPort 5060 -retryDur 1000 -addRportVip ENABLED -sip503RateThreshold 1000

Done
<!--NeedCopy-->

通过 TCP 进行负载平衡和保护 SIP 流量的示例配置

add service service-SIP-SSL-1 10.102.29.5 SIP_SSL 80

Done

add lb vserver vserver-LB-1 SIP_SSL 10.102.29.60 80

Done

bind lb vserver vserver-LB-1 service-SIP-SSL

Done

add lb mon mon1 sip-tCP -sipMethod REGISTER -sipuRI sip:mon@test.com -sipregURI sip:mon@test.com -respcode 200

Done

bind mon mon1 service-SIP-SSL

Done

bind ssl vserver Vserver-LB-1 -certkeyName CertKey-SSL-1

Done

add rnat RNAT-1 192.168.1.0 255.255.255.0

Done

set lb sipParameters -rnatSrcPort 5060 -rnatDstPort 5060 -retryDur 1000 -addRportVip ENABLED -sip503RateThreshold 1000

Done
<!--NeedCopy-->

使用 GUI 为 SIP 流量配置基本负载平衡设置

  1. 导航到 流量管理 > 负载平衡 > 虚拟服务器,然后添加类型为 SIP_UDP、SIP_CP 或 SIP_SSL 的虚拟服务器。

  2. 单击 服务 部分,然后添加类型为 SIP_UDP、SIP_CP 或 SIP_SSL 的服务。

  3. (可选)单击 监视器 部分,然后添加类型的监视器:SIP-UDP 或 SIP-TCP。

  4. 将监视器绑定到服务,然后将服务绑定到虚拟服务器。

  5. 如果您创建了 SIP_SSL 虚拟服务器,请将 SSL 证书密钥对绑定到虚拟服务器。单击“证书”部分,然后将证书密钥对绑定到虚拟服务器。

  6. 根据您的网络拓扑要求配置 RNAT。要配置 RNAT:

    1. 导航到 系统 > 网络 > 路由
    2. 在路由页面上,单击 RNAT 选项卡。
    3. 在详细信息窗格中,单击 配置 RNAT
    4. 在“配置 RNAT”对话框中,执行以下操作之一:
      • 如果要使用网络地址作为创建 RNAT 条目的条件,请单击 网络 并设置以下参数:
        • 网络
        • 网络掩码
      • 如果要使用扩展 ACL 作为创建 RNAT 条目的条件,请单击 ACL 并设置以下参数:
        • ACL 名称
        • 重定向端口
    5. 要将 SNIP 地址设置为 NAT IP 地址,请跳到步骤 7。
    6. 若要将唯一 IP 地址设置为 NAT IP,请在“可用 NAT IP”列表中选择要设置为 NAT IP 的 IP 地址,然后单击“添加”。您选择的 NAT IP 将显示在已配置的 NAT IP 的列表中。
    7. 单击 Create(创建),然后单击 Close(关闭)。

    如果您想使用自定义证书密钥对,请将自定义证书密钥对绑定到名为 nsrnatsip-127.0.0.1-5061 的 NetScaler 内部服务。要绑定配对,请执行以下操作:

    1. 导航到 流量管理 > 负载平衡 > 服务 ,然后单击内部服务选项卡。
    2. 选择 nsrnatsip-127.0.0.1-5061 然后单击“编辑”。
    3. 单击“证书”部分并将证书密钥对绑定到内部服务。
  7. 如果要将 RPORT 附加到 SIP 服务器启动的 SIP 消息中,请配置 SIP 参数。导航到 流量管理 > 负载平衡 ,然后单击更改 SIP 设置,设置各种 SIP 参数。

SIP 表达式和策略示例:在客户端请求中启用压缩

NetScaler 无法处理压缩的客户端 SIP 请求,因此客户端 SIP 请求会失败。

您可以配置响应程序策略,拦截来自客户端的 SIP NOGATE 消息并查找压缩标头。如果消息包含压缩标头,则策略以“400 错误请求”进行响应,以便客户端在不压缩请求的情况下重新发送请求。

在命令提示符处,键入以下命令以创建响应者策略:

add responder action sipaction1 respondwith q{"SIP/2.0 400 Bad Requestrnrn"}

Done

add responder policy sippol1

add responder policy sippol1 "SIP.REQ.METHOD.EQ("NEGOTIATE")&&SIP.REQ.HEADER("Compression").EXISTS" sipaction1
<!--NeedCopy-->