内容
- AWSにおいて、ロードバランサー配下のEC2でFTPサーバを稼働させて外部からFTP接続する際の注意点
- FTPはパッシブモード、暗号化方式はexplicit(明示的)モードを使用する
- FTPサーバは、vsftpdを使用する
構成
こうしたかった理由
- EC2はウェブサーバとして使用していて、ACMを使用してサーバ証明書を安価に使用したかった(ACMはEC2には使えない)
- NLBをかますことで、EC2に外部IPアドレスを付与させないようにしたかった
NLBの設定
-
リスナーの追加
制御ポート:21(TCP)
データ転送用ポート:60001(TCP)
データ転送用ポート:60002(TCP)
データ転送用ポート:60003(TCP) -
ターゲットグループの追加
1.で設定したリスナーに対して、バックエンドのEC2に繋ぐようにそれぞれターゲットグループを作成する
セキュリティグループの設定
セキュリティグループを追加して、EC2インスタンスに設定する。
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
カスタムTCP | TCP | 21 | 外部から接続してくるユーザのグローバルIPアドレス |
カスタムTCP | TCP | 60001-60002 | 外部から接続してくるユーザのグローバルIPアドレス |
EC2の設定
- vsftpdをインストールする
sudo yum install vsftpd
sudo systemctl enable vsftpd.service
sudo systemctl start vsftpd.service
- vsftpdの設定をする
sudo vim /etc/vsftpd/vsftpd.conf
listen=YES
listen_ipv6=NO
ssl_enable=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
pasv_enable=YES
pasv_min_port=60001
pasv_max_port=60003
pasv_addr_resolve=YES
pasv_address=<NLB DNSホスト名 or NLBのAレコードを設定したホスト名>
tcp_wrappers=NO
- vsftpdの起動スクリプトを修正する(注意点)
このままでも動作するが、EC2を再起動した際にvsftpdが自動起動に失敗する事象が発生した。
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Thu 2020-07-30 03:50:54 UTC; 58s ago
Process: 787 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=2)
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: Starting Vsftpd ftp daemon...
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal vsftpd[787]: 500 OOPS: cannot resolve host:corpweb.common.hk-test.net
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: vsftpd.service: Control process exited, code=exited status=2
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: vsftpd.service: Failed with result 'exit-code'.
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: Failed to start Vsftpd ftp daemon.
pasv_address に登録したホスト名の名前解決ができていないのが原因らしい。
サービスの起動順序では、networkサービスの起動後にvsftpdが起動するように設定されているが、それでも名前解決に失敗する。
何かしらのサービスの起動順序に依存しているのだろうと思うが、そのサービスを特定できなかった。
しかたないので、vsftpdの起動スクリプトで一定時間待機(私は30秒にした)させることで、名前解決できるようにした。
もっといい解決策をご存知の方がいれば教えて下さい。
sudo vim /etc/systemd/system/multi-user.target.wants/vsftpd.service
# ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
ExecStart=/usr/bin/bash -c "sleep 30; /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf"
以上。