Linux FTP クライアントとの手動 FTP 接続に使用するポートの設定

Linux FTP クライアントとの手動 FTP 接続に使用するポートの設定

6100-6200の範囲の着信接続のみを許可するファイアウォールの背後にあるFTPサーバーに接続しようとしています。次のようにサーバーに正常に接続しましたcurl

curl --ftp-port :6100-6200 --list-only ftp.server

しかし、私はより使い慣れたPythonを通して他のクライアントを使ってこのカールコマンドの動作を再現したいと思います。原則として、Linuxですが、ftp誰かが良いオプションを提案すると、他のオプションも開いています。私はftplibを試しましたが、そうですライブラリはポートの選択を許可しません。;試しました。失敗する

現在は動作しませんftp

230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (XXX,XXX,XXX,XXX,202,251).
ftp: connect: Connection refused

同じコマンドセットが私のラップトップで実行されるので、明らかに問題はファイアウォールにあります。

ftp6100から6200の範囲のポートでデータ接続ネゴシエーションを強制して動作をシミュレートするにはどうすればよいですかcurl

ベストアンサー1

手動モードでFTPを使用する場合、サーバーは、クライアントに使用する(サーバー側)データポートを通知します。。よく知られているFTPプロトコルは、クライアントが要求に使用するポート範囲をサーバーに表すことを許可しません。これを変更できる拡張があるかもしれませんが、これらの拡張は必ずしも広くサポートされているわけではありません。

あなたの例では、メッセージは

227 Entering Passive Mode (XXX,XXX,XXX,XXX,202,251).

202クライアントに「あなたのIPアドレスXXX.XXX.XXX.XXX、ポート51683からのデータ接続をリッスンしています」(= * 256 + 251)と言うので、FTPサーバーから直接。

各TCP接続には、ローカルポート番号とリモートポート番号の2つのポート番号があります。通常、発信接続は、発信接続のためにオペレーティングシステムによって指定されたポート範囲から最初の利用可能なローカルポートのみを選択し、リモートポートは使用しているサービスによって指定されます。手動FTPの場合、サーバーは設定に従ってリモートポートを選択し、それをFTP 227応答形式でクライアントに通知します。

一般に、ファイアウォールで手動FTPを処理する方法は2つあります。

a)パッシブFTPデータ接続用に特定の範囲のポートを許可/使用するようにファイアウォールとFTPサーバーを一緒に構成する必要があるため、サーバーはファイアウォールが許可しないポートを選択しようとしません。

b)ファイアウォールはFTPコマンドチャネルトラフィックを受信し、各データ接続に使用するポート番号を決定し、コマンドチャネルで宣言されたポート番号を使用してFTPクライアントとサーバー間の手動FTPデータ接続を動的に許可する必要があります。

iptablesLinux/ファイアウォールを使用している場合、netfilterこれはFTPプロトコル固有のconntrack拡張モジュールが実行するアクションです。ファイアウォールシステムを介してすべてのFTP制御接続を受信する以前のポリシーが悪意のある行為者によって悪用される可能性があることがわかったので、受信が許可された制御接続を知らせるだけです。これで、これらの拡張は悪用されなくなりました。自動的に使用されます。詳しくはこのページをご覧ください。またはこの質問はU&L SEにあります。


curl実際にFTPを使ってパッシブモードデフォルトでは、このオプションを使用すると--ftp-port次のように切り替わります。アクティブモード。マニュアルページで(ハイライト):

-P、--ftpポート

(FTP)FTP接続を使用するときは、デフォルトのイニシエータ/受信者の役割を逆に置き換えます。このオプションを使用すると、カールはアクティブモードを使用します。Curlはクライアントが指定したアドレスとポートに再接続するようにサーバーに指示しますが、パッシブモードではサーバーが接続するIPアドレスとポートを設定する必要があります。


Python と についてはftplib参照してください。あなたが言った問題は10年を超えました。 Marcus Müllerさんが新しい回答を追加しました。

Python 3.3以降、ftplib接続を確立する関数はsource_addrこれを正確に実行できるパラメータを使用します。

おすすめ記事