PySocks の既定値は ftplib を配線し直さない
set_default_proxy が Python のネイティブな socket 実装を変えると決めつけず、ftplib が実際に生成するソケットを追跡してください。
socks.set_default_proxy() は将来の PySocks の socksocket オブジェクト向けに既定値を保存します。Python のネイティブな socket クラスを置き換えるものではありません。したがって、呼び出しが FTP 接続より前に行われたという理由だけで ftplib の経路を変えるわけではありません。
プロキシ URL を保持する変数ではなく、コンストラクタを追跡してください。ftplib は制御接続と追加の転送接続を作成します。パッシブ FTP では、ログインの成功は制御接続が機能したことだけを示します。一覧取得やファイル転送に使うデータ用ソケットにも、意図した経路が必要です。
socket.socket を置き換えたりモジュールをラップしたりする手法は、PySocks の既定値を設定する以上の別の動作を行います。そのモジュールを共有する他のライブラリに影響し得ます。後から元に一時的に戻しても、同時接続がその変更から切り離されるわけではありません。
独自の ftplib サブクラスは接続経路を網羅できますが、コピーした内部実装は由来する Python リリースの前提を引き継ぎます。タイムアウトのセンチネルやプロトコル処理も含まれます。標準ライブラリの更新はそのコピーを更新しません。
必要なプロキシと FTP モードには、保守されているクライアントかサポートされた統合を選んでください。PycURL によるパッシブ FTP ダウンロードの例は別のクライアント経路を示しています。アプリケーションが所有するカスタマイズでは、どのコンストラクタが各制御用・データ用ソケットを開くかを特定し、置き換える上流の挙動を保ってください。正しいプロキシ値は、それらのコンストラクタが実際に消費するときにだけ役立ちます。