一、实验拓扑

如下图,三台主机接入同一网络,Net1已配置NAT服务,三台主机之间互通,且均可以访问Internet

Linux配置FTP服务_tls

二、实验规划

主机

主机名

IP地址

操作系统

FTP-Server

ftp-server

172.16.0.100/24

Rocky Linux 8.9 (Green Obsidian)

Win-Client

N/A

172.16.0.10/24

Windows 10 Pro 21H2

Linux-Client

linux-client

172.16.0.20/24

Rocky Linux 8.9 (Green Obsidian)

三、 vsftpd服务程序常用的参数以及作用

参数

作用

listen=[YES|NO]

是否以独立运行的方式监听服务

listen_address=IP地址

设置要监听的IP地址

listen_port=21

设置FTP服务的监听端口

download_enable=[YES|NO]

是否允许下载文件

userlist_enable=[YES|NO]

userlist_deny=[YES|NO]

设置用户列表为“允许”还是“禁止”操作

max_clients=0

最大客户端连接数,0为不限制

max_per_ip=0

同一IP地址的最大连接数,0为不限制

anonymous_enable=[YES|NO]

是否允许匿名用户访问

anon_upload_enable=[YES|NO]

是否允许匿名用户上传文件

anon_umask=022

匿名用户上传文件的umask值

anon_root=/var/ftp

匿名用户的FTP根目录

anon_mkdir_write_enable=[YES|NO]

是否允许匿名用户创建目录

anon_other_write_enable=[YES|NO]

是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)

anon_max_rate=0

匿名用户的最大传输速率(字节/秒),0为不限制

local_enable=[YES|NO]

是否允许本地用户登录FTP

local_umask=022

本地用户上传文件的umask值

local_root=/var/ftp

本地用户的FTP根目录

chroot_local_user=[YES|NO]

是否将用户权限禁锢在FTP目录,以确保安全

local_max_rate=0

本地用户最大传输速率(字节/秒),0为不限制

ssl_enable=[YES|NO]

是否启动 SSL 的支持

allow_anon_ssl=[YES|NO]

是否允许匿名者使用 SSL

force_local_data_ssl=[YES|NO]

是否让本地用户数据传输加密

force_local_logins_ssl=[YES|NO]

是否让本地用户登录时的用户名和密码加密

ssl_tlsv1=[YES|NO]

是否支持 TLS 方式

ssl_sslv2=[YES|NO]

是否支持SSLv2方式

ssl_sslv3=[YES|NO]

是否支持SSLv3方式

rsa_cert_file=/etc/vsftpd/vsftpd.pem

预设 RSA 加密的凭证文件位置

四、匿名访问模式

安装vsftpd软件包

[root@ftp-server ~]# yum -y install vsftpd

备份vsftpd的配置文件

[root@ftp-server ~]# cd /etc/vsftpd
[root@ftp-server vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@ftp-server vsftpd]# mv vsftpd.conf vsftpd.conf.bak
[root@ftp-server vsftpd]# ls
ftpusers  user_list  vsftpd.conf.bak  vsftpd_conf_migrate.sh

过滤出“vsftpd.conf.bak”文件中的非注释行,写回到“vsftpd.conf”文件中

[root@ftp-server vsftpd]# grep -v '^#' vsftpd.conf.bak > vsftpd.conf
[root@ftp-server vsftpd]# ls -l vsftpd.conf*
-rw-r--r--. 1 root root  230 Dec 28 17:34 vsftpd.conf
-rw-------. 1 root root 5039 Apr  7  2023 vsftpd.conf.bak
[root@ftp-server vsftpd]# cat vsftpd.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=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES

修改“vsftpd.conf”文件,添加第2~6行,配置匿名用户:

向匿名用户开放的权限参数以及作用

参数

作用

anonymous_enable=YES

允许匿名访问模式

anon_umask=022

匿名用户上传文件的umask值

anon_upload_enable=YES

允许匿名用户上传文件

anon_mkdir_write_enable=YES

允许匿名用户创建目录

anon_other_write_enable=YES

允许匿名用户修改目录名称或删除目录

