Ruby Net::FTP Through SOCKS: Login Works, Downloads Hang
Trace Ruby FTP control and data connections through the same intended proxy route.
FTP login uses a control connection. A directory listing or download then needs a data connection, which can fail even though the login succeeded through SOCKS.
Identify passive or active mode first. In passive mode, the client opens a new connection to the address and port supplied by the FTP server. That connection also needs the intended proxy route.
Ruby socket integration
Ruby's Net::FTP API documents its connection and passive-mode behavior. A SOCKS integration must cover the socket creation used by both control and data paths; an HTTP client's proxy setting elsewhere does not configure them.
If the integration changes socket behavior globally, review its concurrency scope. A block around one transfer cannot isolate other threads from changes to shared state.
A provider may offer a static endpoint, but that is a service feature rather than a general SOCKS requirement. Where separate connections can use different exits, check how the FTP server associates its data connection with the authenticated control connection.
Record the stage reached, mode, and data endpoint, with credentials removed. This distinguishes a blocked data path from a proxy login failure.