前言
不再推荐使用
FTP,建议直接使用SFTP免安装。本文仅做为备忘,实验环境为腾讯云服务器。
由于支付系统需要一些三方的证书做密钥的签名以及对账系统中常用的文件上传,所以搭建我们的FTP文件服务用来保存这些文件就显得很有必要。因此,本文主要介绍如何搭建在云服务器上搭建FTP文件服务。
FTP 概念
主动模式与被动模式
在使用FTP时,如果客户端机器和FTP服务器双方之间的所有端口都是开放的,那连接不存在问题。如果客户端与服务器之间有防火墙,如果没配置好防火策略和采用合适的连接模式,会导致登录成功,但无法List列表的问题(此时会告知服务端主动/被动模式)。要避免出现这样的问题,首先要了解FTP的工作模式。下面分别介绍两种模式的异同。
主动模式
主动模式传送数据时是服务器连接到客户端的端口,不需要在我们的服务器防火墙上打开任何额外的非安全端口,因此服务器端是安全的。但是主动模式需要客户端必须开放端口给服务器。很多客户端都是在防火墙内,开放端口给FTP服务器访问比较麻烦。
被动模式
被动模式只需要服务器端开放端口给客户端连接就行了,所以这种FTP方法是不安全的,因为在服务器上打开了一个随机的非特权端口。
FTP 安装全过程
安装流程
安装
yum install -y vsftpd
设置自启动
systemctl enable vsftpd.service
启动FTP服务
systemctl start vsftpd.service
查看FTP服务监听的端口
netstat -antup | grep ftp
出现上图的画面代表已正常启动,监听端口为21。
配置流程
安装流程完成后,我们需要配置用户访问模式。众所周知,一个安全的文件服务肯定是需要密码访问的。但是有些可供围观的资源也可提供匿名访问模式(无需账号密码)。注意:只能选择一种模式进行配置。由于常见的使用场景都需要密码,所以建议大家选择用户模式,如果需要供游客访问,提供公共测试账号和秘密即可。
以下分别介绍两种模式的配置方式。
匿名模式
修改配置文件:
vim /etc/vsftpd/vsftpd.conf
按/键进入搜索模式,输入anonymous_enable=YES回车,按i键进入编辑模式,取消注释。Ctrl+C退出编辑模式,按:wq!保存并退出。
为FTP用户添加写权限:
chmod o+w /var/ftp/pub/
重启服务
systemctl restart vsftpd.service
配置完成后,可使用图形化界面进行测试。
点击登录后,会看到如下界面。
这样其实我们已经可以正常访问了。我们可以试着上传文件。
这里我是选择的图形化界面直接拖动上去的。注意:只能上传到pub目录下。
这里配置就完成了,当然有些朋友可能会出现无法连接的问题。如果是云服务器注意安全组开放20/21端口。这里就不再具体介绍如何配置了,请参考对应云服务器的配置介绍。
用户模式
首先我们创建一个用户
adduser ftptest
并设置密码
passwd ftptest
创建一个目录供该用户使用
mkdir /var/ftp/test
更改该目录的所有者
chown -R ftptest:ftptest /var/ftp/test
这里按照主动/被动模式有两种配置方法:
主动模式
sed -i 's/anonymous_enable=YES/anonymous_enable=NO/' /etc/vsftpd/vsftpd.conf #禁止匿名登录 FTP 服务器
sed -i 's/listen=NO/listen=YES/' /etc/vsftpd/vsftpd.conf #监听 IPv4 sockets
sed -i 's/listen_ipv6=YES/#listen_ipv6=YES/' /etc/vsftpd/vsftpd.conf #关闭监听 IPv6 sockets
sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd/vsftpd.conf #全部用户被限制在主目录
sed -i 's/#chroot_list_enable=YES/chroot_list_enable=YES/' /etc/vsftpd/vsftpd.conf #启用例外用户名单
sed -i 's/#chroot_list_file=/chroot_list_file=/' /etc/vsftpd/vsftpd.conf #指定例外用户列表文件,列表中的用户不被锁定在主目录
echo "allow_writeable_chroot=YES" >> /etc/vsftpd/vsftpd.conf
echo "local_root=/var/ftp/test" >> /etc/vsftpd/vsftpd.conf #设置本地用户登录后所在的目录
有的朋友可能对语法不太熟悉。其中sed -i 's/原字符串/新字符串/' 文件名 是替换字符串操作。echo "内容" >> 文件名 是追加写入操作。
被动模式
sed -i 's/anonymous_enable=YES/anonymous_enable=NO/' /etc/vsftpd/vsftpd.conf #禁止匿名登录 FTP 服务器
sed -i 's/listen=NO/listen=YES/' /etc/vsftpd/vsftpd.conf #监听 IPv4 sockets
sed -i 's/listen_ipv6=YES/#listen_ipv6=YES/' /etc/vsftpd/vsftpd.conf #关闭监听 IPv6 sockets
sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd/vsftpd.conf #全部用户被限制在主目录
sed -i 's/#chroot_list_enable=YES/chroot_list_enable=YES/' /etc/vsftpd/vsftpd.conf #启用例外用户名单
sed -i 's/#chroot_list_file=/chroot_list_file=/' /etc/vsftpd/vsftpd.conf #指定例外用户列表文件,列表中的用户不被锁定在主目录
echo "allow_writeable_chroot=YES" >> /etc/vsftpd/vsftpd.conf
echo "local_root=/var/ftp/test" >> /etc/vsftpd/vsftpd.conf #设置本地用户登录后所在的目录
echo "pasv_enable=YES" >> /etc/vsftpd/vsftpd.conf #开启被动模式
echo "pasv_address=<替换为公网IP地址>" >> /etc/vsftpd/vsftpd.conf #公网IP
echo "pasv_min_port=50000" >> /etc/vsftpd/vsftpd.conf #设置被动模式下,建立数据传输可使用的端口范围的最小值
echo "pasv_max_port=60000" >> /etc/vsftpd/vsftpd.conf #设置被动模式下,建立数据传输可使用的端口范围的最大值
需要在防火墙设置,开启50000-60000之间的端口段。
在/etc/vsftpd 目录下创建 chroot_list 文件,并在文件中写入例外用户名单(没有也要创建)。
vim /etc/vsftpd/chroot_list
重启服务
systemctl restart vsftpd.service
后语
不再推荐使用FTP,建议直接使用SFTP免安装。本文仅做为备忘,实验环境为腾讯云服务器。