在亚马逊 EC2 中 Ubuntu 14 环境下配置 vsftpd

捯饬了几天亚马逊的 EC2,这里稍微总结记录一下 ftp 服务的配置过程

一、安装

安装的是 linux 下比较有名的 vsftpd,服务器环境 Ubuntu 14.04.1 LTS,vsftpd版本 3.0.2,安装相当简单:

1
sudo apt-get install vsftpd

安装完成可以看看 ftp 服务是否已经运行:

1
2
netstat -a | grep ftp
tcp 0 0 *:ftp *:* LISTEN

查看是否打开21端口:

1
2
sudo netstat -npltu | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 20497/vsftpd

启动,重启和停止 vsftpd,还有查看状态:

1
2
3
4
service vsftpd start
service vsftpd restart
service vsftpd stop
service vsftpd status

先备份一下默认的配置文件:

1
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup

二、配置

接下来有几个字段需要重新配置一番:

1
2
# Uncomment this to enable any form of FTP write command.
write_enable=YES

是否允许执行FTP写入操作,我们要往服务器上传输文件,当然要 yes

1
2
3
4
5
6
# 是否将本地登录的用户通过 chroot() 限制在其家目录中
chroot_local_user=YES
# 是否读取 chroot_list_file 文件中的"chroot例外"用户
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd.chroot_list

在 vsftpd 服务器中使用 chroot() 来管理是否允许登录用户切换目录,默认情况下本地用户可以切换到其主目录以外的目录进行浏览访问,这样对于服务器来说是不太安全的
据上面的配置,在对应目录下创建 vsftpd.chroot_list 文件。当 chroot_local_user=YES 时,chroot_list_file 文件中用户将不会被限制在其家目录中。 当 chroot_local_user=NO 时,chroot_list_file 文件中用户将会被限制在其家目录中。

1
2
# This string is the name of the PAM service vsftpd will use.
pam_service_name=ftp

这是 vsftpd 将要使用的PAM服务名称
最后,在 vsftpd.conf 文件中添加以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 是否禁止 userlist_file 文件中的用户登陆
userlist_enable=YES
# 是否允许 userlist_file 文件之外的用户登陆。该指令仅在 userlist_enable=YES 时有意义
userlist_deny=NO
# 指定 userlist_enable=YES 时要加载的文件,内容为用户名,一行一个
userlist_file=/etc/vsftpd.user_list
# 是否允许使用 PASV 命令获得数据连接的地址端口对
pasv_enable=YES
pasv_min_port=13000
pasv_max_port=13100
port_enable=YES
pasv_addr_resolve=NO
pasv_address=[你的公网ip]
pasv_promiscuous=YES

最终去除注释的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=ftp
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list
pasv_enable=YES
pasv_min_port=13000
pasv_max_port=13100
port_enable=YES
pasv_addr_resolve=NO
pasv_address=54.65.147.146
pasv_promiscuous=YES

三、创建用户

1
2
sudo useradd -s /sbin/nologin -d /var/www -g ftp username
sudo passwd username

注:确保 /var/www 这个目录已存在

四、开启端口

最后,要在 AWS 控制台中开启相关端口:

1
2
TCP Ports 20 - 21
TCP Ports 13000 - 13100

五、问题

使用FTP客户端连接服务器的时候,无法登陆,从FTP日志中看到客户端在执行AUTH TLS命令后,提示“无法连接到服务器”的错误信息

登陆时设置FTP客户端不要求会话加密,即采用普通的FTP会话方式。以FileZilla软件为例,客户在管理站点的时候,“加密”选择为“只使用普通FTP(不安全)”即可,如下图所示: