vsftpd のパッシブモード設定
外部システムとの接続でFTPでデータをやり取りすることはまだまだ発生します。そのような場合はFTPサーバーとパッシブモードで接続することが多いかと思います。
FTPサーバー(vsftpd)にパッシブモードで接続する際、接続してきているFTPクライアントにデータ通信用の接続先IPアドレスとポート番号を返します。
EC2でvsftpdサービスを起動している場合、そのままですとFTPクライアントのPASVコマンドに対して、EC2のプライベートIPを返すことになり、インターネット経由で接続しにきているFTPクライアントはプライベートIPで接続しようとして接続できない状態になります。
そこで、EC2に割り当てたEIP(パブリックIP)を返すように設定します。
具体的には /etc/vsftpd/vsftpd.conf のpasv_addressに以下のようにEIPを設定します。
pasv_enable=YES
pasv_address=XXX.XXX.XXX.XXX (割り当てたパブリックIP)
また、FTPの接続に使うポート番号の範囲も以下のように設定します。範囲はクライアント接続数を考慮して決めます。
pasv_min_port=600XX
pasv_max_port=600YY
セキュリティグループの開放ポートについても上記のポート番号の範囲に合わせて設定します。
vsftpdサーバーにパブリックIP経由とプライベートIP経由双方から接続できるようにする
EC2で立てたvsftpdのFTPサーバーに、インターネット経由のパブリックIPでの接続と、VPNやVPC内のインスタンスからのプライベートIPでの接続を併用する場合があります。
上記のようにpasv_addressにパブリックIPを記載したままだと、プライベートIPで接続しにきたFTPクライアントでは接続することができません。
これを解決するために、EC2に2つのIPアドレスを割り当て、それぞれのIPで2つのvsftpdプロセスを起動します。それぞれのvsftpdでLISTENするIPアドレスを変えることで、一方のパッシブモードにはパブリックIPを返し、もう一方にはプライベートIPを返すようにします。
vsftpdの複数コピーを起動することになり、これをマルチホーミングといいます。
ENI(仮想ネットワークインターフェイス)にプライベートIPを2つ割り当てます。
EIPを割り当て当該インスタンスに関連付けが完了しているという前提で、次にインスタンスの「ネットワーキング」→「IPアドレスの管理」で開いた画面で「新しいIPアドレスの割り当て」を押して自動割り当てで2つ目のプライベートIPを割り当てます。
上記例では、パブリックIPと関連付けされているプライベートIPが「10.0.1.49」で関連付けされていないプライベートIPが「10.0.1.55」となります。以下の設定例ではこの2つのプライベートIPを使用しますので、適宜ご自分の環境のIPで読み替えてください。
パブリックIPを返すvsftpdの設定
パブリックIPを接続IPとして返すよう、EIPと関連付けされている「10.0.1.49」でLISTENするようにvsftpd.confを設定します。
vsftpd.conf
listen_address=10.0.1.49
pasv_enable=YES
pasv_address=[パブリックIP(EIP)]
pasv_min_port=600XX
pasv_max_port=600YY
ログの設定を下記で記述します。
xferlog_enable=YES ←ログ取得
xferlog_std_format=NO ←詳細ログ取得
vsftpd_log_file=/var/log/vsftpd.log
#xferlog_file=/var/log/xferlog ←コメントアウト
プライベートIPを返すvsftpdの設定
プライベートIPを接続IPとして返すよう、EIPと関連付けされていない「10.0.1.55」でLISTENするように設定します。
ここで、設定ファイルはvsftpd.confをコピーして vsftpd_local.conf といったファイル名で設定ファイルを新たに作成し編集します。
vsftpd_local.conf
listen_address=10.0.1.55
pasv_enable=YES
pasv_address=10.0.1.55
pasv_min_port=600XX
pasv_max_port=600YY
ログファイルはグローバルIP用と重ならないよう設定しておきます。
xferlog_enable=YES
xferlog_std_format=NO
vsftpd_log_file=/var/log/vsftpd_local.log
#xferlog_file=/var/log/xferlog
ログローテーションの設定変更
新しいログファイルが追加されたのでログローテーションの設定も変更しておきます。
/etc/logrotate.d/vsftpd を適宜変更します。
複数のvsftpdプロセスを起動する
vsftpd.target を有効にすると、/etc/vsftpd/ 以下の *.conf を読込み、confファイルそれぞれのの設定でvsftpdプロセスを起動できるようになります。
# systemctl enable vsftpd.target
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.target to /usr/lib/systemd/system/vsftpd.target.
/etc/vsftpd/ 以下のconf分のvsftpd複数プロセスを起動
# systemctl start vsftpd.target
プロセスがconfファイル分起動されているのが確認できます。
# ps -ef | grep vsftpd | grep -v grep
root 9545 1 0 03:43 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 9598 1 0 03:44 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd_local.conf
FTP接続
FTPクライアントから接続する場合はそれぞれ以下のアドレスを接続先に指定します。これで、インターネット経由でも内部IPからも同じFTPサーバーに接続することが可能になります。
- インターネット経由:[パブリックIP(EIP)]
- プライベートIP経由:10.0.1.55 (vsftpd_local.conf のlisten_addressに記載のプライベートIP)