1

私と私の友人は、夏の計画として小さなプロジェクトに着手しており、プロジェクトの一部として Python を使用して FTP を採用しようとしていました。同じネットワーク経由でファイルを正常に転送できますが、インターネット (別のネットワーク) で接続したときにファイルを転送する方法についての手がかりがありません。参考までにコードを追加しました。私は FTP と python の両方に慣れていません。

サーバー側プログラム:

 #server.py

 from pyftpdlib.ftpserver import DummyAuthorizer
 from pyftpdlib.ftpserver import FTPHandler
 from pyftpdlib.ftpserver import FTPServer

 authorizer = DummyAuthorizer()
 authorizer.add_user("user", "12345", "/", perm="elradfmw")
 authorizer.add_anonymous("/")
 handler = FTPHandler
 handler.authorizer = authorizer
 server = FTPServer(("xxx.xxx.x.x", 2121), handler)
 server.serve_forever()

そしてクライアントプログラム:

 #client.py
 import ftplib

 fileTransfer = ftplib.FTP()
 fileTransfer.connect("xxx.xxx.x.x",2121)
 fileTransfer.login('user','12345')
 fileTransfer.retrlines('LIST')
 fileTransfer.cwd('/home/royal/MyPrograms/Python')
 fileTransfer.retrbinary('RETR  Florida.mp3',open('club.mp3','wb').write)

私はNATの背後で働いています。

4

2 に答える 2

4

ファイアウォールの問題が発生している可能性があります。パッシブ モードの FTPを使用すると役立つはずです。そのリンクには適切な説明がありますが、短いバージョンでは、FTP はデフォルトで、クライアントがサーバーへの接続を作成して要求を作成し、サーバーがクライアントへの新しい接続を作成して応答する「アクティブ」モードを使用します。 . ほとんどのファイアウォールは、「自発的な」インバウンド接続をブロックするように構成されており、クライアントからのアウトバウンド接続の内容を調べて「ああ、FTP 要求である」と判断するようにファイアウォールが特に構成されていない限り、そのサーバーからの着信接続を期待する必要があります。すぐに"、接続をブロックします。

一方、パッシブ モードでは、クライアントは 2 つのアウトバウンド接続を作成します。1 つはリクエスト用で、もう 1 つは (ランダムに選択された別のポートで) サーバーがレスポンスの送信に使用します。市販のルーター + ファイアウォール ソリューションは、既定の構成では、すべてのアウトバウンド接続を通過させるため、クライアント側のファイアウォールが接続を通過させます。ただし、サーバー側でファイアウォールを構成するのは難しくなります。パッシブ データ ポートの範囲を絞り込まない限り、データの受信接続は任意のポートにある可能性があるからです。

したがって、あなたがすべきことは次のとおりです。

  • パッシブモードを使用してください。
  • パッシブ データ転送用に特定の範囲のポート (たとえば、34500 から 34510 など、ランダムに番号を選択するため、非常に大きな範囲である必要はありません) を受け入れるようにサーバーを構成します。
  • サーバー側でファイアウォールを構成して、そのポート範囲と「通常の」FTP ポート (この場合は 2121) での着信接続を許可します。

発生している問題がファイアウォールの問題である場合は、それでうまくいくはずです。それでもうまくいかない場合; あなたは別の問題を抱えているかもしれないので、先に進んで新しい質問をしてください! (または、明らかにファイアウォールの問題に関連している場合は、これを更新してください)。

于 2013-06-29T17:17:51.993 に答える