Citrix ADC

SIP 协议的应用程序层网关

将大型 NAT (LSN) 与会话初始协议 (SIP) 结合使用非常复杂,因为 SIP 消息在 SIP 标头以及 SIP 正文中包含 IP 地址。与 SIP 一起使用 LSN 时,SIP 标头包含有关调用者和接收者的信息,设备将此信息转换为将其隐藏在外部网络中。SIP 正文包含会话描述协议 (SDP) 信息,其中包括用于传输媒体的 IP 地址和端口号。

SIP ALG 遵守以下 RFC:

  • RFC 3261
  • RFC 3581
  • RFC 4566
  • RFC 4475

注意

Citrix ADC 独立设备、Citrix ADC 高可用性设置以及 Citrix ADC 群集设置均支持 SIP ALG。

SIP ALG 的工作原理

IP 地址转换的执行方式取决于消息的类型和方向。消息可以是以下任何一种:

  • 入库请求
  • 出站回复
  • 出站请求
  • 入站回复

对于传出消息,SIP 客户端的私有 IP 地址和端口号将替换为 Citrix ADC 拥有的公有 IP 地址和端口号(称为 LSN 池 IP 地址和端口号),该地址和端口号在 LSN 配置期间指定。对于传入邮件,LSN 池 IP 地址和端口号将替换为客户端的专用地址。如果消息包含任何公有 IP 地址,Citrix ADC SIP ALG 将保留这些地址。此外,一个针孔被创建在:

  • 代表专用客户端的 LSN 池 IP 地址和端口,以便从公用网络到达此 IP 地址和端口的邮件被视为 SIP 消息。
  • 代表公有客户端的公有 IP 地址和端口,以便从专用网络到达此 IP 地址和端口的邮件被视为 SIP 消息。

通过网络发送 SIP 消息时,SIP 应用程序层网关 (ALG) 从邮件中收集信息,并将以下标头中的 IP 地址转换为 LSN 池 IP 地址:

  • 通过
  • 联系人
  • 路由
  • 记录路由

在以下示例 SIP 请求消息中,LSN 替换标头字段中的 IP 地址,以将它们隐藏在外部网络中。

INVITE adam@10.102.185.156 SIP/2.0 Via: SIP/2.0/UDP 192.170.1.161:62914 From: eve@10.120.210.3 To: adam@10.102.185.156 Call-ID: a12abcde@10.120.210.3 Contact: adam@10.102.185.156 Route: <sip:netscreen@10.150.20.3:5060> Record-Route: <sip:netscreen@10.150.20.3:5060>

当包含 SDP 信息的邮件到达时,SIP ALG 会从邮件中收集信息,并将以下字段中的 IP 地址转换为 LSN 池 IP 地址和端口号:

  • c=(连接信息)

    此字段可显示在会话或媒体级别。它以以以下格式显示:

    c=<network-type><address-type><connection-address>

    如果目标 IP 地址是单播 IP 地址,则 SIP ALG 会使用 m= 字段中指定的 IP 地址和端口号创建针孔。

  • m= (媒体公告)

    此字段显示在媒体级别,包含媒体描述。它以以以下格式显示:

    毫米 =<media><port><transport><fmt list>

  • a =(information about the media field)

    此字段可以显示在会话或媒体级别,格式如下:

    a =<attribute>

    a =<attribute>:<value>

以下摘自示例 SDP 部分显示了为资源分配翻译的字段。

o=user 2344234 55234434 IN IP4 10.150.20.3

c=IN IP4 10.150.20.3

m=audio 43249 RTP/AVP 0

下表显示了如何转换 SIP 负载。

     
入站请求(从公共到私有) 收件人:
  发件人:
  Call-ID:
  通过:
  请求 URI: 将 LSN 池 IP 地址替换为私有 IP 地址
  联系人:
  记录路由
  路线:
出站响应(从私人到公共) 收件人:
  发件人:
  Call-ID:
  通过:
  请求 URI: 将私有 IP 地址替换为 LSN 池 IP 地址
  联系人: 将私有 IP 地址替换为 LSN 池 IP 地址
  记录路由
  路线:
出站请求(从私人到公共) 收件人:
  发件人:
  Call-ID:
  通过: 将私有 IP 地址替换为 LSN 池 IP 地址
  请求 URI:
  联系人: 将私有 IP 地址替换为 LSN 池 IP 地址
  记录路由
  路线:
入站响应(从公开到私有) 收件人:
  发件人:
  Call-ID:
  通过: 将 LSN 池 IP 地址替换为私有 IP 地址
  请求 URI:
  联系人: 保留公有 IP 地址(如果存在)
  记录路由
  路线:

SIP ALG 的局限性

SIP ALG 有以下限制:

  • 仅支持 SDP 负载。
  • 以下对象不受支持:
    • 多播 IP 地址
    • 加密的 SDP
    • SIP TL
    • FQDN 翻译
    • SIP 层身份验证
    • TD/划分
    • 多部位体
    • IPv6 网络上的 SIP 消息
    • 折線

经过测试的 SIP 客户端和代理服务器

以下 SIP 客户端和代理服务器已使用 SIP ALG 进行测试:

  • SIP 客户端: X-精简版,佐伊柏,艾加。阿瓦亚
  • 代理服务器: 开放式服务器

LSN SIP 方案:专用网络外的 SIP 代理(公用网络)

SIP 客户端注册

对于典型的 SIP 调用,SIP 客户端必须向 SIP 注册商注册,方法是撰写注册请求并将其发送给 SIP 注册商。Citrix ADC 设备的 SIP ALG 拦截请求,将请求中的 IP 地址和端口号替换为 LSN 配置中提供的 LSN 池 IP 地址和端口号,并将请求转发给 SIP 注册商。然后,SIP ALG 在 Citrix ADC 配置中打开一个针孔,以允许 SIP 客户端和 SIP 注册商之间进行进一步的 SIP 通信。SIP 注册商通过 LSN 池 IP 地址和端口号向 SIP 客户端发送 200 OK 响应。Citrix ADC 设备在针孔中捕获此响应,并且 SIP ALG 替换 SIP 标头,将原始联系人、通过、路由和记录路由 SIP 字段放回消息中。SIP ALG 然后将消息转发到 SIP 客户端。下图显示了 SIP ALG 如何在 SIP 呼叫注册流中使用 LSN。本地化后的图片

拨出呼叫

SIP 调用是通过从内部网络发送到外部网络的 SIP 邀请消息启动的。SIP ALG 对通过、联系人、路由和记录路由 SIP 头字段中的 IP 地址和端口号执行 NAT,并将其替换为 LSN 池 IP 地址和端口号。LSN 为 SIP 调用中的后续 SIP 消息存储这些映射。SIP ALG 随后在 Citrix ADC 配置中打开单独的针孔,以允许 SIP 和媒体通过 Citrix ADC 设备在 SDP 和 SIP 标头中指定的动态分配端口上。当 200 OK 消息到达 Citrix ADC 时,它会被创建的针孔之一捕获。SIP ALG 替换 SIP 标头,还原原始联系人、通过、路由和记录路由 SIP 字段,然后将消息转发到内部 SIP 客户端。本地化后的图片

来电

SIP 传入呼叫使用从外部客户端到内部网络的 SIP 邀请消息启动。SIP 注册商使用内部 SIP 客户端向 SIP 注册商注册时创建的针孔,将 INDEST 消息转发到内部网络中的 SIP 客户端。

SIP ALG 对通过、联系人、路由和记录路由 SIP 头字段中的 LSN IP 地址和端口号执行 NAT,将其转换为内部 SIP 客户端的 IP 地址和端口号,并将请求转发到 SIP 客户端。当内部 SIP 客户端发送的 200 OK 响应消息到达 Citrix ADC 设备时,SIP ALG 将对“通过”、“联系人”、“路由”和“记录路由 SIP 头”字段中的 IP 地址和端口号执行 NAT,将其转换为 LSN 池 IP 地址和端口号,并转发响应消息发送给 SIP 注册商,然后在出站方向打开一个针孔,以便进一步的 SIP 通信。本地化后的图片

呼叫终止

