本文将介绍如何在Amazon Linux2 搭建FTP服务器,用于传输文件。
适用环境
本文所介绍的步骤在**使用 Amazon Linux 2 AMI** 中测试通过。
配置说明
Linux Instance 所需配置
**1)Linux 实例必须有公网 IP**
如果您需要从公网访问 FTP 服务,则需要给 EC2 分配公有 IP 或者弹性 IP。详情请参考[<https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-instance-addressing.html>](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-instance-addressing.html?trk=cndc-detail)中的公有 ipv4 部分和弹性 ip 地址部分。
**2)配置安全组**
接下来,需要给实例配置安全组,使其能够接收来自 Internet 的 FTP 请求。进入 EC2 Console,在左侧目录选中实例。之后,选中您的 Linux 实例,并点击与您实例关联的安全组。如果您不想更改原安全组,可以在目录左侧选择安全组并创建一个新的安全组,并与此实例关联。

选中此安全组后,点击编辑入站规则。您需要开启 port20-21 以让外界通过FTP 默认port 20和21连接服务器实例。您还需开启 port 1024-1048 用于FTP 的 passive 模式。(可选)您可以将源更改为您的IP地址以限制其他人访问您的实例。

##### 安装 vsftpd
**1)连接您的 Linux 实例 linux shell 后,安装 vsftpd**
sudo yum install vsftpd
**2)确认安装完成后,我们将修改 vsftpd 的config 文件来设置 ftp 服务器。使用 vim(或您想使用的编辑器)更改 config 文件:**
sudo vim /etc/vsftpd/vsftpd.conf 为限制匿名用户访问我们的FTP服务器,将以下行:
```
anonymous_enable=YES改为:
anonymous_enable=NO并在文件底下加入这些行:
pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1048
pasv_address=<
您Linux实例的公网IP地址>您的实例如果使用的是ipv4 ip地址(大部分情况,您使用的都是ipv4地址,如果您使用的是弹性ip,一定是ipv4地址),请找到下面这行并将其注释掉(在此行前加一个#号):
listen_ipv6=YES同时,将以下行:
listen=NO改为:
listen=YES
```
**3)重启 vsftpd:**
在 linux command line 中键入:sudo systemctl restart vsftpd 若您想要 vsftpd 每次都伴随开机自动启动,则键入:
sudo systemctl enable vsftpd
**4)设置用户:**
因为 vsftpd 自动限制所有 linux 上已存在的用户,我们需要新建一个用户,请使用以下命令:sudo adduser <您的用户名>
sudo passwd <您的用户名>为了防止ftp用户访问根目录以外的目录,我们需要再次进入 config 文件更改设置:
sudo vim /etc/vsftpd/vsftpd.conf 找到此行并取消这行的注释:
chroot_local_user=YES 因为我们 adduser 创建的 user 自动有 write 权限,所以我们需要在 config 文件中允许 chroot write 权限。**您也可以单独设置 user 的权限,并不允许 chroot write。**
在 config 文件最底下加入此行:allow_writeable_chroot=YES 再次重启vsftpd 使您的更改生效:
##### sudo systemctl restart vsftpd 访问 FTP 服务
使用浏览器[<ftp://your-public-ip-address>](ftp://your-public-ip-address?trk=cndc-detail)即可访问与下载文件(未来浏览器可能会不支持 ftp 访问),也可以使用 FileZilla 客户端进行文件上传、文件夹管理。
如果您想用命令行访问 ftp,在 linux 下可安装 ftp client。sudo yum install ftp 安装后可使用以下命令来访问:
##### ftp <您的 linux 实例的公网 IP >启用 FTP over SSL(可选)
为了让您的 ftp 连接更加安全,我们推荐您使用 ftps 协议(explicit)来建立 ftp 连接。接下来我们将介绍如何设置 ftp 服务器来建立 ftpse 连接。
首先,在服务器端创建您的 SSL 证书和密钥,我们选择将密钥和证书放在一个文件里,您也可以将它们分开。您也可以自己设置证书和密钥的位置和文件名字。
sudo mkdir /etc/ssl/private
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem之后,打开vsftpd config文件设置ssl:
sudo vim /etc/vsftpd/vsftpd.conf在文件中加入以下行以设置密钥和证书文件位置:
rsa_cert_file=/etc/ssl/private/vsftpd.pem <或者您自己设置的证书位置>
rsa_private_key_file=/etc/ssl/private/vsftpd.pem <或者您自己设置的密钥位置>在文件中加入以下行使ssl成为默认和必须的连接方式:
```
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES 在文件中加入以下行来设置我们使用的SSL版本和其他设置:
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH 重启 vsftpd 使您的更改生效:
sudo systemctl restart vsftpd
```
<!--StartFragment-->
**提示:使用 ftps 连接最容易的方式是使用 filezilla,操作过程和 ftp 一样,只是会弹窗提示您是否认证此证书。在 linux 上可以考虑使用 lftp。**
#### 问题排查
- 如果没有任何连接信息,检查安全组和防火墙有没有打开控制端口21。
- 如果您想开启需要详细的 ftp logging 来排查问题,请修改 config 文件:输入此命令打开 config 文件
- sudo vim /etc/vsftpd/vsftpd.conf加入此行
```log_ftp_protocol=YES
将此行
xferlog_std_format=YES
改为
xferlog_std_format=NO
重启vsftpd使您的更改生效:
sudo systemctl restart vsftpd
您可以在服务器端(ec2 实例)中的var/log/vsftpd.log 看到您的 log
```
#### 参考资料
- [<https://medium.com/tensult/configure-ftp-on-aws-ec2-85b5b56b9c94>](https://medium.com/tensult/configure-ftp-on-aws-ec2-85b5b56b9c94?trk=cndc-detail)
- [<https://gist.github.com/gunjanpatel/37d306cd1585ece1179b>](https://gist.github.com/gunjanpatel/37d306cd1585ece1179b?trk=cndc-detail)
- [<https://www.digitalocean.com/community/tutorials/how-to-configure-vsftpd-to-use-ssl-tls-on-a-centos-vps>](https://www.digitalocean.com/community/tutorials/how-to-configure-vsftpd-to-use-ssl-tls-on-a-centos-vps?trk=cndc-detail)