FTP アクティブ モードとは、サーバーがクライアントへの接続を開き、データ自体を送信することを意味します。多くの場合、これは実用的ではないため、パッシブ モードが発明されました。サーバーは、着信接続をリッスンし、誰かが接続されたときに送信を開始する追加のポートを開きます。
したがって、パッシブ モードのセッションは次のようになります。
$ telnet localhost 21
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PASV
227 Entering Passive Mode (127,0,0,1,185,37).
LIST
150 Here comes the directory listing.
---> here client opens another telnet session,
---> connecting to the same server on port 185*256+37, specified by server:
$ telnet localhost $((185 * 256 + 37))
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
drwxrwxr-x 2 121 1003 4096 Aug 21 10:57 incoming
drwxrwxr-x 7 0 1003 4096 Nov 09 21:04 pub
Connection closed by foreign host.
<---- end of data transfer session
226 Directory send OK.
一方、アクティブなセッションの例:
$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PORT 127,0,0,1,45,45 (ports are specified by client)
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
---> here client listens for an incoming connection on port 45*256+45
$ nc -l 0.0.0.0 $((45 * 256 + 45))
drwxrwxr-x 2 121 1003 4096 Aug 21 10:57 incoming
drwxrwxr-x 7 0 1003 4096 Nov 09 21:04 pub
<--- data are rececived
226 Directory send OK.
PS FTP は非常に古いプロトコル (1970 年頃の定義) であり、ルーター、ゲート、およびその他のトランスポート レベルのグッズが存在しなかったときに定義されました。通常、複数のマシンが直接接続されていたため、アクティブ モードは非常にうまく機能し、パッシブ モードはどのように機能したかを示しています。プロトコルは今日も生き残っています。
したがって、はい、PORT コマンドを正しく取得しましたが、外部 IP を取得するための統一された方法はありません (ローカル マシン上のいくつかの異なるネットワークに複数の IP が存在する可能性があります。どのサーバーを使用しますか?)。質問の 2 番目の部分である、サーバーから見た IP を取得する方法については、答えられません (これがパッシブ モードの目的です)。