防火墙设置了NAT ALG功能导致FTP数据连接故障 2021-01-17 网络 暂无评论 3466 次阅读 问题描述 1.涉及产品和版本 本案例描述的故障属于应用类故障,涉及全系列防火墙,不区分版本。 2.组网情况(Networking) 本端内网部署了一台FTP服务器,对外提供访问(通过防火墙做ftp 21端口映射)。 ![ftp-nat-alg-01.png](https://blog.moper.net/usr/uploads/2021/01/3160416428.png) 3.故障现象 网用户通过FTP客户端被动模式能够与服务器建立连接,但无法打开数据通道。 ![ftp-nat-alg-02.png](https://blog.moper.net/usr/uploads/2021/01/109453268.png) 处理过程 1. 在用户内网用自己电脑Ftp Client连接Ftp Server。能够正常访问FTP资源,排除ftp服务器故障。 2. 在用户外网用自己电脑Ftp Client连接Ftp Server。故障复现,无法访问FTP资源列表,排除FTP客户端故障。 3. 怀疑跟FTP穿越NAT特性有关,查看防火墙相关配置。 发现存在detect ftp功能配置, ![ftp-nat-alg-03.png](https://blog.moper.net/usr/uploads/2021/01/3573216587.png) 配置该命令后防火墙同时开启了NAT ALG功能和ASPF功能,防火墙会针对FTP数据通道进行NAT映射,并且动态打开相应安全策略。理论上来讲防火墙已经开启了针对FTP穿越NAT的支持,不应该是NAT导致不通。 4. 查看防火墙ftp相关数据流会话表。 ![ftp-nat-alg-04.png](https://blog.moper.net/usr/uploads/2021/01/2343554115.png) 当客户端以被动模式访问服务端时,查看防火墙会话表发现去往服务器ip的只有管理通道的会话,没有数据通道的会话。正常情况下应该同时存在管理通道和数据通道两条会话表。被动模式下数据通道由远端用户主动发起,虽然防火墙安全策略禁止外网主动访问内网,也没有提供FTP数据端口的外网映射,但由于配置了detect ftp,防火墙ASPF功能会建立对应server-map表用来打开相关策略。 5. 查看防火墙server-map表。 ![ftp-nat-alg-05.png](https://blog.moper.net/usr/uploads/2021/01/2167959693.png) 虽然防火墙ASPF功能为FTP数据通道建立了server-map表,但表项不正确,内网转换ip应该是私网ip(服务器的真实ip),但是却变成了公网ip。 当外网数据流到达防火墙时,依据server-map转发时由于内网ip仍然是公网ip,导致数据流无法到达服务器,因此远端用户无法和服务器建立数据通道。 6. 抓包分析。 ![ftp-nat-alg-06.png](https://blog.moper.net/usr/uploads/2021/01/707757406.png) 抓取FTP服务器与防火墙之间的数据流,发现服务器在响应PASV指令时用的是公网ip,正常情况下应该回应真实私网ip。 7. 跟客户协商。 跟客户沟通得知,客户在部署FTP服务器时设置了NAT穿越功能,指定了pasv回应的ip地址(公网ip)。 ![ftp-nat-alg-07.png](https://blog.moper.net/usr/uploads/2021/01/2619519901.png) 让客户取消该设置后server-map正常,服务器回应的pasv ip为真实私网ip,FTP资源能够正常访问。 ![ftp-nat-alg-08.png](https://blog.moper.net/usr/uploads/2021/01/3211821292.png) ![ftp-nat-alg-09.jpg](https://blog.moper.net/usr/uploads/2021/01/416203896.jpg) 根因 本案例中故障主要是因为FTP需要NAT后进行通信,但是防火墙的FTP ALG功能和服务器自身的NAT穿越功能不能同时使用。 FTP启用NAT穿越功能后,会修改pasv响应报文中的ip,报文经过防火墙进行NAT ALG转换时生成了错误的转换表项。 ![ftp-nat-alg-10.png](https://blog.moper.net/usr/uploads/2021/01/3230671747.png) 尽管客户端仍然能根据pasv响应报文中的公网ip发起连接,但由于防火墙上错误的NAT转换表,导致客户端发起的连接到达防火墙后不能到达使用私网ip的真实FTP服务器。 解决方案 1.部署FTP服务器的时候不要设置nat穿越功能(指定pasv ip),由防火墙的NAT ALG功能来对报文的载荷字段进行解析,识别并转换其中包含的重要信息,保证FTP的数据通道可以顺利的进行地址转换而不影响其正常使用。 2.FTP客户端改为主动模式。主动模式下是由FTP服务器主动发起连接,不涉及到防火墙的NAT ALG,但需要打开服务器主动访问外网的策略。 此方案不推荐,原因有: ①打开服务器主动访问外网权限后会带来安全风险, ②FTP Client很少直接部署在公网,一般都在内网,此时同样涉及到NAT ALG功能,如果家庭路由器不支持ALG,私网主机发送的PORT报文(载荷内包含客户主机真实私网ip)到达服务器端后,服务器无法根据私网地址进行寻址,也就无法建立正确的数据连接。 ③FTP Client目前默认都是被动模式,如果要求全部改成主动模式,动作较大,难以实施。 3.FTP服务器配置NAT穿越功能(指定pasv ip为公网ip),同时防火墙关闭FTP的NAT ALG功能(undo detect ftp)。FTP服务器部署在内网,关闭NAT ALG后防火墙不能再为FTP动态数据通道建立会话,因此防火墙上还需要手动添加内网FTP数据通道端口的映射。 FTP服务器被动模式下动态打开的数据端口是随机的,防火墙上添加映射时需要做1:1的全映射:nat server global 公网IP inside 192.168.10.50,但当公网ip不够或者安全要求较严(只允许内网开放特定端口)的场景下,此时需要在FTP服务器上固定某几个动态端口(需要FTP软件支持,目前主流软件都支持该功能), ![ftp-nat-alg-11.jpg](https://blog.moper.net/usr/uploads/2021/01/687266913.jpg) 防火墙只需针对特定端口做服务器映射: nat server protocol tcp global 公网IP 9999 inside 192.168.10.50 9999。 建议与总结 FTP协议是一个典型的多通道协议,在其工作过程中,FTP Client和FTP Server之间将会建立两条连接(也称为通道):控制连接和数据连接。控制连接用来传输FTP指令和参数,数据连接用来传输数据。 FTP协议包括两种工作模式:主动模式和被动模式。 ①主动模式中,FTP Server主动向FTP Client发起数据连接; ②被动模式中,FTP Server被动接收FTP Client发起的数据连接。 无论是主动模式还是被动模式,在控制连接交互报文的载荷中,都包含用于建立数据连接的IP地址和端口号信息。 如果在FTP Client和FTP Server之间部署了NAT设备,这就要求NAT设备必须能够识别出控制连接中包含的IP地址和端口号并进行处理,否则数据连接无法成功建立,FTP协议不能正常工作。 普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323、SIP等)、FTP、SQLNET等,TCP/UDP载荷中带有地址或者端口信息,这些内容不能被NAT进行有效的转换,就可能导致问题。 华为防火墙和路由器都能够提供NAT ALG(Application Level Gateway)功能,可以对报文的载荷字段进行解析,识别并转换其中包含的重要信息,保证类似FTP的多通道协议可以顺利的进行地址转换而不影响其正常使用。 除FTP协议外,华为设备还支持对DNS、H.323、ICQ、ILS、MGCP、MMS、MSN、NETBIOS、PPTP、QQ、RTSP、SIP和SQLNET协议提供NAT ALG功能。某些协议也会出现类似此案例问题。 本案例中故障主要是因为FTP需要NAT后进行通信,但是防火墙的FTP ALG功能和服务器自身的NAT穿越功能不能同时使用。 FTP启用NAT穿越功能后,会修改pasv响应报文中的ip,报文经过防火墙进行NAT ALG转换时生成了错误的转换表项。尽管客户端仍然能根据pasv响应报文中的公网ip发起连接,但由于防火墙上错误的NAT转换表,导致客户端发起的连接到达防火墙后不能到达使用私网ip的真实FTP服务器。 遇到故障的时候一定要对相关协议有一定程度地了解,要知晓其工作流程以及华为设备针对该协议的特性原理,不能盲目排查故障,要对症下药。 转自https://support.huawei.com/enterprise/zh/knowledge/EKB1100044680 标签: ftp, nat 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。