BAGA 消息终止呼叫。当设备收到 BE 消息时,它会像对任何其他消息一样翻译邮件中的标题字段。但是,由于接收器必须确认 200 OK 的 BEEA 消息,因此 ALG 将呼叫拆卸延迟 15 秒,以留出传输 200 OK 的时间。

同一网络中的客户端之间的呼叫

当同一网络中的客户端 A 和客户端 B 发起呼叫时,SIP 消息将通过外部网络中的 SIP 代理路由。SIP ALG 将来自客户端 A 的邀请作为普通传出呼叫处理。由于客户端 B 位于同一网络中,因此 SIP 代理将 INIVITE 发送回 Citrix ADC 设备。SIP ALG 检查 INIVITE 消息,确定其包含客户端 A 的 NAT IP 地址,并在将消息发送到客户端 B 之前将该地址替换为客户端 A 的专用 IP 地址。一旦在客户之间建立调用,客户端之间的媒体传输将不涉及 Citrix ADC。

更多 LSN SIP 场景:专用网络内部的 SIP 代理

如果要在专用网络中托管 SIP 代理服务器,Citrix 建议您执行以下操作之一:

  • 为专用 SIP 代理配置静态 LSN 映射。有关详细信息,请参阅配置静态 LSN 映射。确保 NAT 端口与 SIP ALG 配置文件中配置的端口相同。
  • 在非军事区域 (DMZ) 内配置 SIP 代理服务器。

图 1. SIP 呼叫注册

本地化后的图片

图 2. SIP 来电流程

本地化后的图片

图 1 和图 2 显示了以下情况:

  • 方案 1 — 专用网络中的 SIP 客户端向同一网络中的 SIP 代理服务器注册。不执行 ALG 操作,因为 SIP 客户端和 SIP 代理服务器位于同一网络中。
  • 方案 2 — 公用网络中的 SIP 客户端向专用网络中的 SIP 代理服务器注册。通过使用在设备上配置的静态 LSN 映射将来自公用 SIP 客户端的注册消息发送到 Citrix ADC 设备,并且设备会创建针孔以便进一步的 SIP 操作。
  • 方案 3— SIP 来电流程。从外部到内部网络的 SIP 邀请消息发起 SIP 传入呼叫。Citrix ADC 设备通过在 Citrix ADC 设备上配置的静态 LSN 映射接收来自位于外部网络中的 SIP 客户端 C2 的邀请消息。
    设备将创建针孔并将 INTERP 消息转发给 SIP 代理。然后,SIP 代理将邀请消息转发到内部网络中的 SIP 客户端 C1。然后,SIP 客户端 C1 向 SIP 代理发送 180 条和 200 条正常消息,而 SIP 代理则通过 Citrix ADC 设备将消息转发给 SIP 客户端 C2。 当内部 SIP 客户端 C1 发送的 200 OK 响应消息到达 Citrix ADC 时,SIP ALG 对“通过”、“联系人”、“路由”和“记录路由 SIP 头”字段中的 IP 地址和端口号执行 NAT,并将其替换为 LSN 池 IP 地址和端口号。然后,SIP ALG 将响应消息转发给 SIP 客户端 C2,并在出站方向打开一个针孔,以便进一步进行 SIP 通信。

支持审核日志

通过在 LSN 审核日志记录配置中启用 ALG,可以将 ALG 信息记录为 LSN 日志记录的一部分。有关 LSN 日志记录的详细信息,请参阅日志记录和监视 LSN。LSN 日志中 ALG 条目的日志消息包含以下信息:

  • 时间戳
  • SIP 消息的类型(例如,SIP 请求)
  • SIP 客户端的源 IP 地址和端口
  • SIP 代理的目标 IP 地址和端口
  • NAT IP 地址和端口
  • SIP 方法
  • 序列号
  • SIP 客户端是否已注册
  • 呼叫者的用户名和域
  • 接收人的用户名和域

审核日志示例:

请求:

