Python FTP代码Linux运行正常 Windows下触发WinError 10060错误
问题原因
该问题由FTP协议的工作模式和Windows系统默认防火墙规则共同导致:
FTP协议分为两类传输模式,控制链路(默认21端口)仅用于传输指令,文件列表、文件内容等数据需要单独建立数据链路传输:
- 主动模式(PORT模式):客户端开放随机高位端口告知服务器,由服务器通过20端口主动向客户端的该端口发起连接建立数据链路
- 被动模式(PASV模式):服务器开放随机高位端口告知客户端,由客户端主动向服务器的该端口发起连接建立数据链路
Python的ftplib.FTP默认使用主动模式,Windows 10默认的防火墙规则会拦截外部主机主动发起的、针对本地随机高位端口的入站连接,因此控制链路连接、登录都正常,但一旦触发数据传输的指令就会因为数据链路无法建立抛出超时错误。Linux环境通常默认加载了FTP连接跟踪内核模块(nf_conntrack_ftp),或者防火墙规则默认放通了FTP主动模式的入站连接,因此相同代码可以正常运行,调大timeout参数无法解决该问题。
解决方案
通用修复方案
强制FTP客户端使用被动模式即可避开防火墙拦截,只需在登录完成后、执行数据传输类指令前添加一行被动模式的配置即可,修改后的代码如下:
from ftplib import FTP server = FTP('ftp.ibge.gov.br') server.connect() server.login() # 强制启用被动模式,为核心修复代码 server.set_pasv(True) server.nlst()
异常场景排查
如果添加上述配置后仍报错,可按以下顺序排查:
- 临时关闭Windows系统防火墙、第三方安全软件测试是否恢复正常,若恢复则给Python程序添加入站、出站连接的放行规则即可
- 若连接的是私网部署的FTP服务器,需确认服务器是否正确配置了被动模式的公网IP、端口段,避免服务器返回内网IP导致跨网段连接失败
内容的提问来源于stack exchange,提问作者RGosorio
相关产品推荐
相关产品推荐

