Citrix ADC

一组 SIP 服务器负载平衡

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

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

图 1. 基于 SIP 的通信系统

sip

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

  • 无持久性设置的 Call-ID 哈希负载平衡方法
  • 基于 Call-ID 的持久性和最小连接或循环负载平衡方法
  • 具有最少连接或循环负载均衡方法的基于规则的持久

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

注意:要使负载平衡起作用,您必须配置 SIP 代理,以便它们不会将私有 IP 地址或私有域添加到 SIP 标头/负载中。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 连接。

下图显示了配置为对通过 TCP 或 UDP 发送 SIP 消息的一组 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 服务器的网关,请配置 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。在命令提示符下,键入以下命令之一,分别创建使用网络地址作为条件的 RNAT 条目和 SNIP 作为 NAT IP 地址、使用网络地址作为条件的 RNAT 条目以及使用唯一 IP 地址作为 NAT IP 地址的 RNAT 条目、使用 ACL 作为 RNAT 条目条件和 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. 要将 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 CORVER 消息并查找压缩标头。如果邮件包含压缩标头,则策略将以“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