[root@ftp-server vsftpd]# vim vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_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

启动vsftpd服务,并加入开机自启

[root@ftp-server vsftpd]# systemctl enable --now vsftpd.service 
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.

下面使用getsebool命令查看与FTP相关的SELinux域策略都有哪些

[root@ftp-server vsftpd]# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

接下来修改该策略规则,并且在设置时使用-P参数让修改过的策略永久生效

[root@ftp-server vsftpd]# setsebool -P ftpd_full_access=on

firewall防火墙放行ftp服务

[root@ftp-server ~]# firewall-cmd --add-service=ftp --permanent 
success
[root@ftp-server ~]# firewall-cmd --reload
success

现在就可以在客户端执行ftp命令连接到远程的FTP服务器了。在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。而且在连接FTP服务器后,默认访问的是/var/ftp目录。可以切换到该目录下的pub目录中,然后尝试创建一个新的目录文件,以检验是否拥有写入权限

[root@linux-client ~]# yum -y install ftp
[root@linux-client ~]# ftp 172.16.0.100
Connected to 172.16.0.100 (172.16.0.100).
220 (vsFTPd 3.0.3)
Name (172.16.0.100:root): anonymous 
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 (172,16,0,100,92,193).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Apr 06  2023 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Create directory operation failed.		#	创建文件失败

修改“/var/ftp/pub”目录的拥有者为“ftp”

[root@ftp-server ~]# chown ftp /var/ftp/pub/
[root@ftp-server ~]# ls -l /var/ftp
total 0
drwxr-xr-x. 2 ftp root 6 Apr  7  2023 pub

再次尝试创建一个新的目录文件

