AWS Transfer Family のPassiveIpパラメータの概要と設定変更が必要・不要なケースをまとめてみた

2024.02.15

はじめに

AWS Transfer Family for FTPおよびFTPS サーバーのPassiveIpパラメータについて、その概要と設定変更が必要なケース、不要なケースについてまとめました。

PassiveIpについて

先に、FTPパッシブモードでのファイル転送までの流れを説明します。おおよそ下記の通りです。

  1. クライアントがコントロールコネクション(ポート21)を介してPASVコマンドでパッシブモード接続をリクエストします
  2. サーバーはデータコネクションの接続先のIPアドレスとポート番号(Transfer Familyの場合、8192〜8200)を返します。
  3. クライアントは返されたIPアドレスとポート番号をもとにデータコネクションを介してサーバーに接続することで、ファイル転送が可能になります。

FTPにおけるアクティブモードとパッシブモードの違いは、以下のサイトがわかりやすいので、参考にしてください。

クライアントに対して、Transfer Familyサーバーがデータコネクションの接続先のIPアドレスを返す値は、Transfer FamilyのPassiveIpで指定します。

PassiveIpの指定値は、以下の3つの選択肢があります。

  • PassiveIp=AUTO
  • PassiveIp=単一のIPアドレス
  • PassiveIp=0.0.0.0

PassiveIp=AUTO

PassiveIp=AUTOは、デフォルト値です。この設定では、Transfer Familyサーバーが自動的にエンドポイントIPのいずれかを選択してPASV応答(データコネクションの接続先のIPアドレスとポート番号をクライアントに返す)を行います。

エンドポイントIPは、Transfer Familyサーバーがクライアントに接続を提供するために使用するIPアドレスです。Transfer Familyサーバーが作成されると、VPCエンドポイントがエンドポイントIPとして作成されます。

EC2→Transfer Family→S3などの一般的な構成であれば、PassiveIpは、デフォルト値で問題ありません。

PassiveIpの変更が必要なケース

PassiveIpの設定値はAUTO以外の選択肢として、単一のIPアドレス、もしくは、0.0.0.0があります。

PassiveIpに単一のIPアドレスを指定するケースとして、NLBを利用している構成でNLBのプライベートIPを指定することが挙げられます。

引用

ほかには、AWS PrivateLinkを利用する構成でもNLBのプライベートIPを指定するケースがあります。

引用

ただし、PassiveIpを単一のIPアドレスにすると、NLBが複数のサブネット上にある高可用性の場合、サブネットごとにTransfer Familyサーバーを作成する必要があります。

PassiveIp=0.0.0.0とすると、クライアントはコントロールコネクションと同じIPアドレスを使用するようになり、複数のサブネット上にNLBがある場合も接続可能になります。

注意点

ただし、すべてのFTPクライアントがPassiveIp=0.0.0.0という応答をサポートしているわけではありません。

AWSドキュメントでは、FileZillaとWinSCPはサポートされていると記載されております。

ただし、すべての FTP クライアントが PassiveIp=0.0.0.0 応答をサポートしているわけではないことに注意してください。FileZilla と WinSCP はそれをサポートしています。他のクライアントを使用している場合は、そのクライアントが PassiveIp=0.0.0.0 応答をサポートしているかどうかを確認してください。引用

サポートされていない場合、PassiveIp=NLBのIPの通り、NLBの1つのプライベートIPを指定します。複数サブネットの場合、Transfer Familyサーバーを複数作成し、サブネットごとに存在するNLBのプライベートIPをPassiveIp=NLBのIPとして設定する必要があります。

試してみた

以前、Transfer Family for FTP を AWS PrivateLink経由でファイル転送する構成を構築しましたので、この構成を利用して、PassiveIp=0.0.0.0の設定変更を試してみました。 構築方法は、下記のブログをご参考ください。

上記の構成を構築後、PassiveIp=0.0.0.0に変更します。

設定変更後は、Transfer Familyを再起動します。

停止の後、開始をすると再起動が完了です。

FTP接続

AWS PrivateLinkを利用する構成において、EC2(Amazon Linux2)でftpコマンドを実行し、PassiveIp=0.0.0.0がサポートされているか確認します。

ftpパッケージをインストールします。

$ sudo yum install -y ftp

Installed:
  ftp.x86_64 0:0.17-67.amzn2.0.2                                                                                      

Complete!

ftpコマンドを利用し接続します。接続先は、VPCエンドポイント(AWS PrivateLinkの利用側)です。

$ ftp vpce-09de7f41eb073a17e-r95udb03.vpce-svc-04ec99342c0977f6c.ap-northeast-1.vpce.amazonaws.com
Connected to vpce-09de7f41eb073a17e-r95udb03.vpce-svc-04ec99342c0977f6c.ap-northeast-1.vpce.amazonaws.com (10.1.135.46).
220 Service ready for new user.
Name (vpce-09de7f41eb073a17e-r95udb03.vpce-svc-04ec99342c0977f6c.ap-northeast-1.vpce.amazonaws.com:ec2-user): class
331 User name okay, need password for class.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp> pwd
257 "/" is current directory.
ftp> cd s3バケット
250 Directory changed to /s3バケット
ftp> ls
227 Entering Passive Mode (0,0,0,0,32,5)
ftp: connect: Connection refused

結果として接続できなかったため、ftpコマンドはPassiveIp=0.0.0.0をサポートしていないと考えられます。

PassiveIpの設定変更が不要なケース(クライアント側の設定)

NLBを間に挟む構成の場合でも、PassiveIpの設定変更が不要なケースもあります。

AWS PrivateLinkを利用したTransfer Family経由でのファイル転送の場合、Transfer Familyサーバー側のPassiveIpの設定がデフォルト値(AUTO)のままであっても、クライアント側の設定によってファイル転送が可能なFTPクライアントが存在します。以下の2点を紹介します。

  • lftp
  • WinSCP

lftp

FTPクライアントが拡張パッシブモード(EPSV)を利用できる場合、PASV応答はポート番号のみとなり、PassiveIpのプライベートIPが返却される問題が発生しません。

lftpは、拡張パッシブモードをサポートしていますので、PassiveIpがデフォルト値(AUTO)でもFTP接続しファイル転送可能です。下記の記事では、lftpコマンドでファイル転送しています。

WinSCP

WinSCPでは、「パッシブモードでIPアドレスを強制 (Force IP Address for passive mode)」をONと設定することで、コントロールコネクションと同じIPアドレスを利用するため、デフォルト値(AUTO)でもFTP接続しファイル転送可能でした。

ファイル転送できています。

ただし、設定がONではなくAUTONOにした場合、PassiveIpが0.0.0.0やNLBのIPであっても接続できません。

「パッシブモードでIPアドレスを強制」について、ドキュメントにも記載がありました。

パッシブ モード接続の強制 IP アドレスは 、WinSCP がサーバーによって提供される IP アドレスの代わりに FTP ホストの外部 IP アドレスを使用するかどうかを制御します。これは、IP アドレスが変換される ( NAT ) 場合に便利です。このオプションはパッシブ モードでのみ使用できます。Autoに設定すると、指定された IP アドレスがルーティングできない場合、WinSCP は外部 IP アドレスを自動的に使用します。引用(日本語訳)

最後に

AWS Transfer Family のPassiveIpパラメータについて解説しました。

EC2からTransfer Familyを経由してS3にアクセスする一般的な構成では、デフォルトのPassiveIp設定で問題ありません。

しかし、AWS PrivateLinkなどでNLBを経由する場合は、クライアント側の設定やPassiveIpの設定に注意が必要です。