web-dev-qa-db-ja.com

PORTコマンドを認識しないサーバーでのLFTPアクティブモード

LFTPを使用してサーバーからファイルを転送していますが、残念ながらPORTコマンドを認識しません。サーバーを制御できず(サーバーが何であるか詳細がわかりません)、アクティブモードを使用する必要があります。

これは次のようなコマンドラインです。

lftp -e 'debug 10;set ftp:passive-mode off; set ftp:auto-passive-mode no; ls; bye;' -u user,password ftp://ftp.site.com

これはデバッグ出力です:

<--- 200 Using default language en_US
---> OPTS UTF8 ON
<--- 200 UTF8 set to on           
---> OPTS MLST modify;perm;size;type;UNIX.group;UNIX.mode;UNIX.owner;
<--- 200 OPTS MLST modify;perm;size;type;UNIX.group;UNIX.mode;UNIX.owner;
---> USER xxxxx
<--- 331 Password required for xxxxx
---> PASS xxxxxx
<--- 230 User xxxxx logged in     
---> PBSZ 0
<--- 200 PBSZ 0 successful               
---> PROT P
<--- 200 Protection set to Private       
---> PORT 172,16,133,11,146,168
<--- 500 Illegal PORT command                    
---> LIST
---> ABOR
---- Closing aborted data socket
---- Chiusura del socket di controllo

リモートサーバーがPORTコマンドをサポートしていないため、LFTPはデータソケットへの接続を放棄しているようです。 LFTPがまだポート20に接続できることを納得させる方法はありますか? FTPマニュアルでは明らかに問題ありません。

12
Marco

問題は、FTPサーバーがPORTコマンドをサポートしていないことではなく(サポートしている)、FTPクライアントが送信しているIPアドレス/ポートが気に入らないことだと思います。 PORTコマンド。

PORT 172,16,133,11,146,168

...サーバーにアドレス172.16.133.11、ポート37544 *に接続するように指示します。ここで興味深いのはIPアドレスです。これはRFC1918アドレスです(つまりプライベートネットワークアドレス )。これは、FTPクライアントがどこかのLANにあり、publicIPアドレスを使用してFTPサーバーに接続していることを示しています。

そのリモートFTPサーバーはプライベートネットワークアドレスに接続できません。定義上、RFC1918アドレスは公にルーティング可能ではありません。

したがって、FTPサーバーがPORTコマンドで指定されたアドレス/ポートに接続しようとして失敗した可能性があります。そのため、FTPサーバーは次のようにコマンドを失敗します。

500 Illegal PORT command

PORTコマンドをそのFTPサーバーで機能させるには、そのサーバーが接続できるpublicIPアドレスを検出する必要があります。クライアントマシンに到達します。このアドレスが1.2.3.4であるとしましょう。次に、ftp:port-ipv4オプションを使用して、lftpコマンドでそのアドレスを使用するようにPORTに指示する必要があります。

ただし、パブリックIPアドレスはNAT /ルーター/ファイアウォールのアドレスであり、およびそのNAT /ルーター/ファイアウォールは接続を許可しない可能性があります、外界から多数のポート(eg37544)に、LAN内のマシンにルーティングされます。これは、activeFTPデータ転送、ieFTPの問題の1つです。 PORT(またはEPRT)コマンドを使用するデータ転送:「ファイアウォール対応」とは見なされません。

お役に立てれば!


*-なぜ146,168はポート37544に変換されるのですか?

FTPによると RFC959 これらのパラメータは次のとおりです。

(...)16ビットTCPポートアドレス。このアドレス情報は8ビットフィールドに分割され、各フィールドの値は10進数(文字列表現)として送信されます。

146 dec = 10010010 bin = A
168 dec = 10101000 bin = B

    A        B
10010010 10101000 bin = 37544 dec
5
Castaglia