FTP主被动模式问题
FTP主动及被动模式问题
很久以前处理过一个案例:中信银行前置机与平安对接,通过ftp的方式,送文件过来时,报错:
用户反馈:
连接上,switch 到binary mode,就报错,连接被剔除。
请检查10.35.156.53、10.35.156.54、55、56上的ftp是否有问题
NAT:172.16.19.24 F5vip: 172.29.34.16
421 Service not available, remote server has closed connection.
根据用户提供的信息,先到主机上去看看。
测试ftp功能是否正常:
[chkusr@CNSZ041729 ~]$ ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220-If you are not authorized to access this private computer system, disconnect now. All activities on this system will be monitored and recorded without prior notification or permission.
220
Name (127.0.0.1:chkusr): ftpzhongxinybt
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bin
200 Switching to Binary mode.
ftp> ls
227 Entering Passive Mode (127,0,0,1,99,53)
150 Here comes the directory listing.
-rw-r--r-- 1 9999 9999 0 Feb 05 13:02 CITIC047FSS20160205REQ.TXT
226 Directory send OK.
ftp> get CITIC047FSS20160205REQ.TXT
local: CITIC047FSS20160205REQ.TXT remote: CITIC047FSS20160205REQ.TXT
227 Entering Passive Mode (127,0,0,1,30,65)
150 Opening BINARY mode data connection for CITIC047FSS20160205REQ.TXT (0 bytes).
226 File send OK.
ftp>
挺好的,没问题。问题应该在网络层面。
问问中信:
- 过来的公网IP
- ftp访问方式,主动or被动
- 可否手工测试
回答说 “中信无法人工模拟登录ftp,上传或下载。只能通过脚本,连接时,可以看到如case中提及的情况。”
感觉跟防火墙策略有关,中信过来的IP是:166.100.12.36
查询访问该ip及端口的所有策略信息:
access-list outside_access_in extended permit tcp host 166.100.12.36 host 172.16.19.24 eq ftp log
access-list 362 extended permit ip host 172.29.34.16 host 166.100.12.36
有策略。运营没有反馈全,再问中信采用主动模式or被动模式进行ftp访问?
运营问业务,业务问中信,又过去N个小时。上图:

原来是被动访问,这就对了,估计是防火墙没开ALG,呵呵就快要找到真相了o(∩_∩)o…哈哈
应用层网关(英语:Application Layer Gateway,或application-level gateway,缩写为ALG) 是一种NAT穿透技术。就应用层面来说,它允许修改网关上的NAT traversal的过滤规则,完成某个应用程序在特定协议上的地址和端口的转换。举例来说,像 FTP、BitTorrent、SIP、RTSP或IM等即时通软件上的文件传递功能,这些都可以使用ALG来针对应用程序在地址及通信端口转换上的需求.
BUT,现实是残酷的,没那么容易搞定。
这个墙的ftp alg是开了的:
policy-map global_policy
class inspection_default
inspect ftp
inspect sip
inspect h323 h225
inspect h323 ras
policy-map zbxftprate-limit
class zbxftprate-limit
police input 1024000
policy-map rate-limit
class rate-limit
police input 512000
policy-map inspect_ftp_10021
class ftp_port_10021
inspect ftp
class rate-limit
police input 512000
class zbxftprate-limit
police input 1024000
!
service-policy global_policy global
那怎么连接后改变传输模式会提示421然后断开呢?
分析一下访问流程:

F5,对咯,防火墙开alg,F5也要开。
该VS仅配置了21端口的转发,少了ftp profile。
加上就一切OK了。客户好评:完美解决! 🙂
我们回过头来看看ftp的访问模式,什么叫主动什么叫被动呢?
简言之:
- 主动:客户端连接服务端后(port 21),随机开放一个端口告知服务端访问
- 被动:客户端连接服务端后(port 21),随机开放一个端口告知客户端访问
道理差不多,但不够严谨。参考网络资源描述严谨些。
PORT(主动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:

PASV(被动模式)
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:

最佳实践
ftp明文传输,不安全而且涉及主被动模式问题防火墙开通麻烦,我们可以使用更加安全可靠的sftp(secure file transfer program)来替代,sftp仅需一个22端口。
简便、快捷、安全。后面我会介绍高可用的sftp集群架构及实现。