ファイル転送プロトコルとして今はSCPやSFTPを使用しているところが多いと思います。
FTPを使用している企業もまだまだあるようで、今回FTPに触れる機会がありましたので調べた内容と実際にAWS上のEC2間でFTP通信した結果を記載してみました。
特に使用するポート番号や通信方式が複数あるのでその辺がちょっとクセが強いなと感じました。
FTPのパッシブモード/アクティブモードの概要について
FTP通信にはパッシブモードとアクティブモードの2種類の通信モードが存在します。
更にFTP通信によりファイル転送ができるまでに、制御コネクションとデータコネクションが成功する必要があります。それぞれの用途は下記の通り。
制御コネクション・・・FTP接続時、ユーザ/パスワードでログインするために使用。
データコネクション・・・ログイン後、ファイルの送受信するために使用。
また、パッシブモードとアクティブモードそれぞれで制御コネクションとデータコネクションで使用するポート番号や通信方向が異なっているという点がクセが強い理由になります。
次にこの2種類の通信モードの特徴について記載します。
パッシブモード
パッシブモードの特徴として、制御コネクションとデータコネクションの両方についてFTPクライアントからFTPサーバに対して行うというものです。
制御コネクションで使用するポート番号は21番、データコネクションで使用するポート番号は(FTPサーバ側で指定しない場合は)1024~65535番です。
※今回の検証では60000~60001に指定しようと思います。

アクティブモード
アクティブモードの特徴として、制御コネクションはFTPクライアントからFTPサーバに対して行い、
データコネクションはFTPサーバからFTPクライアントに対して行います。
制御コネクションで使用するポート番号はパッシブモードと同様の21番、 データコネクションで使用するポート番号は20番になります。

検証環境の準備
今回検証するAWS上の構成は下記のようになります。
FTPサーバA(Linux)・・・クライアントからFTP通信されるサーバ(OS:RHEL8.4)
FTPクライアントB(Linux)・・・FTPサーバに対してアクティブモードでFTP接続しにいくサーバ(OS:RHEL8.4)
FTPクライアントC(WindowsServer)・・・FTPサーバに対してパッシブモードでFTP接続しにいくサーバ(OS:WindowsServer2019)

FTPサーバA⇔FTPクライアントBではパッシブモードによるFTP通信を検証、
FTPサーバA⇔FTPクライアントCではアクティブモードによるFTP通信を検証します。
事前準備
FTPサーバAにFTPサービスの導入&設定が必要なのでそれらを実施してきます。
まずはvsftpdをインストール。
# dnf install vsftpd
インストール後、設定ファイルを編集。
# vi /etc/vsftpd/vsftpd.conf
今回は通信に必要な最低限の箇所についてのみ変更します。
【変更】
listen=NO ⇒ listen=YES ※ipv4で待ち受ける設定を有効にする
listen_ipv6=YES ⇒ listen_ipv6=NO ※ipv6で待ち受ける設定を無効にする
【追記】
今回FTPサーバ側でパッシブモードの通信で待ち受けるポートを制限するために下記を設定します。
pasv_max_port=60000
pasv_max_port=60001
設定ファイルを編集が完了したらvsftpdを再起動
# systemctl restart vsftpd
AWSのセキュリティグループで通信ポートを設定
パッシブモードとアクティブモードそれぞれで、AWS上のFTPサーバとクライアント間でFTP通信に必要なポートをセキュリティグループに設定します。
パッシブモードで接続する場合のセキュリティグループの設定
パッシブモードで接続する際のセキュリティグループについて、
FTPサーバAとクライアントBでそれぞれ下記のとおり設定します。
【FTPサーバA】
・インバウンドルール
ポート範囲:21、60000~60001
ソース: FTPクライアントB
・アウトバウンドルール
特に指定不要
【FTPクライアントB】
・インバウンドルール
特に指定不要
・アウトバウンドルール
ポート範囲:21、60000~60001
送信先:FTPサーバA
アクティブードで接続する場合のセキュリティグループの設定
アクティブモードで接続する際のセキュリティグループについて、
FTPサーバAとクライアントCでそれぞれ下記のとおり設定します。
【FTPサーバA】
・インバウンドルール
ポート範囲:21
ソース: FTPクライアントC
・アウトバウンドルール
ポート範囲:1024~65535
送信先: FTPクライアントC
【FTPクライアントC】
・インバウンドルール
ポート範囲: 1024~65535
ソース: FTPサーバA
・アウトバウンドルール
ポート範囲:21
送信先:FTPサーバA
FTP通信をしてみる
実際にクライアント⇒FTPサーバへFTP接続(制御コネクション&データコネクション)できるか試してみます。
パッシブモードの接続確認
クライアントB(Linux)からFTPサーバAに対してFTP通信し、dirコマンドによりFTPサーバAのshimmyユーザのファイル(ftp_testファイル)の存在が確認できました。
なお、実際にファイルの送受信(put,getを)しないでもdirコマンドによりファイルの一覧が参照できればデータコネクションまで成功しています。

FTPサーバ側で通信ポート状況を確認した結果、FTPサーバ側は21と60001を使用して通信していることが分かります。 (ftp:21番ポート)

アクティブモードの接続確認
同様にクライアントC(WindowsServer)からFTPサーバAに対してFTP通信し、dirコマンドによりFTPサーバAのshimmyユーザのファイル(ftp_testファイル)の存在が確認できました。

FTPサーバ側で通信ポート状況を確認した結果、FTPサーバ側は21と20を使用して通信していることが分かります。 (ftp-data:20番ポート、ftp:21番ポート)

補足事項
FTP通信におけるパッシブ/アクティブはクライアント側で制御するものであり、Linux(RHEL)とWindowsServerのFTPクライアントとしての動作モードはデフォルトだと下記のとおりとなります。
【 Linux(RHEL) 】
パッシブモード
【WindowsServer】
アクティブモード
また、LinuxではFTPモードをパッシブ/アクティブで切り替えることができますが、
Windowsでは切り替えができないらしいです。
もし切り替えて接続したい場合は、FFFTPやWinscpなどソフトを使う必要があります。
結論
アクティブモードでFTP通信した場合、ポートを広めに解放しないと通信できないため、
セキュリティ的な観点からパッシブモードを使用したほうが良いと思いました。
(FTP自体通信の暗号化されていないため、SCPやSFTPを使用したほうが良いかもしれません。)
コメント