goftp调用List返回229 Entering Extended Passive Mode后挂起
问题原因
挂起故障和防火墙无关,核心原因是vsFTPd 3.0.3默认开启require_ssl_reuse配置,要求FTP的数据传输连接必须复用控制连接的TLS会话。你当前代码的TLS配置未开启会话缓存,无法满足服务端的会话复用要求,导致数据连接请求被服务端静默丢弃,程序卡在EPSV响应后的连接建立阶段。
FileZilla客户端默认支持TLS会话复用,因此可以正常访问同一台服务器。
修复方案
修改TLS配置段,添加客户端会话缓存配置,支持TLS会话复用即可解决问题,修改后的Dial初始化代码如下:
c, err := ftp.Dial( os.Getenv("ftpserver"), ftp.DialWithExplicitTLS( &tls.Config{ InsecureSkipVerify: true, // 新增TLS会话缓存配置,支持会话复用 ClientSessionCache: tls.NewLRUClientSessionCache(0), }, ), ftp.DialWithDebugOutput(os.Stdout), ftp.DialWithTimeout(5*time.Second), )
注意:使用tls.NewLRUClientSessionCache需要提前导入crypto/tls包。
如果添加上述配置后仍存在兼容问题,可以追加禁用扩展被动模式的配置,强制使用传统PASV模式建立数据连接:
ftp.DialWithDisabledEPSV(true)
将该配置项传入ftp.Dial的参数列表即可。
调试日志停在
229 Entering Extended Passive Mode (|||7339|)属于符合逻辑的现象:客户端收到EPSV响应后会解析出服务端开放的7339数据端口,随后发起数据连接,因为会话复用校验失败连接被服务端直接丢弃,客户端会一直等待直到连接超时,因此没有后续日志输出。
内容的提问来源于stack exchange,提问作者samoorai
相关产品推荐
相关产品推荐

