Apache FTPClient与Sun FtpClient差异咨询:主动模式防火墙适配疑问
FTP客户端防火墙环境下的差异原因解析
这个问题的核心原因其实很简单——两个FTP客户端默认使用的FTP连接模式完全不同,这直接导致了防火墙环境下的不同表现:
1. 两种FTP连接模式的核心区别
FTP协议分为控制连接和数据连接两个部分:控制连接负责登录、发送命令,数据连接负责传输文件列表、文件内容等数据,而主动/被动模式的差异就体现在数据连接的建立方式上:
主动模式(PORT)
sun.net的FtpClient默认用的就是这种模式:
- 首先客户端和FTP服务器的21端口建立控制连接,完成登录;
- 当需要获取文件列表时,客户端会告诉服务器:“我打开了X端口,你从你的20端口连过来传数据”;
- 服务器主动发起从20端口到客户端X端口的连接,完成数据传输。
这种模式下,只要你的Linux服务器防火墙允许向外发起的20端口连接,就能正常建立数据连接,不需要额外开放其他端口,所以不用关闭防火墙也能工作。
被动模式(PASV)
Apache Commons Net的FTPClient默认启用的是这种模式:
- 控制连接同样通过21端口建立;
- 请求数据时,客户端会让服务器打开一个随机的高端口(通常是1024以上),然后客户端主动去连接服务器的这个端口来获取数据;
- 你的Linux服务器防火墙大概率没有开放这些随机高端口,所以客户端尝试连接时会被拦截,就出现了
425 Failed to establish connection的错误;关闭防火墙后端口限制解除,自然就能正常获取列表了。
2. 验证方法(让Apache FTPClient也能在防火墙下工作)
你可以给Apache的FTPClient手动切换到主动模式,这样不用关闭防火墙也能正常获取文件列表:
FTPClient ftpClient = new FTPClient(); ftpClient.connect("host"); ftpClient.login("account", "password"); ftpClient.enterLocalActiveMode(); // 切换为主动模式 ftpClient.listFiles("path"); // 现在应该能正常工作了
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

