一组 SIP 服务器负载平衡

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

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

图 1. 基于 SIP 的通信系统

啜饮

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

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

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

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

服务器启动的流量

对于 SIP 服务器启动的出站流量,请在 Citrix ADC 上配置 RNAT,以便将客户端使用的私有 IP 地址转换为公有 IP 地址。

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

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

对策略和表达式的支持

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

通过 TCP 或 UDP 为 SIP 信令流量配置负载平衡

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

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

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

图 2. SIP 负载平衡拓扑

sip-lb-topology

实体类型 名称 IP 地址 端口 服务类型/协议书
虚拟服务器 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)以外的监视器监视服务的状态,请创建自定义监视器并将其绑定到服务。Citrix ADC 提供两种自定义监视器类型,即 SIP-UDPSIP-TCP ,用于监视 SIP 服务。

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

  5. 如果要使用 Citrix ADC 作为部署中 SIP 服务器的网 Gateway,请配置 RNAT。

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

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

创建一个或多个服务。在命令提示窗口中,键入:

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

示例:

add service Service-SIP-UDP-1 192.0.2.5 SIP_UDP 80

根据需要创建任意数量的虚拟服务器以处理您创建的服务。虚拟服务器类型必须与您将绑定到它的服务类型相匹配。在命令提示窗口中,键入:

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

示例:

add lb vserver Vserver-LB-1 SIP_UDP 10.102.29.60 80

将每个服务绑定到虚拟服务器。在命令提示窗口中,键入:

bind lb vserver <name> <serverName>

示例:

bind lb vserver Vserver-LB-1 Service-SIP-UDP-1

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

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

bind lb monitor <monitorName> <ServiceName>

示例:

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

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

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

示例:

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

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

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

bind rnat <name> <natIP>@ …

show rnat

示例:

add rnat RNAT-1 192.168.1.0 255.255.255.0

bind rnat RNAT-1 -natip 10.102.29.50

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

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

bind ssl service <serviceName> -certkeyName <string>

示例:

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

bind ssl service nsrnatsip-127.0.0.1-5061 -certkeyName c1

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

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

用于通过 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

用于通过 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

用于通过 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

使用配置实用程序配置 SIP 流量的基本负载平衡设置

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

  2. 单击“服务”部分,并添加类型为 SIP_UDP、SIP_TCP 或 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. 要将 MIP 或 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的 Citrix ADC 内部服务。要绑定该对:

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

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

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

您可以配置响应程序策略,以拦截来自客户端的 SIP DRESP 消息并查找压缩标头。如果邮件包含压缩标头,则策略将以“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