AWS + EC2 + vsftpd でハマる2017年8月1日

TOP  >  ブログ  >  AWS + EC2 + vsftpd でハマる

WEBを探してみたが解決した情報が載っていなかったのでメモ。
同じエラーでハマっている人のヒントになれば幸い。

インスタンスの作成とセキュリティグループの選択

AWSのEC2インスタンスの作成でredhatを選択。
登録の途中でセキュリティグループの設定があるので21と60001-60010を空けておく。
具体的には

タイプ : カスタムTCP
プロトコル : TCP
ポート範囲 : 21
ソース : カスタム 0.0.0.0/0

タイプ : カスタムTCP
プロトコル : TCP
ポート範囲 : 60001-60010
ソース : カスタム 0.0.0.0/0

ちなみにこの設定は作成し終わった後からでも可能。

ElasticIPの登録

新しいアドレスの割り当てをクリックしてアドレスを発行。
発行したアドレスを選択して先ほど作ったインスタンスに紐づける。
具体的には
アドレスの横のチェックボックス>アクション>アドレスの関連付け
リソースタイプ : インスタンス
インスタンス : 先ほど作ったインスタンス
プライベートIP : プルダウンに1つしか出てこないはずなのでそれを選択

SSHで接続

インスタンス一覧画面から該当インスタンスをチェックした後[接続]をクリックすると
具体的な接続方法の説明が出てくる。
ここではwinSCPで接続してみる。
セッション
ホスト名 : (インスタンスのパブリックDNS) ec2-***-***-***-***.us-east-2.compute.amazonaws.com
ポート番号 : 22
ユーザ名 : ec2-user
設定
認証 > 秘密鍵(EC2生成時に発行したpemファイルを選択するとppkファイルに変換してくれる)
winSCPとputtyの連携設定が終わっているならばログイン後画面のアイコンからコンソール画面が開く
接続後は

$ sudo su -

でルートになっておく

FTPで接続するユーザー作成

# useradd tanaka
# passwd tanaka

vsftpdインストール

yumでインストール

# yum -y install vsftpd

次に設定ファイルの編集。

# vi /etc/vsftpd/vsftpd.conf

デフォルトの設定値

anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

失敗例

WEBで検索した結果をあまり何も考えず設定した。ここでハマる。

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=NO
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
ls_recurse_enable=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=(ElasticIPで登録したIPアドレス)
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
seccomp_sandbox=NO
allow_writeable_chroot=YES
## 以下はお好みで
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
user_config_dir=/etc/vsftpd/user_conf

設定が終わったらvsftpd起動。

# systemctl start  vsftpd.service

再起動時にONになるように設定。

# systemctl enable vsftpd.service

FTPで接続してみる(失敗)

まずwinSCPで接続してみた。
転送プロトコル : FTP
暗号化 : 暗号化なし
ホスト名 : (インスタンスのパブリックDNS) ec2-***-***-***-***.us-east-2.compute.amazonaws.com
ポート番号 : 22
ユーザ名 : ec2-user
するとエラー

ディレクトリ '/home/tanaka' のリスト取得エラー
転送チャンネルが開けません。原因:要求したアドレスのコンテキストが無効です。
ディレクトリの一覧を取得できません。

なおログインして接続は成功している模様。
winSCPじゃ原因がよく分からなかったのでローカルのマシンのコンソールからftpで接続してみる。

$ ftp ec2-***-***-***-***.us-east-2.compute.amazonaws.com
Connected to ec2-***-***-***-***.us-east-2.compute.amazonaws.com (***.***.***.***).
220 (vsFTPd 3.0.2)
Name (ec2-***-***-***-***.us-east-2.compute.amazonaws.com:root): tanaka
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (0,0,0,0,234,102).
ftp: connect: 接続を拒否されました
ftp> ls
227 Entering Passive Mode (0,0,0,0,234,100).
ftp: connect: 接続を拒否されました
ftp> ls
227 Entering Passive Mode (0,0,0,0,234,100).
ftp: connect: 接続を拒否されました
ftp>

なんかパッシブモードで接続しようとして失敗している?
括弧の中身が何を指すのかは調べてないが察するに
初めの4つはIPアドレス、後の2つはポートではないだろうか?
(234, 100 は10進数に直すと60000ぐらいになる)
てことはIPが0.0.0.0になってるってこと??
ログインできているってことはAWS側の設定やvsftpd.confのログイン回りの設定値はきっと正しい。
パッシブ関連が怪しい。
winSCPで失敗したときはセキュリティグループでポートが空いていないのかとも思ったが
0.0.0.0にアクセスしちゃってるっぽいのでポートの問題ではなさそう。
pasv_***あたりが怪しいのでそこを重点的に色々やってみるも解決せず。。。

FTPで接続してみる(成功)

結論。vsftpd.confの設定を以下に変更してrestartかけたら動いた。

listen=YES
ipv6listen=NO

冷静に考えてみればそりゃそうか思えるがなかなか気が付けなかった。悔しい。
つまり動作確認済み設定値は

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=NO
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
ls_recurse_enable=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=(ElasticIPで登録したIPアドレス)
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
seccomp_sandbox=NO
allow_writeable_chroot=YES
## 以下はお好みで
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
user_config_dir=/etc/vsftpd/user_conf

コメントを残す

メールアドレスが公開されることはありません。