[root@linux-client ~]# ftp 172.16.0.100
Connected to 172.16.0.100 (172.16.0.100).
220 (vsFTPd 3.0.3)
Name (172.16.0.100:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> ls
227 Entering Passive Mode (172,16,0,100,202,24).
150 Here comes the directory listing.
drwxr-xr-x    2 14       50              6 Dec 28 10:05 files
226 Directory send OK.
[root@ftp-server ~]# ls -l /var/ftp
total 0
drwxr-xr-x. 2 ftp root 6 Apr  7  2023 pub
[root@ftp-server ~]# ls -l /var/ftp/pub/
total 0
drwxr-xr-x. 2 ftp ftp 6 Dec 28 18:05 files

文件重命名

ftp> rename files dir1
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (172,16,0,100,90,36).
150 Here comes the directory listing.
drwxr-xr-x    2 14       50              6 Dec 28 10:05 dir1
226 Directory send OK.
ftp>

删除目录

ftp> rmdir dir1
250 Remove directory operation successful.
ftp> ls
227 Entering Passive Mode (172,16,0,100,197,90).
150 Here comes the directory listing.
226 Directory send OK.

上传文件

ftp> put ./.bashrc bashrc
local: ./.bashrc remote: bashrc
227 Entering Passive Mode (172,16,0,100,30,161).
150 Ok to send data.
226 Transfer complete.
176 bytes sent in 0.000139 secs (1266.19 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,16,0,100,224,97).
150 Here comes the directory listing.
-rw-r--r--    1 14       50            176 Dec 28 12:56 bashrc
226 Directory send OK.

下载文件

ftp> get bashrc bashrc_download
local: bashrc_download remote: bashrc
227 Entering Passive Mode (172,16,0,100,226,64).
150 Opening BINARY mode data connection for bashrc (176 bytes).
226 Transfer complete.
176 bytes received in 9.3e-05 secs (1892.47 Kbytes/sec)
ftp> exit
221 Goodbye.
[root@linux-client ~]# ls
anaconda-ks.cfg  bashrc_download  initial-setup-ks.cfg
[root@linux-client ~]#

在Win-Client主机上使用WinSCP软件登录FTP-Server

Linux配置FTP服务_linux_02

Linux配置FTP服务_vsftpd_03

上传文件

Linux配置FTP服务_FTP_04

或直接打开文件资源管理器,在地址栏中输入“ftp://IP”回车,这样也可以访问FTP目录

Linux配置FTP服务_vsftpd_05

五、本地用户模式

在第四节中使用的是匿名访问模式,现在可以将它关了,然后开启本地用户模式,针对本地用户的权限参数以及作用如下表所示:

参数

作用

anonymous_enable=NO

禁止匿名访问模式

local_enable=YES

允许本地用户模式

write_enable=YES

设置可写权限

local_umask=022

本地用户模式创建文件的umask值

userlist_deny=YES

启用“禁止用户名单”,名单文件为ftpusers和user_list

userlist_enable=YES

开启用户作用名单文件功能

配置本地用户的参数

[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.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=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES

重启服务生效

[root@ftp-server ~]# systemctl restart vsftpd.service

按理来讲,现在已经完全可以用本地用户的身份登录FTP服务器了。但是在使用root管理员的身份登录后,系统提示如下的错误信息:

[root@linux-client ~]# ftp 172.16.0.100
Connected to 172.16.0.100 (172.16.0.100).
220 (vsFTPd 3.0.3)
Name (172.16.0.100:root): root
530 Permission denied.
Login failed.
ftp>

可见,在我们输入root管理员的密码之前,就已经被系统拒绝访问了。这是因为vsftpd服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers和user_list)。vsftpd服务程序目录中的这两个文件也有类似的功能,只要里面写有某位用户的名字,就不再允许这位用户登录到FTP服务器上

[root@ftp-server ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@ftp-server ~]# cat /etc/vsftpd/user_list 
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

果然如此!vsftpd服务程序为了保证服务器的安全性而默认禁止了root管理员和大多数系统用户的登录行为,这样可以有效地避免黑客通过FTP服务对root管理员密码进行暴力crack。如果您确认在生产环境中使用root管理员不会对系统安全产生影响,只需按照上面的提示删除掉root用户名即可。也可以选择ftpusers和user_list文件中不存在的一个普通用户尝试登录FTP服务器

删除“/etc/vsftpd/ftpusers”和“/etc/vsftpd/user_list”文件中的root用户,再次尝试使用root用户来登录FTP服务器

[root@linux-client ~]# ftp 172.16.0.100
Connected to 172.16.0.100 (172.16.0.100).
220 (vsFTPd 3.0.3)
Name (172.16.0.100:root): root
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 (172,16,0,100,215,158).
150 Here comes the directory listing.
-rw-------    1 0        0            1082 Nov 29 16:10 anaconda-ks.cfg
-rw-r--r--    1 0        0            1373 Nov 29 16:11 initial-setup-ks.cfg
226 Directory send OK.
ftp> exit
221 Goodbye.

使用本地用户登录FTP服务器,默认进入的是FTP服务器root用户的家目录

[root@ftp-server ~]# ls -l
total 8
-rw-------. 1 root root 1082 Nov 30 00:10 anaconda-ks.cfg
-rw-r--r--. 1 root root 1373 Nov 30 00:11 initial-setup-ks.cfg

注意:为什么同样是禁止用户登录的功能,却要制作两个一模一样的文件呢?

这个小玄机其实就在user_list文件上面。如果把上面主配置文件中userlist_deny的参数值改成NO,那么user_list列表就变成了强制白名单。它的功能与之前完全相反,只允许列表内的用户访问,拒绝其他人的访问。

上传、重命名、下载操作

ftp> put /etc/man_db.conf man_db.conf
local: /etc/man_db.conf remote: man_db.conf
227 Entering Passive Mode (172,16,0,100,190,77).
150 Ok to send data.
226 Transfer complete.
5165 bytes sent in 0.000169 secs (30562.13 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,16,0,100,147,239).
150 Here comes the directory listing.
-rw-------    1 0        0            1082 Nov 29 16:10 anaconda-ks.cfg
-rw-r--r--    1 0        0            1373 Nov 29 16:11 initial-setup-ks.cfg
-rw-r--r--    1 0        0            5165 Dec 28 13:31 man_db.conf
226 Directory send OK.
ftp> rename man_db.conf man_db_put.conf
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (172,16,0,100,80,18).
150 Here comes the directory listing.
-rw-------    1 0        0            1082 Nov 29 16:10 anaconda-ks.cfg
-rw-r--r--    1 0        0            1373 Nov 29 16:11 initial-setup-ks.cfg
-rw-r--r--    1 0        0            5165 Dec 28 13:31 man_db_put.conf
226 Directory send OK.
ftp> get man_db_put.conf man_db_get.conf
local: man_db_get.conf remote: man_db_put.conf
227 Entering Passive Mode (172,16,0,100,242,70).
150 Opening BINARY mode data connection for man_db_put.conf (5165 bytes).
226 Transfer complete.
5165 bytes received in 0.000148 secs (34898.65 Kbytes/sec)
ftp> exit
221 Goodbye.
[root@linux-client ~]# ls
anaconda-ks.cfg  bashrc_download  initial-setup-ks.cfg  man_db_get.conf

六、虚拟用户模式

虚拟用户模式是这3种模式中最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而且这个账号不能用于以SSH方式登录服务器。当然,因为它的安全性较之于前面两种模式有了提升,所以配置流程也会稍微复杂一些

重新安装vsftpd

[root@ftp-server ~]# yum -y remove vsftpd
[root@ftp-server ~]# yum -y install vsftpd

创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。例如,分别创建zhangsan和lisi两个用户,密码均为redhat

[root@ftp-server ~]# cd /etc/vsftpd
[root@ftp-server vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat

由于明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除

[root@ftp-server vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@ftp-server vsftpd]# chmod 600 vuser.db 
[root@ftp-server vsftpd]# rm -f vuser.list

创建vsftpd服务程序用于存储文件的根目录以及用于虚拟用户映射的系统本地用户。vsftpd服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置

由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中。虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限

为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还能够避免黑客通过这个系统本地用户进行登录

[root@ftp-server vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@ftp-server vsftpd]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 78 Dec 28 21:46 /var/ftproot/
[root@ftp-server vsftpd]# chmod -Rf 755 /var/ftproot/
[root@ftp-server vsftpd]# ls -ld /var/ftproot/
drwxr-xr-x. 3 virtual virtual 78 Dec 28 21:46 /var/ftproot/

新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀

[root@ftp-server vsftpd]# vim /etc/pam.d/vsftpd.vu
auth            required        pam_userdb.so db=/etc/vsftpd/vuser
account         required        pam_userdb.so db=/etc/vsftpd/vuser

在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu。PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能

在vsftpd服务程序的主配置文件中默认就带有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的。现在我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可。该操作中用到的参数以及作用如下表所示:

利用PAM文件进行认证时使用的参数以及作用

参数

作用

anonymous_enable=NO

禁止匿名开放模式

local_enable=YES

允许本地用户模式

guest_enable=YES

开启虚拟用户模式

guest_username=virtual

指定虚拟用户账户

pam_service_name=vsftpd.vu

指定PAM文件

allow_writeable_chroot=YES

允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求

[root@ftp-server vsftpd]# mv vsftpd.conf vsftpd.conf.bak
[root@ftp-server vsftpd]# grep -v '^#' vsftpd.conf.bak > vsftpd.conf
[root@ftp-server vsftpd]# vim vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd.vu
userlist_enable=YES

为虚拟用户设置不同的权限。虽然账户zhangsan和lisi都是用于vsftpd服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过vsftpd服务程序来实现。只需新建一个目录,在里面分别创建两个以zhangsan和lisi命名的文件,其中在名为zhangsan的文件中写入允许的相关权限(使用匿名用户的参数)

[root@ftp-server vsftpd]# mkdir /etc/vsftpd/vusers_dir/
[root@ftp-server vsftpd]# cd /etc/vsftpd/vusers_dir/
[root@ftp-server vusers_dir]# touch lisi
[root@ftp-server vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

然后再次修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。为了让修改后的参数立即生效,需要重启vsftpd服务程序并将该服务添加到开机启动项中

[root@ftp-server vusers_dir]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd.vu
userlist_enable=YES
user_config_dir=/etc/vsftpd/vusers_dir		# 添加这一行
[root@ftp-server vusers_dir]# systemctl restart vsftpd.service
[root@ftp-server vusers_dir]# systemctl enable vsftpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.

设置SELinux域允许策略

[root@ftp-server vusers_dir]# setsebool -P ftpd_full_access=on
[root@ftp-server vusers_dir]# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> on
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

此时,不但可以使用虚拟用户模式成功登录到FTP服务器,还可以分别使用账户zhangsan和lisi来检验他们的权限。李四只能登录,没有其他权限

[root@linux-client ~]# ftp 172.16.0.100
Connected to 172.16.0.100 (172.16.0.100).
220 (vsFTPd 3.0.3)
Name (172.16.0.100:root): lisi    
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 (172,16,0,100,242,238).
150 Here comes the directory listing.
226 Directory send OK.
ftp> mkdir dir1
550 Permission denied.
ftp>

而张三不仅可以登录,还可以创建、改名和删除文件,因此张三的权限是满的

[root@linux-client ~]# ftp 172.16.0.100
Connected to 172.16.0.100 (172.16.0.100).
220 (vsFTPd 3.0.3)
Name (172.16.0.100:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/files" created
ftp> rename files dir1
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (172,16,0,100,85,18).
150 Here comes the directory listing.
drwx------    2 1001     1001            6 Dec 28 14:11 dir1
226 Directory send OK.
ftp> rmdir dir1
250 Remove directory operation successful.
ftp> ls
227 Entering Passive Mode (172,16,0,100,153,19).
150 Here comes the directory listing.
226 Directory send OK.
ftp> exit
221 Goodbye.

七、增加SSL加密功能

检查vsftpd有没有支持ssl的模块

[root@ftp-server vusers_dir]# ldd $(which vsftpd) | grep ssl
        libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007fd1ecf18000)

如果有出现 libssl.so 的字样,就是有支持

建立专门给 vsftpd 使用的凭证

[root@ftp-server vusers_dir]# cd /etc/pki/tls/certs
[root@ftp-server certs]# openssl req -x509 -nodes -newkey rsa:2048 -keyout vsftpd.pem -out vsftpd.pem -days 365
Generating a RSA private key
.........................+++++
.............................................................................+++++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Hubei    
Locality Name (eg, city) [Default City]:Wuhan
Organization Name (eg, company) [Default Company Ltd]:      
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ftp-server
Email Address []:lab.example.com
[root@ftp-server certs]# ls
ca-bundle.crt  ca-bundle.trust.crt  vsftpd.pem

拷贝凭证到“/etc/vsftpd/”目录,修改权限

[root@ftp-server certs]# cp -a vsftpd.pem /etc/vsftpd/
[root@ftp-server certs]# cd /etc/vsftpd/
[root@ftp-server vsftpd]# chmod 600 vsftpd.pem

在第六节的基础上继续编辑“/etc/vsftpd/vsftpd.conf”文件添加一些参数

root@ftp-server vsftpd]# vim vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd.vu
userlist_enable=YES
user_config_dir=/etc/vsftpd/vusers_dir

ssl_enable=YES			# 添加以下内容
allow_anon_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
orce_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/vsftpd.pem

重启服务生效

[root@ftp-server vsftpd]# systemctl restart vsftpd.service

在Win-Client上使用“zhangsan”用户名登录FTP服务器

Linux配置FTP服务_tls_06

Linux配置FTP服务_linux_07

Linux配置FTP服务_tls_08

Linux配置FTP服务_linux_09

已建立TLS连接,读取远程目录失败

FTP服务器停止防火墙,再次登录尝试

[root@ftp-server ~]# systemctl stop firewalld

Linux配置FTP服务_tls_10

[root@ftp-server ~]# cd ~virtual
[root@ftp-server ftproot]# ls
新建文件
[root@ftp-server ftproot]# cat 新建文件
123[root@ftp-server ftproot]# 
[root@ftp-server ftproot]#

参阅

第11章 使用Vsftpd服务传输文件 | 《Linux就该这么学》

21.4 让 vsftpd 增加 SSL 的加密功能 · 鸟哥的Linux私房菜 · 看云

CentOS7下vsftpd over SSL/TLS加密传输配置实践_WalkingCloud的技术博客_51CTO博客