Linux的FTP的深度学习

Posted 灞波儿奔丶丶丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的FTP的深度学习相关的知识,希望对你有一定的参考价值。

FTP协议介绍:

        FTP协议是一种文件传输协议,作用在应用层,功能是实现服务器和客户端之间进行的文件传输(C/S架构)。传输时使用的是TCP连接的明文传输(命令通道,数据流通道)。FTP协议需要两次TCP握手操作,才能进行连接。

        命令通道:客户端会随机获取一个大于1024以上的端口来与FTP服务器端的21号端口来进行连接,这个过程需要三次握手。实现连接后客户端便可以通过这个连接来对FTP服务器执行命令,查询文件名、下载、上传等命令都是利用这个通道来执行的。

而FTP有两种传输方式:

  • 服务器主动的post模式
  • 服务器被动的pasv模式

FTP工作方式:

  • POST模式:

通知FTP服务器端使用主动连接且告知连接的端口号

        FTP服务器的端口21号主要用在命令通道的执行。客户端在需要数据的情况下,会告知服务器端要用什么方式来连接,如果是主动连接,客户端会先随机启用一个端口,且通过命令通道告知FTP服务器这两个信息,并等待FTP服务器的连接。

FTP服务器主动向客户端连接

        FTP服务器由命令通道了解客户端的需求后,会主动地由port 20向客户端的数据端口连接,这个连接也会经过三次握手。此时FTP的客户端与服务器端会建立两个通道连接,分别用在命令通道与数据通道。而默认FTP服务器端使用的主动连接端口就是port 20。

        数据传输通道是在有数据传输的行为时才会建立的通道,并不是一开始连接到FTP服务器就立刻建立的通道。

port 21主要接收来自客户端的主动连接,port 20则为FTP服务器主动连接至客户端。

  • PASV模式:

客户端选择被动式连接模式

客户端通过命令通道发出被动式连接要求,并等待服务器的回应。

FTP服务器启动数据端口,并通知客户端连接

        FTP服务器能够处理被动式连接,此时FTP服务器会先启动一个监听端口。这个端口号码可以是随机的,也可以自定义某一范围的端口。然后FTP服务器会通过命令通道port21告知客户端这个已经启动的端口port pasv,并等待客户端的连接。

客户端随机取用大于1024的端口进行连接

然后客户端会随机取用一个大于1024的端口号来进行对主机的port pasv连接。如果一切都没有问题的话,那么FTP数据就可以通过客户端的随机端口和服务端的port pasv来传送了。

FTP在Linux的配置:

 linux上安装ftp组件:

//vsftpd版本的ftp虽然功能少但是安全
[root@localhost ~]# yum install  vsftpd -y

//配置文件/etc/vsftpd/vsftpd.conf 

//下载时产生的文件
[root@lxb ~]# rpm  -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf


//此时会产生几个配置文件:
[root@localhost vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

//vsftpd.conf为主配置文件

//user_list的生效与vsftpd.conf内的userlist_enable和userlist_deny配置有关

//userlist_enable=YES  是否借助vsftpd的阻挡机制来处理某些不受欢迎的账号

 

FTP的主配置文件内容:

  • ①匿名登录:

//FTP支持三种登录方式:匿名用户,用户用户,虚拟用户
[root@localhost vsftpd]# vim vsftpd.conf 

//匿名用户配置

//匿名登录配置
anonymous_enable=YES/NO             是否允许匿名用户登录vsftpd主机
no_anon_password=YES/NO             匿名登入时,是否询问密码
ftp_username=ftp                    定义匿名登入的使用者名称

//匿名用户操作配置
anon_upload_enable=YES/NO           是否允许匿名用户上传文件
anon_world_readable_only=YES/NO     是否允许匿名登入者下载可阅读的档案
anon_mkdir_write_enable=YES/NO      是否允许匿名登入者有新增目录的权限

//匿名用户权限配置
anon_other_write_enable=YES/NO      是否允许匿名登入者删除或者重命名
chown_uploads=YES/NO                是否改变匿名用户上传文件(非目录)的属主
chown_username=username             匿名用户上传文件(非目录)的属主名
anon_umask=077                      匿名登入者新增或上传档案时的umask 值
write_enable=YES/NO                 是否允许登陆用户有写权限。属于全局设置,默认值为YES

//登录目录权限
anon_root=/var/ftp                  !!!使用匿名登入时,所登入的目录,默认值为/var/ftp
//注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限。 

//匿名登录要求:

deny_email_enable=YES/NO            
//使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入
banned_email_file=/etc/vsftpd/banner_emails
//此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案
  • ②用户登录

//本地用户设置

local_enable=YES/NO          是否允许本地用户登入
local_root=/home/username    本地用户登入的默认目录
write_enable=YES/NO          是否允许登陆用户有写权限
local_umask=022              本地用户新增档案时的umask值
file_open_mode=0755          本地用户上传档案后的档案权限,与chmod所使用的数值相同
  • ③虚拟登录 

  • 虚拟用户的配置

虚拟用户配置在 /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=lxb
virtual_use_local_privs=YES 
pam_service_name=ftppam

//virtual_use_local_privs=YES
//表示本地虚拟用户特权开启表示和本地用户访问时的权限一样,如果为NO表示虚拟用户和匿名用户是相同的权限

//pam_service_name= ftppam
//设置PAM认证模块名称为 ftppam
  • 虚拟用户登录文件创建

//在etc/vsftpd下创建一个文件来存放虚拟登录文件
[root@localhost vsftpd]# vim vitualuserlist

vuser1
vuser1
vuser2
vuser2
  • 虚拟用户文件转化为数据库

//此时将vuserlist的文件转化为数据库文件vitualuserlist.ab
db_load -T -t hash -f /etc/vsftpd/vitualuserlist vitualuserlist.ab

//此时查看是否产生vuserlist.db这个文件
[root@localhost vsftpd]# ls
1                 ftpusers  user_list    vsftpd_conf_migrate.sh  vitualuserlist.db
chroot_list_file  message   vsftpd.conf  vitualuserlist
  • 配置虚拟用户的PAM项

//此时进入/etc/pam.d目录中,查看是否存在ftppam这个文件(前面配置的)
//此时配置 ftppam

[root@localhost pam.d]# vim ftppam 

auth  required  pam_userdb.so db=/etc/vsftpd/vitualuserlist
account required pam_userdb.so db=/etc/vsftpd/vitualuserlist

//auth             对用户的身份识别
//account          对账户的属性检查
//required         一票否决,必须验证成功才能登陆
//pam_userdb.so    具体使用模块
//db               参数
  • ④其他项配置

  • 欢迎语设置

dirmessage_enable=YES/NO         是否设置欢迎语
message_file=.messag             
            设置目录消息文件,可将要显示的信息写入该文件(默认为.messag )
banner_file=/etc/vsftpd/banner   当使用者登入时,会显示此设定所在的档案内容
ftpd_banner=  XXX                欢迎语句
//banner_file是档案的形式,而ftpd_banner 则是字符串的形式
  • 控制用户是否允许切换到上级目录 

配置这个权限时,需要注意写allow_writeable_chroot=YES,否则未在文件的用户无法登陆

  1.  当chroot_list_enable=YESchroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录未在文件中列出的用户,不能切换到其他目录
  2. chroot_list_enable=YESchroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录未在文件中列出的用户,可以切换到其他目录
  3. chroot_list_enable=NOchroot_local_user=YES时,所有的用户不能切换到其他目录
  4. chroot_list_enable=NOchroot_local_user=NO时,所有的用户可以切换到其他目录
//在默认配置下,本地用户登入FTP后可以使用cd命令切换到其他目录

allow_writeable_enable=YES                    
//启用allow_writeable_enable, 不然卸载chroot中的用户无法登录

chroot_list_file=/etc/vsftpd.chroot_list
//用于指定用户列表文件,控制哪些用户可以切换到用户家目录的上级目录

chroot_local_user=YES/NO
//用于指定用户列表文件中的用户是否允许切换到上级目录

chroot_list_enable=YES/NO
//设置是否启用chroot_list_file配置项指定的用户列表文件
  • 数据传输模式设置

FTP在传输数据时,可以使用二进制方式,也可以使用ASCII模式来上传或下载数据。

设置是否启用ASCII 模式上传数据,默认值为NO
    ascii_upload_enable=YES/NO
设置是否启用ASCII 模式下载数据,默认值为NO
    ascii_download_enable=YES/NO
  • 访问控制设置

两种控制方式:一种控制主机访问,另一种控制用户访问。

控制主机访问

设置vsftpd是否与tcpwrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。这两个文件可以起到简易的防火墙功能。

比如:若要仅允许192.168.220.1—192.168.220.255用户可以连接FTP服务器,则在/etc/hosts.allow文件中添加以下内容:

vsftpd:192.168.220. :allow
all:all :deny

控制用户访问

对于用户的访问控制可以通过/etc目录下的vsftpd.user_list和ftpusers文件来实现。

控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行

userlist_file=/etc/vsftpd.user_list

是否启用vsftpd.user_list文件

userlist_enable=YES/NO   --- 默认为no

决定vsftpd.user_list文件中的用户是否能够访问FTP服务器。若设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP,若设置为NO,则只有vsftpd.user_list文件中的用户才能访问FTP。

userlist_deny=YES/NO   --- 默认为yes

/etc/vsftpd/ftpusers文件专门用于定义不允许访问FTP服务器的用户列表(注意:如果userlist_enable=YES,userlist_deny=NO,此时如果在vsftpd.user_list和ftpusers中都有某个用户时,那么这个用户是不能够访问FTP的,即ftpusers的优先级要高)。默认情况下vsftpd.user_list和ftpusers,这两个文件已经预设置了一些不允许访问FTP服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。

  • 访问速率设置

设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度,默认值为0
    anon_max_rate=0
本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度,预设值为0
    local_max_rate=0
  • 超时时间设置

设置建立FTP连接的超时时间,单位为秒。默认值为60
    accept_timeout=60**
PORT 方式下建立数据连接的超时时间,单位为秒。默认值为60
    connect_timeout=60
设置建立FTP数据连接的超时时间,单位为秒。默认值为120
    data_connection_timeout=120
设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒,默认值为300
    idle_session_timeout=300
  • 日志文件设置

//总开关为
    xferlog_enable= YES/NO

是否启用上传/下载日志记录,如果启用,则上传与下载的信息将被完整纪录在xferlog_file 所定义的档案中,默认开启
    xferlog_enable= YES/NO
设置日志文件名和路径,默认值为/var/log/vsftpd.log
    xferlog_file=/var/log/vsftpd.log
如果启用,则日志文件将会写成xferlog的标准格式,如同wu-ftpd 一般,默认值为no
    xferlog_std_format=YES/NO
如果启用此选项,所有的FTP请求和响应都会被记录到日志中,默认日志文件在/var/log/vsftpd.log。启用此选项时,xferlog_std_format不能被激活。这个选项有助于调试,默认值为NO
    log_ftp_protocol=YES/NO    
  • 定义用户配置文件

在vsftpd中,可以通过定义用户配置文件来实现不同的用户使用不同的配置。
    user_config_dir=/etc/vsftpd/userconf
设置用户配置文件所在的目录。当设置了该配置项后,用户登陆服务器后,系统就会到/etc/vsftpd/userconf目录下,读取与当前用户名相同的文件,并根据文件中的配置命令,对当前用户进行更进一步的配置。
​
    例如:定义user_config_dir=/etc/vsftpd/userconf,且主机上有使用者 test1,test2,那么我们就在user_config_dir 的目录新增文件名为test1和test2两个文件。若是test1登入,则会读取user_config_dir 下的test1这个档案内的设定。默认值为无。利用用户配置文件,可以实现对不同用户进行访问速度的控制,在各用户配置文件中定义local_max_rate=XX,
即可。
举例:
配置项: user_config_dir=/etc/vsftpd/config
​
cat /etc/vsftpd/config/admini 
anon_world_readable_only=NO                     //关闭只可读
anon_upload_enable=YES                          //允许上传
anon_mkdir_write_enable=YES                     //允许新建目录
anon_other_write_enable=YES                     //允许修改目录/文件名称,删除
local_root=/var/www/ruibiaofangxuan/home        //家目录映射
    
cat /etc/vsftpd/config/ruibiaofangxuan 
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_root=/var/www/ruibiaofangxuan/home
  • FTP的工作方式与端口设置

FTP有两种工作方式:PORT FTP(主动模式)和PASV FTP(被动模式)

    设置FTP服务器建立连接所监听的端口,默认值为21
        listen_port=21
    指定FTP使用20端口进行数据传输,默认值为YES
        connect_from_port_20=YES/NO
    设置在PORT方式下,FTP数据连接使用的端口,默认值为20
        ftp_data_port=20

若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式
    pasv_enable=YES/NO(YES)

在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0
    pasv_max_port=0
在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0
    pasv_min_port=0
  • 与连接相关的设置

设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,
此时listen必须设置为YES,此为默认值。
建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。
若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd服务的管控,功能上会受到限制。
    listen=YES/NO(YES)

设置vsftpd允许的最大连接数,默认值为0,表示不受限制。若设置为100时,则同时允许有100个连接,超出的将被拒绝。只有在standalone模式运行才有效。
    max_clients=0
设置每个IP允许与FTP服务器同时建立连接的数目。默认值为0,表示不受限制。只有在standalone模式运行才有效。
    max_per_ip=0
设置FTP服务器在指定的IP地址上侦听用户的FTP请求。若不设置,则对服务器绑定的所有IP地址进行侦听。只有在standalone模式运行才有效。
    listen_address=IP地址
设置每个与FTP服务器的连接,是否以不同的进程表现出来。默认值为NO,此时使用ps aux |grep ftp只会有一个vsftpd的进程。若设置为YES,则每个连接都会有一个vsftpd的进程。
    setproctitle_enable=YES/NO(NO)
  • 其他设置

设置在执行ls –la之类的命令时,是显示UID、GID还是显示出具体的用户名和组名
默认值为NO,即以UID和GID方式显示。若希望显示用户名和组名,则设置为YES
    text_userdb_names= YES/NO
    此功能,则允许登入者使用ls –R(可以查看当前目录下子目录中的文件)这个指令,默认值为NO
    ls_recurse_enable=YES/NO
    此功能,所有档案的拥有者与群组都为ftp,也就是使用者登入使用ls -al之类的指令,所看到的档案拥有者跟群组均为ftp。默认值为no
    hide_ids=YES/NO
如果设置为NO,所有的文件都不能下载到本地,文件夹不受影响,默认值为YES
    download_enable=YES/NO

配置匿名用户登录:

[root@lxb vsftpd]# vim vsftpd.conf 
anonymous_enable=yes
no_anon_password=no
ftp_username=ftp

//设置允许匿名登录,免密,登录id为ftp
//此时在cmd命令下,显示可以匿名登录,此时只能输入ftp才行做到免密登录
//此时可以发现匿名登录没有删除和创建权限

 

而想要设置下载权限,则需要在/etc/vsftpd/vsftpd.conf 进行修改
[root@lxb vsftpd]# vim vsftpd.conf 

anon_mkdir_write_enable=yes
//设置虚拟用户可以下载功能

anon_upload_enable=YES          
//设置匿名用户上传文件

anon_mkdir_write_enable=YES      
//设置匿名登入者有新增目录的权限

anon_other_write_enable=YES
//设置匿名登入者删除或者重命名

//
chown_uploads=YES/NO                是否改变匿名用户上传文件(非目录)的属主
chown_username=ftp                  匿名用户上传文件(非目录)的属主名


!!!文件创建需要在虚拟机上存在O的权限
ftp> mkdir ftp_client
550 Create directory operation failed.
ftp> mkdir ftp_client
257 "/ftp_client" created
ftp> delete hello
250 Delete operation successful.
ftp> quit
221 Goodbye.


//在虚拟机上
[root@lxb ftp]# ll
总用量 0
drwx------. 2 ftp  ftp  6 12月 24 22:40 ftp_client
drwxr-xr-x. 2 root root 6 4月  22 2021 pub

//文件的用户和组为ftp

配置真实用户登录:

//配置用户登录(此时需要关闭匿名登录权限)
[root@lxb ~]# vim /etc/vsftpd/vsftpd.conf 
# 本地登录
local_enable=YES
write_enable=yes
allow_writeable_chroot=no

//此时重启服务,发现需要使用本机存在的用户,又发现此时可以上下切换文件夹
//不同于匿名用户,此时可以切换文件夹
C:\\Users\\14202>ftp 192.168.220.234
连接到 192.168.220.234。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.220.234:(none)): lxb
331 Please specify the password.
密码:
230 Login successful.
ftp> cd ..
250 Directory successfully changed.
ftp> cd ..
250 Directory successfully changed.
ftp> cd ..
250 Directory successfully changed.
ftp> pwd
257 "/" is the current directory
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
bin
boot
dev
etc
haha.crt
hehe.key
home
index.html
lib
lib64
media
mima
mnt
nfs
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
www
226 Directory send OK.
ftp: 收到 155 字节,用时 0.04秒 3.60千字节/秒。
ftp>

