Bootstrap

FTP服务基础搭建

环境:两台rockyLinux虚拟机,yum仓库与时钟同步均已配置完成,firewalld与selinux均以关闭;server作为服务器端,client作为客户端。

一、FTP理论

FTP:
文件传输协议(File Transfer Protocol 简称FTP),采用c/s模式工作
控制端口:21
数据端口:20

FTP工作原理:

1、主动模式 standard

FTP客户端从任意一个非特权端口N(N>1024)发送PORT命令给FTP服务端控制端口21,
其中PORT命令包含客户端接收数据的端口N+1,此时服务器收到了这条PORT命令,
它就会让自己的数据端口20与客户端的数据端口N+1连接。此时如果传输数据的话,
就需要服务端与客户端重新建立一个新的连接来传输数据。

2、被动模式 passive

FTP客户端从任意一个非特权端口N(N>1024)发送PASV命令给FTP服务端控制端口21,
其中PASV命令包含客户端接收数据的端口N+1,此时服务端会随机开启一个
高端端口P(P>1024),并发送PORT命令给客户端,PORT命令包括服务端的数据端口P,
然后客户端从数据端口N+1发起一个请求连接服务端数据端口P,这时产生了数据连接。
使用被动模式就不需要服务端与客户端重新建立一个新的连接来传输数据。

相同点:
都是使用21号控制端口进行用户验证和管理。

不同点:
传输数据的连接方式不同:主动模式是服务端向客户端发起数据连接,
而被动模式是客户端向服务端发起数据连接。

二、FTP服务部署与配置

1、server端安装FTP包文件

[root@server ~]# yum -y install vsftpd
[root@server ~]# systemctl restart vsftpd
[root@server ~]# systemctl enable vsftpd   //将FTP服务重启并enable

2、vsftpd配置文件

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

anonymous_enable=NO     ------控制匿名用户访问FTP服务器的权限
local_enable=YES        ---控制FTP用户是否可以访问FTP服务器
write_enable=YES        ----控制FTP用户对FTP服务器的可写权限
local_umask=022         ----FTP用户创建目录或文件时的umask值
#anon_upload_enable=YES       ----控制匿名用户上传文件的权限
#anon_mkdir_write_enable=YES   ---控制匿名用户创建目录的权限
dirmessage_enable=YES          ---显示说明性文件
xferlog_enable=YES           ---控制文件在传输过程中是否被日志记录
connect_from_port_20=YES        ----强制使用20端口进行数据传输
#chown_uploads=YES           --设置为YES时,默认匿名用户上传文件的所有者为FTP
#chown_username=whoever   ---whoever修改为ftp用户,匿名用户上传文件的所有者将变成该FTP用户
#xferlog_file=/var/log/xferlog          ---设置FTP服务日志文件位置
xferlog_std_format=YES        ---设置标准的FTP Xferlog模式
#idle_session_timeout=600    ---控制连接超过600秒空闲时,自动断开连接
#data_connection_timeout=120    ---控制数据连接建立后120秒内无交互时,自动断开连接
#nopriv_user=ftpsecure    ---非特权状态下使用ftpsecure用户
#ftpd_banner=Welcome to blah FTP service.   ---成功连接FTP服务器时的提示语
#deny_email_enable=YES            ---禁止下载文件到指定的邮箱地址中
#banned_email_file=/etc/vsftpd/banned_emails     ---设置电子邮箱地址
#chroot_local_user=YES        ---控制FTP用户能否离开自己的FTP主目录
#chroot_list_enable=YES        ---控制列表中的FTP用户能否离开自己的FTP主目录
#chroot_list_file=/etc/vsftpd/chroot_list    ---FTP用户列表文件,每一行一个用户名
#ls_recurse_enable=YES   ---控制FTP用户是否能使用类似 ls -R命令,
默认是禁止的
listen=NO            ---控制是否侦听ipv4套接字
listen_ipv6=YES   --控制是否侦听ipv6套接字
pam_service_name=vsftpd    ---设置PAM认证文件的名称
userlist_enable=YES         ---控制是否启动/etc/vsftpd/user_list文件
tcp_wrappers=YES    ---控制是否启用/etc/hosts.allow和/etc/hosts.deny配置文件管理网络主机对FTP服务的访问



其中有三条参数是一个组合:
chroot_local_enable=YES时:
chroot_list_enable=YES  代表/etc/vsftpd/chroot_list文件中定义的FTP用户不受限,
其他的ftp用户受限
chroot_list_enable=NO  代表所有的FTP用户受限

