通过 SOCKS 使用 Ruby Net::FTP:登录成功,下载却挂起
沿同一条预期代理路径追踪 Ruby FTP 的控制连接与数据连接。
FTP 登录使用控制连接。之后,目录列表或下载需要一条数据连接,即使通过 SOCKS 的登录已经成功,这条连接仍可能失败。
先判断是被动模式还是主动模式。在被动模式下,客户端会向 FTP 服务器给出的地址和端口发起新连接。那条连接同样需要走预期的代理路径。
Ruby 的 socket 集成
Ruby 的 Net::FTP API 记录了它的连接与被动模式行为。SOCKS 集成必须覆盖控制路径和数据路径共同使用的 socket 创建;在其他地方设置的 HTTP 客户端代理并不会配置它们。
如果集成会全局改变 socket 行为,请检查它在并发线程上的作用范围。围绕单次传输的代码块无法让其他线程免受共享状态变化的影响。
服务商可能提供静态端点,但那是服务特性,而不是 SOCKS 的通用要求。当不同连接可能使用不同出口时,请检查 FTP 服务器如何把它的数据连接与已认证的控制连接关联起来。
记录走到哪一步、模式以及数据端点,并去掉凭据。这样可以区分被阻断的数据路径与代理登录失败。