SIP 协议的应用程序层网关
将大规模 NAT (LSN) 与会话初始协议 (SIP) 结合使用非常复杂,因为 SIP 消息在 SIP 报头和 SIP 正文中都包含 IP 地址。当 LSN 与 SIP 一起使用时,SIP 报头包含有关呼叫者和接收者的信息,设备会转换这些信息以将其隐藏在外部网络中。SIP 正文包含会话描述协议 (SDP) 信息,其中包括用于传输媒体的 IP 地址和端口号。
SIP ALG 遵守以下 RFC:
- RFC 3261
- RFC 3581
- RFC 4566
- RFC 4475
注意
NetScaler 独立设备、NetScaler 高可用性设置以及 NetScaler 群集设置均支持 SIP ALG。
SIP ALG 的工作原理
IP 地址转换的执行方式取决于消息的类型和方向。一条消息可以是以下任意一条:
- 入站请求
- 出站响应
- 出站请求
- 入站响应
对于传出消息,SIP 客户端的专用 IP 地址和端口号将替换为 NetScaler 拥有的公有 IP 地址和端口号,称为 LSN 池 IP 地址和端口号,在 LSN 配置期间指定。对于传入的消息,LSN 池 IP 地址和端口号将替换为客户端的私有地址。如果消息包含任何公有 IP 地址,则 NetScaler SIP ALG 会保留这些地址。此外,还会在以下位置创建针孔:
- LSN 代表私有客户端汇集 IP 地址和端口,因此从公共网络到达此 IP 地址和端口的消息被视为 SIP 消息。
- 代表公共客户机的公有 IP 地址和端口,因此从专用网络到达此 IP 地址和端口的消息被视为 SIP 消息。
当通过网络发送 SIP 消息时,SIP 应用层网关 (ALG) 从消息中收集信息,并将以下报头中的 IP 地址转换为 LSN 池 IP 地址:
- Via
- 联系我们
- 路由
- Record-Route
在以下 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>
<!--NeedCopy-->
当包含 SDP 信息的消息到达时,SIP ALG 会从该消息中收集信息,并将以下字段中的 IP 地址转换为 LSN 池 IP 地址和端口号:
-
c=(连接信息)
此字段可以出现在会话或媒体级别。它以以下格式出现:
c=
<network-type><address-type><connection-address>
如果目标 IP 地址是单播 IP 地址,则 SIP ALG 会使用 m= 字段中指定的 IP 地址和端口号创建针孔。
-
m=(媒体公告)
此字段出现在媒体级别,包含媒体的描述。它以以下格式出现:
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: | ||
通过: | ||
请求地址: | ||
联系人: | ||
Record-Route | ||
路线: | ||
出站响应(从私人到公开) | 更改为: | 无 |
来自: | ||
Call-ID: | ||
通过: | ||
请求地址: | ||
联系人: | ||
Record-Route | ||
路线: | ||
出站请求(从私有到公开) | 更改为: | 无 |
来自: | ||
Call-ID: | ||
通过: | ||
请求地址: | ||
联系人: | ||
Record-Route | ||
路线: | ||
入站响应(从公开到私人) | 更改为: | 无 |
来自: | ||
Call-ID: | ||
通过: | ||
请求地址: | ||
联系人: | ||
Record-Route | ||
路线: |
SIP ALG 的局限性
SIP ALG 有以下限制:
- 仅支持 SDP 负载。
- 不支持以下各项:
- 多播 IP 地址
- 加密的 SDP
- SIP TLS
- FQDN 翻译
- SIP 层身份验证
- TD/分区
- 由多部分组成的主体
- 通过 IPv6 网络发送的 SIP 消息
- 折线
经过测试的 SIP 客户端和代理服务器
以下 SIP 客户端和代理服务器已使用 SIP ALG 进行了测试:
- SIP 客户端: X-Lite、Zoiper、Ekiga。Avaya
- 代理服务器: openSIPS
LSN SIP 场景:专用网络(公共网络)外部的 SIP 代理
SIP 客户端注册
对于典型的 SIP 呼叫,SIP 客户端必须通过撰写注册请求并将其发送给 SIP 注册器来注册。NetScaler 设备的 SIP ALG 会拦截请求,将请求中的 IP 地址和端口号替换为 LSN 配置中提供的 LSN 池 IP 地址和端口号,然后将请求转发给 SIP 注册器。然后,SIP ALG 在 NetScaler 配置中打开一个针孔,允许 SIP 客户端和 SIP 注册器之间进行进一步的 SIP 通信。SIP 注册商通过 LSN 池 IP 地址和端口号向 SIP 客户端发送 200 OK 响应。NetScaler 设备在针孔中捕获此响应,SIP ALG 取代 SIP 标头,将原来的“联系人”、“Via”、“路由”和“记录路由 SIP”字段放回消息中。然后,SIP ALG 将消息转发到 SIP 客户端。下图显示了 SIP ALG 如何在 SIP 呼叫注册流程中使用 LSN。
拨出电话
SIP 呼叫是通过从内部网络发送到外部网络的 SIP INVITE 消息发起的。SIP ALG 对 Via、Contact、Route 和 Record-Route SIP 标头字段中的 IP 地址和端口号执行 NAT,将其替换为 LSN 池 IP 地址和端口号。LSN 将这些映射存储在 SIP 呼叫中以备后续 SIP 消息使用。然后,SIP ALG 在 NetScaler 配置中打开单独的针孔,允许 SIP 和媒体在 SDP 和 SIP 标头中指定的动态分配端口上通过 NetScaler 设备。当 200 OK 消息到达 NetScaler 时,它会被其中一个创建的针孔捕获。SIP ALG 替换 SIP 报头,恢复原来的“联系人”、“Via”、“路由”和“记录路由 SIP”字段,然后将消息转发到内部 SIP 客户端。
来电
SIP 传入呼叫是通过从外部客户端发送到内部网络的 SIP INVITE 消息发起的。SIP 注册器使用内部 SIP 客户端向 SIP 注册时创建的针孔将 INVITE 消息转发到内部网络中的 SIP 客户端。
SIP ALG 对 Via、Contact、Route 和 Record-Route SIP 标头字段中的 LSN IP 地址和端口号执行 NAT,将其转换为内部 SIP 客户端的 IP 地址和端口号,然后将请求转发给 SIP 客户端。当内部 SIP 客户端发送的 200 OK 响应消息到达 NetScaler 设备时,SIP ALG 对 Via、Contact、Route 和 Record-Route SIP 标头字段中的 IP 地址和端口号执行 NAT,将其转换为 LSN 池 IP 地址和端口号,将响应消息转发给 SIP 注册器,然后在出站方向打开一个针孔以进行进一步的 SIP 通信。
呼叫终止
BYE 消息终止呼叫。当设备收到 BYE 消息时,它会像翻译任何其他消息一样翻译消息中的标头字段。但是,由于 BYE 消息必须由具有 200 OK 的接收器确认,因此 ALG 会将呼叫拆解延迟 15 秒,以便有时间传输 200 OK。
在同一网络中的客户端之间进行呼叫
当同一网络中的客户端 A 和客户端 B 发起呼叫时,SIP 消息将通过外部网络中的 SIP 代理路由。SIP ALG 将来自客户端 A 的邀请作为普通外拨呼叫处理。由于客户端 B 在同一个网络中,SIP 代理将 INIVITE 发回 NetScaler 设备。SIP ALG 检查 INIVITE 消息,确定它包含客户端 A 的 NAT IP 地址,并在向客户端 B 发送消息之前将该地址替换为客户端 A 的专用 IP 地址。一旦在客户端之间建立呼叫,NetScaler 就不参与客户端之间的媒体传输。
更多 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 客户端的注册消息发送到 NetScaler 设备,设备会为进一步的 SIP 操作创建一个针孔。
- 场景 3 — SIP 传入呼叫流。SIP 传入呼叫是使用从外部网络到内部网络的 SIP INVITE 消息发起的。NetScaler 设备通过 NetScaler 设备上配置的静态 LSN 映射接收来自外部网络中的 SIP 客户端 C2 的邀请消息。
设备会创建一个针孔并将 INVITE 消息转发到 SIP 代理。然后,SIP 代理将 INVITE 消息转发到内部网络中的 SIP 客户端 C1。然后,SIP 客户端 C1 向 SIP 代理发送 180 和 200 OK 消息,后者又通过 NetScaler 设备将消息转发给 SIP 客户端 C2。 当内部 SIP 客户端 C1 发送的 200 OK 响应消息到达 NetScaler 时,SIP ALG 会对 Via、Contact、Route 和 Record-Route SIP 标头字段以及 SDP 字段中的 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: -
<!--NeedCopy-->
响应:
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: -
<!--NeedCopy-->
配置 SIP ALG
您需要将 SIP ALG 配置作为 LSN 配置的一部分。有关配置 LSN 的说明,请参阅 LSN 的配置步骤。配置 LSN 时,请确保:
- 添加 LSN 应用程序配置文件时设置以下参数:
- IP 共享 = 已配对
- 地址和端口映射 = 与端点无关
- 过滤 = 与端点无关
重要:要使 SIP ALG 正常工作,必须进行完整的 cone NAT 配置。
示例:
add lsn appsprofile app_tcp TCP -ippooling PAIRED -mapping ENDPOINT-INDEPENDENT -filtering ENDPOINT-INDEPENDENT
<!--NeedCopy-->
- 创建 SIP ALG 配置文件并确保定义源端口范围或目标端口范围。
示例:
add lsn sipalgprofile sipalgprofile_tcp -sipsrcportrange 1-65535 -sipdstportrange 5060 -openViaPinhole ENABLED -openRecordRoutePinhole ENABLED –sipTransportProtocol TCP
<!--NeedCopy-->
- 创建 LSN 组时,设置 SIP ALG = 启用。
示例:
add lsn group g1 -clientname c1 -sipalg ENABLED
<!--NeedCopy-->
- 将 SIP ALG 配置文件绑定到 LSN 组。
SIP ALG 配置示例:
以下示例配置显示了如何使用单用户网络、单个 LSN NAT IP 地址、SIP ALG 特定设置以及配置 SIP ALG 来创建简单的 LSN 配置:
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
<!--NeedCopy-->