FTPプロトコルの通信には、アクティブモードとパッシブモードがあります。
実際、FTP通信行われているFTPのデータコネクション(データ転送用のコネクション)が
- アクティブモードか
- パッシブモードか
確認する方法は、どうしたら良いでしょうか?
レジュメ
環境・前提条件
- Windows Server 2019 のFTPサーバーを使用し
- Windowsの標準ftpコマンド(FTPクライアントftp.exe)
を使って確認しました。
結論、PORTコマンドを使っているかPASVコマンドを使っているか確認すればわかる
FTP通信には、
- 制御コネクション(pwd、cd、mkdirなど)
- データコネクション(ls、get、putなど)
があり、データコネクションを使う時には毎回、
- PORTコマンド(アクティブモード)
- PASVコマンド(パッシブモード)
か指定する必要があります。
なので、PORTコマンドかPASVコマンドかどちらのコマンドがFTP内で実行されているか確認できれば、
そのFTP通信がアクティブモードなのか、パッシブモードなのか、確認することが出来ます!
FTPサーバー側ではFTPログを確認すればアクティブモードかパッシブモードかわかる
WindowsのFTPサーバーの場合、以下にFTPログがあります。(デフォルト設定の場合)
C:\inetpub\logs\LogFiles
こちらのFTPログファイルを開きますと、FTPクライアントとFTPサーバーのコマンドのやり取りが記録されています。
このFTPログの中に、PORTコマンドがあればそれはアクティブモードです。
一方、PASVコマンドが確認できれば、パッシブモードです。
上記、画像のpasvの隣の「227」は「Passiveモードに切り替わった」というサーバー側の応答コードです。
参考: 器用な二刀流、FTPでファイル転送!:TCP/IPアレルギー撲滅ドリル(5) - @IT
クライアント側ではFTPコマンド「ls」を実施すればわかる
一方、クライアント側でもアクティブモードかパッシブモードか確認することが出来ます。
それは、データコネクションのFTPコマンド(例えば、「ls」コマンド)を実行すれば、わかります。
上記、画像のように「200 PORT」と帰ってくれば、FTPサーバーがPORTコマンド(アクティブモード)を許可したということです。
一方、上の画像では「quote pasv」コマンドで、FTPサーバーが「227」(Passiveモードに切り替わった)の応答コードを返していますが、その後「ls」コマンドがアクティブモードでFTPサーバーに接続しようとしているため、
425-Cannot open data connection.
Win32 error: The network connection was aborted by the local system.
Error details: Client IP on the control channel didn't match the client IP on the data channel.
というエラーが帰ってきて、データコネクションがうまく通信出来なかったことがわかります。
実は、Windowsの標準FTPコマンドでは、アクティブモードしか実施できないので、このエ425ラーとなってしまっています。
アクティブモードとパッシブモードはどっちがどっち?(覚え方)
FTPサーバー → FTPクライアント
FTPサーバーから、能動的に(アクティブ)にTCPコネクションを張りに行くのがアクティブモードです。
FTPサーバー ← FTPクライアント
一方、FTPサーバーが、受動的に(パッシブ)にTCPコネクションを張られるのがパッシブモードです。
インターネット上の、FTPサーバーに適しているのがパッシブモードです。
FTPES、FTPSでもハマるんですよね
FTPESだとポートの決定のシーケンスまで暗号化しちゃうので開ける可能性のあるポートを全部開けなきゃいけないという…
もうSFTP使ってよ。って言いたくなってた(過去形)
>とむさん
FTPやFTPSでハマリますよね。
FWなど通信制御があると、意識しなければならないですからね。
SFTPの方が単純ですね^^