chroot_local_enable=NO时:
chroot_list_enable=YES  代表只限制/etc/vsftpd/chroot_list文件中定义的FTP用户
chroot_list_enable=NO  所有的FTP用户均不受限。

3、示例

客户端 client 需要安装lftp包文件

yum -y install lftp
匿名用户示例
  1. 从server服务器端下载文件
    当我们将服务端的vsftpd的配置文件中 anonymous_enable=NO改为YES
[root@client ~]# lftp 192.168.100.111         //以匿名用户身份登陆
lftp 192.168.100.111:~> ls
drwxr-xr-x    2 0        0               6 Oct 30  2023 pub
lftp 192.168.100.111:/pub> ls
-rw-r--r--    1 0        0               0 Jul 23 12:07 file1
lftp 192.168.100.111:/pub> get file1
get: /root/file1: File exists          //默认只允许下载文件,不允许上传
lftp 192.168.100.111:/pub> exit
[root@client ~]# ls
anaconda-ks.cfg  file2
  1. 向server服务器端上传文件
    当想让匿名用户上传文件时,server服务器端配置文件中#anon_upload_enable=NO改为YES
[root@client ~]# lftp 192.168.100.111
lftp 192.168.100.111:~> cd pub/
lftp 192.168.100.111:/pub> put file2
put: Access failed: 553 Could not create file. (file2)    
//此时还是上传不了,是因为server服务器主机里面的 /var/ftp/pub/ 目录普通用户(包含匿名用户)
是没有写入权限(上传文件的权限)

//server主机端
[root@server pub]# setfacl -m u:ftp:rwx /var/ftp/pub/
[root@server pub]# systemctl restart vsftpd

client客户端
lftp 192.168.100.111:/pub> put file2
lftp 192.168.100.111:/pub> ls
-rw-r--r--    1 0        0               0 Jul 23 12:07 file1
-rw-------    1 14       50              0 Jul 23 12:21 file2
//这样就能以普通用户(匿名用户)上传文件了
  1. 远程连接时在FTP服务器端创建目录

想以普通用户的身份在远程连接时创建目录
将#anon_mkdir_write_enable=YES 的 # 去掉

[root@client ~]# lftp 192.168.100.111
lftp 192.168.100.111:~> cd /pub/
lftp 192.168.100.111:/pub> mkdir dir1
mkdir ok, `dir1' created
lftp 192.168.100.111:/pub> ls
drwx------    2 14       50              6 Jul 23 12:29 dir1
-rw-r--r--    1 0        0               0 Jul 23 12:07 file1
-rw-------    1 14       50              0 Jul 23 12:21 file2

  1. 远程链接时删除自己创建的目录
[root@server pub]# vim /etc/vsftpd/vsftpd.conf
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES
anon_other_write_enable=YES   //在这里添加一条信息
[root@server pub]# systemctl restart vsftpd


client客户端
[root@client ~]# lftp 192.168.100.111
lftp 192.168.100.111:~> cd /pub/
lftp 192.168.100.111:/pub> ls
drwx------    2 14       50              6 Jul 23 12:29 dir1
-rw-r--r--    1 0        0               0 Jul 23 12:07 file1
-rw-------    1 14       50              0 Jul 23 12:21 file2
lftp 192.168.100.111:/pub> rm -rf dir1
rm ok, `dir1' removed
lftp 192.168.100.111:/pub> ls
-rw-r--r--    1 0        0               0 Jul 23 12:07 file1
-rw-------    1 14       50              0 Jul 23 12:21 file2

FTP用户示例

作为演示,我在FTP服务端创建三个用户

[root@server ~]# useradd user1
[root@server ~]# useradd user2
[root@server ~]# useradd user3
[root@server ~]# for i in user{1..3}
> do echo redhat | passwd --stdin $i
> done
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
Changing password for user user3.
passwd: all authentication tokens updated successfully.

默认情况下FTP服务本就允许普通用户访问

设置FTP用户访问FTP服务器时,将所有FTP用户访问的目录限制在自己的主目录中,
不允许FTP用户访问其他目录( FTP用户对自己的家目录不能有写入的权限)