如果需要设置切换文件夹权限,则需要设置chroot_list_enablechroot_local_user

此时要注意的是,设置切换目录权限时,allow_writeable_chroot=YES  ,如果写该项,且chroot的三个重要文件去掉注释,则未写在chroot_list文件的用户无法登录!!!

//配置chroot权限
[root@localhost vsftpd]# vim vsftpd.conf 
allow_writeable_chroot=yes 
chroot_local_user=yes
chroot_list_enable=yes
chroot_list_file=/etc/vsftpd/chroot_list_file

//然后配置chroot_list_file的用户
[root@localhost vsftpd]# cat chroot_list_file 
lxb

//此时创建一个新用户
[root@localhost home]# useradd nihao
[root@localhost home]# echo "123" | passwd --stdin nihao
Changing password for user nihao.
passwd: all authentication tokens updated successfully.

//启动默认上级后,虚拟用户无法访问其他目录
C:\\Users\\14202>ftp 192.168.220.134
连接到 192.168.220.134。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.220.134:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/" is the current directory
ftp> cd /home
550 Failed to change directory.
ftp> quit
221 Goodbye.



//重新登陆lxb和nihao用户
C:\\Users\\14202>ftp 192.168.220.134
连接到 192.168.220.134。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.220.134:(none)): lxb
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/home/lxb" is the current directory
ftp> cd /
250 Directory successfully changed.
ftp> pwd
257 "/" is the current directory
ftp> quit
221 Goodbye.

C:\\Users\\14202>ftp 192.168.220.134
连接到 192.168.220.134。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.220.134:(none)): nihao
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/" is the current directory
ftp> cd home
550 Failed to change directory.
ftp>

//发现lxb用户可以自由切换目录,而nihao用户无法自由切换

配置虚拟用户登录:

//配置虚拟登录权限(登录用户为lxb,需要是本地的用户)
[root@localhost vsftpd]# vim vsftpd.conf 
#匿名登录
guest_enable=yes
guest_username=lxb
virtual_use_local_privs=yes
pam_service_name=ftppam
    
//配置的pam权限的文件名字叫ftppam

//此时去配置匿名用户
[root@localhost vsftpd]# cat vuserlist
vuser1   //用户1
vuser1   //密码1
vuser2   //用户2
vuser2   //密码2

//然后把vuserlist转化为数据库文件
[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuserlist vuserlist.ab

//然后去配置pam权限
[root@localhost ~]# cd /etc/pam.d/
[root@localhost pam.d]# cat ftppam 
auth  required  pam_userdb.so db=/etc/vsftpd/vuserlist
account required pam_userdb.so db=/etc/vsftpd/vuserlist

//重启服务,并使用虚拟用户

C:\\Users\\14202>ftp 192.168.220.134
连接到 192.168.220.134。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.220.134:(none)): vuser1
331 Please specify the password.
密码:
230 Login successful.
ftp> quit

以上是关于Linux的FTP的深度学习的主要内容,如果未能解决你的问题,请参考以下文章

linux架构学习第二十八天之FTP协议以及vsftpd的使用

Linux学习笔记之十————Linux常用服务器构建之ftp服务器

学习Linux课程第十三天

Linux学习-FTP

linux基础学习13

Linux中FTP的一点理解