07/19/2013:09:49:19 GMT Informational 0-PPE-0 : default ALG ALG_SIP_INFO_PACKET_EVENT 169 0 : Infomsg: "SIP request" - Group: g2 - Call_ID: NTY0YjYwMTJmYjNhNDU5ZjlhMmQxOTM5ZTE3Zjc3NjM. - Transport: TCP - Source_IP: 192.169.1.165 - Source_port: 57952 - Destination_IP: 10.102.185.156 - Destination_port: 5060 - Natted_IP: 10.102.185.191 - Natted_port: 10313 - Method: REGISTER - Sequence_Number: 3060 - Register: YES - Content_Type: - Caller_user_name: 156_pvt_1 - Callee_user_name: 156_pvt_1 - Caller_domain_name: - Callee_domain_name: -

响应:

07/19/2013:09:49:19 GMT Informational 0-PPE-0 : default ALG ALG_SIP_INFO_PACKET_EVENT 170 0 : Infomsg: "SIP response" - Group: g2 - Call_ID: NTY0YjYwMTJmYjNhNDU5ZjlhMmQxOTM5ZTE3Zjc3NjM. - Transport: TCP - Response_code 200 - Source_IP: 10.102.185.156 - Source_port: 5060 - Destination_IP: 192.169.1.165 - Destination_port: 57952 - Natted_IP: 10.102.185.191 - Natted_port: 10313 - Sequence_Number: 3060 - Content_Type: - Caller_user_name: 156_pvt_1 - Callee_user_name: 156_pvt_1 - Caller_domain_name: - Callee_domain_name: -

配置 SIP ALG

您需要将 SIP ALG 配置作为 LSN 配置的一部分。有关配置 LSN 的说明,请参阅 LSN 的配置步骤。配置 LSN 时,请确保:

  • 在添加 LSN 应用程序配置文件时设置以下参数:
    • IP 池 = 已配对
    • 地址和端口映射 = 与端点无关
    • 过滤 = 与端点无关

重要提示:为了使 SIP ALG 工作,必须使用完整锥形 NAT 配置。

示例:

add lsn appsprofile app_tcp TCP -ippooling PAIRED -mapping ENDPOINT-INDEPENDENT -filtering ENDPOINT-INDEPENDENT
  • 创建 SIP ALG 配置文件,并确保定义源端口范围或目标端口范围。

示例:

add lsn sipalgprofile sipalgprofile_tcp -sipsrcportrange 1-65535 -sipdstportrange 5060 -openViaPinhole ENABLED -openRecordRoutePinhole ENABLED –sipTransportProtocol TCP
  • 在创建 LSN 组时,将 SIP ALG 设置为已启用。

示例:

add lsn group g1 -clientname c1 -sipalg ENABLED
  • 将 SIP ALG 配置文件绑定到 LSN 组。

SIP ALG 配置示例:

以下示例配置显示了如何使用单个用户网络、单个 LSN NAT IP 地址、SIP ALG 特定设置创建简单的 LSN 配置,以及如何配置 SIP ALG:

add lsn pool p1

Done

bind lsn pool p1 10.102.185.190

Done

add lsn client c1

Done

bind lsn client c1 -network 192.170.1.0 -netmask 255.255.255.0

Done

add lsn appsprofile app_tcp TCP -ippooling PAIRED -mapping ENDPOINT-INDEPENDENT -filtering ENDPOINT-INDEPENDENT

Done

add lsn appsprofile app_udp UDP -ippooling PAIRED -mapping ENDPOINT-INDEPENDENT -filtering ENDPOINT-INDEPENDENT

Done

bind lsn appsprofile app_tcp 1-65535

Done

bind lsn appsprofile app_udp 1-65535

Done

add lsn sipalgprofile sipalgprofile_tcp -sipdstportrange 5060 -openViaPinhole ENABLED -openRecordRoutePinhole ENABLED –sipTransportProtocol TCP

Done

add lsn sipalgprofile sipalgprofile_udp -sipdstportrange 5060 -openViaPinhole ENABLED -openRecordRoutePinhole ENABLED -sipTransportProtocol UDP

Done

add lsn group g1 -clientname c1 -sipalg ENABLED

Done

bind lsn group g1 -poolname p1

Done

bind lsn group g1 -appsprofilename app_tcp

Done

bind lsn group g1 -appsprofilename app_udp

Done

bind lsn group g1 -sipalgprofilename sipalgprofile_tcp

Done

bind lsn group g1 -sipalgprofilename sipalgprofile_udp

Done