[root@server ~]# vim /etc/vsftpd/vsftpd.conf        //FTP服务器端
# the user does not have write access to the top level directory within the
# chroot)
chroot_local_user=YES    //将#删除,禁止所有用户离开自己的家目录
[root@server ~]# systemctl restart vsftpd


[root@client ~]# lftp 192.168.100.111     //client客户端
lftp 192.168.100.111:~> user user1
Password: 
lftp [email protected]:~> cd ..
cd `..' [Sending commands...]       
Interrupt                        
lftp [email protected]:~> ls    //此时ls命令不能用了
Interrupt                          
//inside chroot()从2.3.5之后,vsftpd增强了安全检查,
如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!
如果检查发现还有写权限,就会报该错误

//解决方法:
[root@server ~]# vim /etc/vsftpd/vsftpd.conf     
# Make sure, that one of the listen options is commented !!
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
allow_writeable_chroot=YES    //在末尾加上这句话
[root@server ~]# systemctl restart vsftpd


lftp [email protected]:~> ls    //这样client客户端 就可以正常访问了
-rw-r--r--    1 0        0               0 Jul 23 13:07 file123

设置FTP用户访问FTP服务器时,将部分FTP用户访问的目录限制在自己的主目录中,
其他FTP用户仍然可以访问其他目录。
如果限制user1和user2用户访问的目录限制在自己的家目录中,
user3可以访问其他目录

[root@server ~]# vim /etc/vsftpd/vsftpd.conf
# the user does not have write access to the top level directory within the
# chroot)
#chroot_local_user=YES             //这里加#注释掉
chroot_list_enable=YES             //这里将#删除
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list       //这里将#删除
[root@server ~]# cd /etc/vsftpd/
[root@server vsftpd]# ls                     //这里面没有chroot_list文件
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@server vsftpd]# vim chroot_list         创建并写入
//在里面写入
user1
user2
[root@server vsftpd]# !sys
systemctl restart vsftpd


lftp [email protected]:/> cd ..
lftp [email protected]:/> ls                 //user1只能在自己的家目录
-rw-r--r--    1 0        0               0 Jul 23 13:07 file123
lftp [email protected]:/> user user2
Password: 
lftp [email protected]:/> cd ..
lftp [email protected]:/> ls            //user2也只能在家目录
Interrupt                                   //这里是因为user2家目录里没有任何文件
lftp [email protected]:/> user user3
Password: 
lftp [email protected]:~> cd /           //user3就能离开自己的家目录
cd ok, cwd=/                  
lftp [email protected]:/> ls    
dr-xr-xr-x    2 0        0               6 May 16  2022 afs
lrwxrwxrwx    1 0        0               7 May 16  2022 bin -> usr/bin
dr-xr-xr-x    5 0        0            4096 Jul 10 11:29 boot
drwxr-xr-x   19 0        0            3260 Jul 23 07:53 dev
drwxr-xr-x   78 0        0            8192 Jul 23 12:41 etc
drwxr-xr-x    6 0        0              55 Jul 23 12:40 home
lrwxrwxrwx    1 0        0               7 May 16  2022 lib -> usr/lib
lrwxrwxrwx    1 0        0               9 May 16  2022 lib64 -> usr/lib64
drwxr-xr-x    2 0        0               6 May 16  2022 media
drwxr-xr-x    2 0        0               6 May 16  2022 mnt
drwxr-xr-x    2 0        0               6 May 16  2022 opt
dr-xr-xr-x  201 0        0               0 Jul 23 07:53 proc
dr-xr-x---    3 0        0             179 Jul 23 13:14 root
drwxr-xr-x   22 0        0             640 Jul 23 07:53 run
lrwxrwxrwx    1 0        0               8 May 16  2022 sbin -> usr/sbin
drwxr-xr-x    2 0        0               6 May 16  2022 srv
dr-xr-xr-x   13 0        0               0 Jul 23 07:53 sys
drwxrwxrwt    4 0        0             175 Jul 23 13:09 tmp
drwxr-xr-x   12 0        0             144 Jul 10 11:27 usr
drwxr-xr-x   19 0        0            4096 Jul 10 11:31 var
lftp [email protected]:/> 

这三个参数是这样是,chroot_list文件里面的用户就是不允许离开自己的家目录

#chroot_local_user=YES             
chroot_list_enable=YES             
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list       

当这三个参数全部启用时,chroot_list文件里面的用户就变为仅允许离开自己的家目录

chroot_local_user=YES             
chroot_list_enable=YES             
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list       
;