EPSV still opens a separate FTP data connection. It changes the endpoint information, not the number of connections.

A traditional PASV reply supplies an address and port. That address can be unusable outside the server's network. EPSV supplies a port and uses the server address associated with the control connection.

Through a proxy, retain the logical FTP server identity. The intermediary's listening address is not automatically the server that owns the returned data port.

The data connection also needs the intended proxy route and permission to reach its selected port. Accepting a CONNECT to the FTP control port does not permit every subsequent data connection.

Before disabling EPSV, inspect the passive reply and the server address and port requested for the transfer. A successful FTP login establishes the control connection; it leaves the data connection to check. With Python ftplib, trace both socket constructors rather than relying on a PySocks default alone.

Related articles