Amazon Ec2

OpenVPNを介したFTP接続設定を追加した件

はじめに

こんにちは テクニカルサポートの安田でございます

今回はAWSのEC2環境でOpenVPN接続後にFTP接続を行うと失敗する事象がございました。
上記の問題を解消させるというネタになります。

概要

当初の状況
aws環境にOpenVPN接続を行う、その後FTP接続を行うとエラーとなる。

環境

OS CentOS Linux release 7.9.2009 (Core)
FTPバージョン vsftpd-3.0.2-28.el7.x86_64
OpenVPNバージョン openvpn-2.4.10-1.el7.x86_64

設定変更前のログ

FTP over Implicit SSL/TLS (FTPIS)を使用します.
ホスト 10.8.0.1 (10.8.0.1:21) に接続しています.
接続しました.
接続できません.
FTP over Explicit SSL/TLS (FTPES)を使用します.
ホスト 10.8.0.1 (10.8.0.1:21) に接続しています.
接続しました.
220 (vsFTPd 3.0.2)
>AUTH TLS
530 Please login with USER and PASS.
>AUTH SSL
530 Please login with USER and PASS.
ログインできません.
通信は暗号化されていません.
第三者にパスワードおよび内容を傍受される可能性があります.
ホスト 10.8.0.1 (10.8.0.1:21) に接続しています.
接続しました.
220 (vsFTPd 3.0.2)
>USER testuser
331 Please specify the password.
>PASS [xxxxxx]
230 Login successful.
>FEAT
211-Features:
 EPRT
 EPSV
 MDTM
 PASV
 REST STREAM
 SIZE
 TVFS
 UTF8
211 End
>OPTS UTF8 ON
200 Always in UTF8 mode.
>XPWD
257 "/"
>TYPE A
200 Switching to ASCII mode.
>PASV
227 Entering Passive Mode (XX,XXX,XX,XX,XX,XXX).
ダウンロードのためにホスト XX.XXX.XX.XX (XX.XXX.XX.XX:6010) に接続しています.
接続できません.
ファイル一覧の取得を中止しました.
ファイル一覧の取得に失敗しました.
切断しました

原因

もともと接続元拠点→EC2へFTPする際に
FTPサーバーがデータ通信用の接続先「IPアドレス」と「ポート番号」を返しますが
AWS上のEC2は自身のEIP(グローバルIPへのアドレス)の存在を知らないため、
PASVコマンドに対してプライベートIPアドレスを返してしまいます。
上記を解消するため(pasv_address=GIP)を
vsftpd.confに記載することによってパッシブモードを有効化していた。

上記のみ有効化するとOpenVPNで10.8.0.1を指定した際に
記載されたGIPを返し接続が確立できないため
ファイル一覧の取得ができず切断されてしまいます。

対応策

上記の問題に対して
「グローバルのパッシブアドレス返す用」(OpenVPNを介さないFTP接続)
「OpenVPN用」のvsftpd設定
vsftpd.global.conf と vsftpd.local.confを
2つ立てることによって接続エラーを回避する

対応手順

OpenVPNを介さないFTP接続設定への変更

# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.global.conf
# vi /etc/vsftpd/vsftpd.global.conf
-----------------------------------------------------------
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# BEGIN ANSIBLE MANAGED BLOCK
use_localtime=YES
log_ftp_protocol=YES
force_dot_files=YES
allow_writeable_chroot=YES
# END ANSIBLE MANAGED BLOCK

pasv_address=GIP
pasv_min_port=6001
pasv_max_port=6010
-----------------------------------------------------------
↓↓↓↓↓↓↓以下に変更↓↓↓↓↓↓↓
-----------------------------------------------------------
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# BEGIN ANSIBLE MANAGED BLOCK
use_localtime=YES
log_ftp_protocol=YES
force_dot_files=YES
allow_writeable_chroot=YES
pasv_enable=YES
pasv_addr_resolve=YES
listen_address=LIP
pasv_address=GIP
pasv_min_port=6001
pasv_max_port=6010
# END ANSIBLE MANAGED BLOCK
-----------------------------------------------------------

OpenVPNを介さないFTP接続設定の新規作成

# vi /etc/vsftpd/vsftpd.local.conf
-----------------------------------------------------------
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=002
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
use_localtime=YES
log_ftp_protocol=YES
force_dot_files=YES
allow_writeable_chroot=YES
pasv_enable=YES
pasv_addr_resolve=YES
listen_address=10.8.0.1
pasv_min_port=6001
pasv_max_port=6010
-----------------------------------------------------------

FTPの起動設定の変更

# vi /usr/lib/systemd/system/vsftpd.service
-----------------------------------------------------------
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
↓以下に変更
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.global.conf
-----------------------------------------------------------

サービスのリロード

# systemctl daemon-reload

OpenVPN経由FTPの起動設定の新規追加

# vi /etc/systemd/system/vsftpd_local.service
-----------------------------------------------------------
[Unit]
Description=Vsftpd ftp local daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.local.conf

[Install]
WantedBy=multi-user.target
-----------------------------------------------------------

※新規作成のためここでsystemctl daemon-reloadはしません。

vsftp.global再起動とvsftpd.localの起動

# systemctl restart vsftpd.service

# systemctl start vsftpd_local.service
# systemctl status vsftpd_local.service

結果

# ps aux |grep vsftpd
===========================================================================
root     12012  0.0  0.0  53284   732 ?        Ss   16:19   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.global.conf
root     12973  0.0  0.0  53284   728 ?        Ss   16:32   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.local.conf
nobody   13011  0.0  0.1  62164  2240 ?        Ss   16:33   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.local.conf
testuser 13013  0.0  0.0  64272  1632 ?        S    16:33   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.local.conf
root     13035  0.0  0.0 112732   976 pts/0    S+   16:33   0:00 grep --color=auto vsftpd
===========================================================================

/usr/sbin/vsftpd /etc/vsftpd/vsftpd.global.conf
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.local.confが共存する形となる。

設定変更後のログ

FTP over Implicit SSL/TLS (FTPIS)を使用します.
ホスト 10.8.01 (10.8.0.1:21) に接続しています.
接続しました.
接続できません.
FTP over Explicit SSL/TLS (FTPES)を使用します.
ホスト 10.8.01 (10.8.0.1:21) に接続しています.
接続しました.
220 (vsFTPd 3.0.2)
>AUTH TLS
530 Please login with USER and PASS.
>AUTH SSL
530 Please login with USER and PASS.
ログインできません.
通信は暗号化されていません.
第三者にパスワードおよび内容を傍受される可能性があります.
ホスト 10.8.01 (10.8.0.1:21) に接続しています.
接続しました.
220 (vsFTPd 3.0.2)
>USER testuser
331 Please specify the password.
>PASS [xxxxxx]
230 Login successful.
>FEAT
211-Features:
 EPRT
 EPSV
 MDTM
 PASV
 REST STREAM
 SIZE
 TVFS
 UTF8
211 End
>OPTS UTF8 ON
200 Always in UTF8 mode.
>XPWD
257 "/"
>TYPE A
200 Switching to ASCII mode.
>PASV
227 Entering Passive Mode (10,8,0,1,23,113).
ダウンロードのためにホスト 10.8.0.1 (10.8.0.1:6001) に接続しています.
接続しました.
>LIST
150 Here comes the directory listing.
226 Directory send OK.
ファイル一覧の取得は正常終了しました. (183 Bytes)

総括

閲覧頂きありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA