socks.set_default_proxy() は将来の PySocks の socksocket オブジェクト向けに既定値を保存します。Python のネイティブな socket クラスを置き換えるものではありません。したがって、呼び出しが FTP 接続より前に行われたという理由だけで ftplib の経路を変えるわけではありません。

プロキシ URL を保持する変数ではなく、コンストラクタを追跡してください。ftplib は制御接続と追加の転送接続を作成します。パッシブ FTP では、ログインの成功は制御接続が機能したことだけを示します。一覧取得やファイル転送に使うデータ用ソケットにも、意図した経路が必要です。

socket.socket を置き換えたりモジュールをラップしたりする手法は、PySocks の既定値を設定する以上の別の動作を行います。そのモジュールを共有する他のライブラリに影響し得ます。後から元に一時的に戻しても、同時接続がその変更から切り離されるわけではありません。

独自の ftplib サブクラスは接続経路を網羅できますが、コピーした内部実装は由来する Python リリースの前提を引き継ぎます。タイムアウトのセンチネルやプロトコル処理も含まれます。標準ライブラリの更新はそのコピーを更新しません。

必要なプロキシと FTP モードには、保守されているクライアントかサポートされた統合を選んでください。PycURL によるパッシブ FTP ダウンロードの例は別のクライアント経路を示しています。アプリケーションが所有するカスタマイズでは、どのコンストラクタが各制御用・データ用ソケットを開くかを特定し、置き換える上流の挙動を保ってください。正しいプロキシ値は、それらのコンストラクタが実際に消費するときにだけ役立ちます。

関連記事