文件共享-FTP

FTP:是文件传输协议(File  Transfer  Protocol)的缩写。用来实现文件的上传(upload)和下载(download)。工作在C/S架构模式下。


C/S架构:是客户端Client/服务器server访问模式。C/S的特点是客户机必须使用专用的客户端程序去访问服务器。

B/S架构:是浏览器Browser、服务器Server访问模式。B/S的特点是客户机只需用IE、Firefox等浏览器来访问服务器。B/S架构通常是用来开发基于web网站的应用程序。


FTP的工作端口:

21  控制端口,用于在客户机和服务器之间建立连接。

20  数据端口。用于服务器给客户机主动进行数据连接。

网络服务端口号的作用:用来标示服务器上的不同业务(服务)。


ftp的工作模式:主动port、被动passive模式

ftp主动(port)模式工作过程:

1.客户机和服务器建立连接关系(登录): 客户机(>1024的随机端口号)  <---->   服务器 21号port

2.双方建立数据连接关系,传输数据:客户机(>1024的随机port) <---->   服务器 20号port


ftp被动(pasv)模式工作过程:

1.客户机和服务器建立连接关系(登录): 客户机(>1024的随机端口号)  <---->   服务器 21号port

2.双方建立数据连接关系,传输数据:客户机(>1024的随机port) <---->   服务器(>1024的随机port)

说明:当ftp服务器上有防火墙时,通常客户机是以被动模式去访问ftp服务器的。在ftp服务器的vsftpd.conf和防火墙上要指定放行的被动模式端口范围的最小值和最大值。

vsftpd.conf 的被动模式端口范围:

  pasv_min_port=5000

  pasv_max_port=6000


ftp服务端软件ftp客户端软件
vsftpdftp
lftp

三类用户

本地用户:服务器上存在的用户,访问的是用户自己的家目录(如han用户访问的是/home/han目录)

匿名用户:匿名用户实际上有一个与之对应的系统用户 ftp这个用户默认是匿名用户所对应的用户,匿名用户映射为ftp用户,匿名用户访问的是/var/ftp目录

虚拟用户:是FTP专有用户,有两种方式实现虚拟用户,本地数据文件和数据库服务器


部署思路:(网络服务的部署通用思路)

1.关闭防火墙和selinux安全功能,并查状态:

  systemctl   stop   firewalld    ;   setenforce  0

  systemctl   status   firewalld   ;   getenforce

2.查软件是否已安装,如果未安装就安装软件。

3.启动服务,并允许开机自动启动

4.设置共享目录,重新加载设置。

5.做本地(内测)访问测试,做异地(公测)访问测试。


实验环境:以centos 7.6 系统做服务器端IP为192.168.11.11

客户端IP为192.168.11.12/1


服务器端:vsftpd {非常安全的ftp守护进程(Very  secure  ftp  Daemon)}

解释:

进程:正在进行(运行running)的程序。

守护进程Daemon:网络服务类的程序都会有守护进程。守护进程是指实时监测服务访问状态的程序。通常都是在系统后台运行。


vsftpd部署流程:

一、关闭防火墙和selinux安全功能,并查状态:

  systemctl  stop  firewalld    ;  setenforce  0

  systemctl  status  firewalld   ;  getenforce

Linux文件共享之FTP_共享


二、查软件是否安装未安装则安装

查是否已安装:rpm  -q  vsftpd  ftp  lftp

安装:yum  install  -y  vsftpd  ftp  lftp

查软件的文件列表:rpm  -ql  vsftpd 

查配置文件列表:rpm  -qc  vsftpd 

Linux文件共享之FTP_文件_02


三、启动服务并设置为开机自启动

重启动服务:systemctl  restart  vsftpd 

允许开启自动启动:systemctl  enable  vsftpd 

查服务状态:systemctl  status  vsftpd 

Linux文件共享之FTP_linux_03


四、共享需要的文件或目录:

vsftpd的默认共享目录:

匿名用户(ftp或anonymous)共享:/var/ftp目录

普通用户:访问的是普通用户自己的家目录,通常是"/home/用户名"文件夹

       注意:root用户默认不能登录vsftpd服务器来访问共享,因为root账号默认在黑名单里。


五、做内测和公测访问测试:以普通用户han为例

内测:ftp  127.0.0.1  回车---》用户名han回车--->输入密码回车-->看到successful表示登录成功

    lftp  192.168.11.11  -u   han,0   ( 逗号后han用户的密码 )

Linux文件共享之FTP_共享 _04


公测:win7/10访问vsftpd共享:win+E-->ftp://han:0@192.168.11.11

Linux文件共享之FTP_共享 _05


ftp和lftp客户端程序的操作功能:

ftp命令:

用法:ftp   [选项]   主机名或IP地址

练习:用tom用户登录到ftp 192.168.11.11服务器上,执行如下的ftp内部命令。


ftp的内部操作命令:

help或?     显示命令帮助

pwd        显示远程工作目录路径

ls         显示远程文件名列表

!本地命令    执行客户机本地的操作命令,如!date   、  !ls

lcd        切换或查询本地(local)路径,如 lcd  /etc   、 lcd   /opt

cd         切换远程网络资源路径

put        上传单个本地当前目录下的文件到远程服务器的的当前工作目录下.如put  group

mput        上传多个本地当前目录下的文件到(同上),如 mput  hosts*

get        下载单个文件到当前的本地工作目录下,如 get  group

mget       下载多(multi)个文件到当前的本地工作目录下,如 mget  host*

注意:put、mput、get、mget操作只用对本地当前工作目录中的文件操作。

prompt      关闭或开启交互式模式,即是否提示yes、no

verbose     开启或关闭执行过程进度

delete      删除服务器上的单个文件

mdelete     删除服务器上的多个文件,如 mdelete  hosts*

mkdir      在共享目录中新建目录,如 mkdir  haha

rmdir      在共享目录中删除目录,如 rmdir  haha

passive     关闭或开启ftp的被动数据传输模式

user       切换用户登录账号

rename      修改共享目录中的文件名


lftp命令:

用法:ftp   [选项]   主机名或IP地址

例:lftp  192.168.11.11  -u  tom,0

说明:-u  是指定用户名和密码,两者间用逗号分隔


练习:用tom用户登录到ftp 192.168.11.11服务器上,执行如下的ftp内部命令。

  lftp  192.168.11.11  -u  tom,0


lftp的内部操作命令:

help或?     显示命令帮助

pwd        显示远程工作目录路径

ls         显示远程文件名列表

!本地命令    执行客户机本地的操作命令,如!date   、  !ls

lcd         切换或查询本地(local)路径,如 lcd  /etc   、 lcd   /opt

cd         切换远程网络资源路径

put        上传单个本地当前目录下的文件到远程服务器的的当前工作目录下.如put  /etc/group

mput        上传多个本地当前目录下的文件到(同上),如 mput  /etc/host*

get        下载单个文件到当前的本地工作目录下,如 get  group

mget        下载多(multi)个文件到当前的本地工作目录下,如 mget  host*

mirror      下载共享目录中当前的所有文件到本地的当前目录下

mrm        删除共享目录中的多个文件,mrm删目录需要用-r选项,如 mrm  host*

注意:put、mput、get、mget操作可用绝对路径。



vsftpd 配置文件(查:rpm  -qc  vsftpd)详解:

/etc/logrotate.d/vsftpd    日志轮滚策略文件

/etc/pam.d/vsftpd        pam认证文件(重点)

/etc/vsftpd/ftpusers      黑名单文件(重点)

/etc/vsftpd/user_list      用户访问列表文件(重点),默认是黑名单,但是可以设置成白名单

/etc/vsftpd/vsftpd.conf    服务的主配置文件(重点)


查看并熟悉vsftpd.conf主配置文件中的默认设置。查看时不包含#开头(^#)的、空白行(^$),要求显示行号。

grep  -nEv  '^#|^$'  /etc/vsftpd/vsftpd.conf     内容如下(共13行)

12:anonymous_enable=YES        允许匿名访问共享

16:local_enable=YES          允许本地普通用户(是指用useradd创建的用户)访问共享

19:write_enable=YES          允许写操作,即可写权限

23:local_umask=022           本地用户的umask值

37:dirmessage_enable=YES       允许显示目录信息

40:xferlog_enable=YES         允许xferlog日志,xferlog文件路径是/var/log/xferlog文件,仅记录文件的上传和下载日志

43:connect_from_port_20=YES     启用20号端口的连接(data数据端口)

57:xferlog_std_format=YES       启用xferlog标准(std是standard)格式的日志

115:listen=NO               不启用ipv4监听

124:listen_ipv6=YES           启用IPV6监听,会向下兼容ipv4

126:pam_service_name=vsftpd      vsftpd的pam用户认证服务文件,是/etc/pam.d/vsftpd文件

127:userlist_enable=YES        启用user_list用户列表文件

128:tcp_wrappers=YES          启用tcp_wrappers防火墙功能,用来做基于IP的TCP访问控制

Linux文件共享之FTP_共享 _06


vsftpd.conf的其他配置选项:man  vsftpd.conf

48 #chown_uploads=YES           允许修改上传后的文件的属主和属组

49 #chown_username=whoever        文件的属主、属组修改成当前访问共享的用户

53 #xferlog_file=/var/log/xferlog   指定xferlog日志文件名及其路径,当xferlog_enable为YES时,此项默认为启用

60 #idle_session_timeout=600      (重点)空闲会话超时为600秒(即10分钟),默认开启了,时间是300秒

idle空闲会话超时时间是指用户登录到ftp服务后,n秒都没执行操作,服务器自动将此用户断开连接。(防止客户机占用服务器网络资源)

63 #data_connection_timeout=120    (重点)数据连接超时时间为120秒,默认开启了,时间是300秒

data_connection超时时间是指当客户端下载或上传文件时,由于网络不稳定,当数据掉线时间超过120秒,文件就下载或上传失败。(防止客户机占用服务器网络资源)

67 #nopriv_user=ftpsecure

72 #async_abor_enable=YES        允许异步方式传输数据

83 #ascii_upload_enable=YES       允许以ascii编码方式上传文件,默认为NO,是以binary二进制方式上传

84 #ascii_download_enable=YES      允许以ascii编码方式下载文件,默认为NO,是以binary二进制方式下载

87 #ftpd_banner=Welcome to blah FTP service.   (重点)自定义banner欢迎提示语(标语)(用于打广告)

banner_file=/etc/vsftpd/banner.txt     (重点)自定义banner标语文件(用于打广告)

91 #deny_email_enable=YES   

93 #banned_email_file=/etc/vsftpd/banned_emails


local_max_rate=0      本地用户(普通用户)最大传输速度,0是不限速。单位是byte字节

anon_max_rate=0       匿名用户最大传输速度,0是不限速。单位是byte字节

anon_other_write_enable=YES  允许匿名用户执行除了新建和上传外的其他权限,如删除、改名。


listen_port=21       监听21号端口(默认开启)

pasv_enable=YES     启用pasv被动模式

pasv_min_port=5000 指定pasv被动模式的最小端口号

pasv_max_port=6000 指定pasv被动模式的最大端口号

dual_log_enable=YES    启用/var/log/xferlog 和 /var/log/vsftpd.log 双日志文件(默认关闭)

max_per_ip=数字      单个IP的最大并发量(即单个客户端IP能同时登录的数量),同时下载几个文件

max_clients=数字      最大客户端数量(即并发量),即允许有多少个IP的客户端同时访问服务器

user_config_dir=/etc/vsftpd/userconf  定义用户个人配置文件所在目录。定义了这句之后,就要在userconf目录中创建以用户名命名的文件,这就是这个用户的配置文件。其中加入一条local_root=/home/ftp为指定用户登录目录。

setproctitle_enable=YES   将所有连接以不同的进程体现出来


vsftpd.conf默认设置的功能:

1.允许匿名用访问共享,访问的是/var/ftp目录,且只能下载文件,不能上传文件。

2.允许普通用访问共享,访问的是用户自己的家目录,既能下载文件,也能上传文件。

3.普通用户用ftp命令登录到vsftpd服务器之后,能chroot到服务器的其他目录路径下,此功能不安全,建议关掉。


例:将root用户从 vsftpd 黑名单文件中注释掉,重启vsftpd服务,用root账号访问共享资源。

第1步:编辑黑名单文件1。

  vim  /etc/vsftpd/ftpusers    编辑黑名单文件1

  #root    在此行行首添加#号(即注释root用户)

Linux文件共享之FTP_FTP_07

第2步:编辑黑名单文件2。

  vim  /etc/vsftpd/user_list    编辑黑名单文件2

  #root    在此行行首添加#号 

Linux文件共享之FTP_linux_08

第3步:重启服务。(修改黑名单文件是立即生效的,可以不重启服务)。

  systemctl  restart  vsftpd

第四步,做共享访问测试。

  win7/10访问vsftpd共享:win+E-->ftp://root:0@192.168.11.11

  linux用root访问共享:

    ftp   192.168.11.11  回车---》用户名root回车--->密码0回车-->看到successful表示登录成功

    lftp  192.168.11.11  -u  root,0


详解vsftpd的用户牢笼功能:

vsftpd的chroot牢笼功能:vim  /etc/vsftpd/vsftpd.conf   找到如下内容

#chroot牢笼功能:锁定用户在自己的家目录中,即不允许用户访问自己家目录以外的目录。

#chroot_local_user=YES    允许本地用户chroot牢笼功能(change  root),默认为NO不启用

#chroot_list_enable=YES   启用chroot_list文件功能,默认NO不启用此功能

# (default follows)

#chroot_list_file=/etc/vsftpd/chroot_list   指定chroot_list文件及其路径,默认无此文,需要用户自己创建

Linux文件共享之FTP_linux_09

chroot 四种牢笼情况

1、全部不锁(即默认情况)

#chroot_local_user=YES

#chroot_list_enable=YES

#(default follows)

#chroot_list_file=/etc/vsftpd/chroot_list


2、全部加锁

chroot_local_user=YES

allow_writeable_chroot=YES  允许chroot牢笼功能下执行写操作(centos7中必加此行)


3、少数不加锁

chroot_local_user=YES

allow_writeable_chroot=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list    指定chroot_list文件及其路径

4、少数加锁

allow_writeable_chroot=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

用vim编辑/etc/vsftpd/chroot_list名单文件(此文件中的用户不启用牢笼功能),加入用户的名字即可


-------------------------------------

案例需求:实现允许anonymous匿名用户既能下载又能上传文件文件。

需求分析:匿名用户要想对共享目录有rw可读可写的权限,必须满足以下2个条件:

  1.文件共享软件必须允许这个用户有可读可写的权限。

  2.用户对共享目录自身要有可读可写的权限。

匿名用户仅允许上传文件到/var/ftp中的子目录中。如/var/ftp/upload,且ftp匿名用户对upload目录要有可读可写权限。


警告:/var/ftp目录的属主、属组不允许修改,且other权限不允许有w可写权限,否则用ftp匿名用户访问共享时会提示下面这个500错误:

500 OOPS: vsftpd: refusing to run with writable root inside chroot()

Login failed.

421 Service not available, remote server has closed connection


实施参考:

第1步,在vsftpd.conf配置文件中允许anonymous匿名用户有可读可写的权限。

  vim   /etc/vsftpd/vsftpd.conf  找到如下代码,去掉29、33行的#号

   12 anonymous_enable=YES

   29 #anon_upload_enable=YES      允许匿名用户上传

   33 #anon_mkdir_write_enable=YES   允许匿名用户用mkdir创建目录

   anon_other_write_enable=YES     允许匿名用户执行rm删除等操作(添加此行)

   anon_world_readable_only=NO     关闭匿名用户只读的限制(为YES时会无法下载)


第2步,用root用户创建/var/ftp/upload目录,权限为777或属主和属组均为ftp,重启vsftpd服务,在win7/10中用ftp匿名用户访问共享ftp://192.168.11.11,上传一个文件到upload共享目录,看是否能传上去。结果是可以匿名用户上传文件到upload目录中。

  mkdir  -v  /var/ftp/upload

  chown  -v  ftp:ftp  /var/ftp/upload  或 chmod  -v  777  /var/ftp/upload

  systemctl  restart  vsftpd


---------------------------------------

vsftpd虚拟用户

虚拟用户:即非useradd创建的用户账号(非/etc/passwd中的账号),而是用vim创建的属于vsftpd的独立用户账号。

虚拟用户的优势:可以避免系统中的用户账号过多,让vsftpd文件共享软件独立管理自己的用户账号。


虚拟用户账号文件格式:

文件中的奇数行是用户账号,偶数行是用户的密码。


vsftpd的虚拟用户方案思路:

1.准备工作:确保vsftpd文件共享服务已安装,并已启动vsftpd服务,且关闭了selinux和firewalld安全功能。

2.创建虚拟用户账号文件。

3.将虚拟用户账号用db_load转换成加密的数据库格式文件。

4.在vsftpd的pam认证文件中添加虚拟用户账号文件的认证关系。

5.用useradd创建一个普通用户账号vftper。

6.在vsftpd.conf配置文件中启用guest来宾(即虚拟用户)功能,设置一个真实用户账号,并将真实用户账号vftper和虚拟用户账号文件关联起来。

7.给每个虚拟用户账号设置独立的共享访问速度和访问目录。

8.重启vsftpd服务,并分别用虚拟用户账号访问共享。


vsftpd虚拟用户实施思路:

1.准备工作:确保关闭了selinux和firewalld安全功能。且vsftpd文件共享服务已安装,并已启动vsftpd服务。

  setenforce  0

  getenfroce

  systemctl  stop  firewalld

  systemctl  status  firewalld


2.创建虚拟用户账号文件。

  cat  > /etc/vsftpd/vuser.txt <<EOF

   f1

   passf1

   f2

   passf2

   f3

   passf3

   EOF


3.将虚拟用户账号转换成加密的数据库格式文件。

  yum  provides  db_load

  yum  install  -y  libdb-utils

  cd  /etc/vsftpd

  ls

  db_load  -T  -t  hash  -f  /etc/vsftpd/vuser.txt  /etc/vsftpd/vuserdb.db

  chmod  -v  600  /etc/vsftpd/vuserdb.db


  db_load选项:

-T  是translation转换文件格式

-t  hash  指定格式转换的算法为hash算法

-f  是指定要转换格式的文件

/etc/vsftpd/vuser.txt   是要转换格式的文件

/et/vsftpd/vuserdb.db   是转换格式之后的文件


4.在vsftpd的pam认证文件中添加虚拟用户账号文件的认证关系。

  cp  -av  /etc/pam.d/vsftpd{,.bak}

  vim  /etc/pam.d/vsftpd  做如下修改

   #%PAM-1.0

   #以下两行的功能:仅能实现虚拟用户访问共享,普通用户不能访问共享。(不建议使用)

   #required 意思是必须的     sufficient 意思是满足的、备选的

   #auth  required  pam_userdb.so     db=/etc/vsftpd/vuserdb

   #account  required  pam_userdb.so  db=/etc/vsftpd/vuserdb

   #以下功能选项的功能:既能让虚拟用户访问共享,也能让普通用户访问共享。(推荐使用)

   auth  sufficient  pam_userdb.so     db=/etc/vsftpd/vuserdb

   account  sufficient  pam_userdb.so  db=/etc/vsftpd/vuserdb

   #以下几行功能选项是vsftpd的默认pam认证文件内容。(无需修改)

   session    optional     pam_keyinit.so    force revoke

   auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

   auth       required     pam_shells.so

   auth       include      password-auth

   account    include      password-auth

   session    required     pam_loginuid.so

   session    include      password-auth


5.用useradd创建一个普通用户账号vftper。

  useradd  vftper  -s  /sbin/nologin

  id  vftper

  ls  -ld  /home/vftper


6.在vsftpd.conf配置文件中设置一个真实用户账号,并将真实用户账号vftper和虚拟用户账号文件关联起来。

  cd  /etc/vsftpd

  cp  -av  vsftpd.conf{,.bak}

  cat  /etc/vsftpd/vsftpd.conf

  vim  vsftpd.conf  在文件最后添加如下内容

  guest_enable=YES       允许来宾用户访问共享,即虚拟用户

  guest_username=vftper      指定来宾用户名为vftper用户(即第4步新建的用户)

  user_config_dir=/etc/vsftpd/vuser_conf    指定用户配置文件目录

  allow_writeable_chroot=YES     允许chroot功能下执行写操作(必须加此行,否则会登录失败)

  #user_sub_token=$USER          使用用户子令牌(通常不用)  


7.给每个虚拟用户账号设置独立的共享访问速度和访问目录。

  cd  /etc/vsftpd

  mkdir  -v  vuser_conf

  cd  vuser_conf

  #创建f1、f2虚拟用户的会员个性化设置文件,允许f1这个虚拟用户在自己的家目录中可读可写。

   touch  f1  f2

   mkdir  -v  /home/vftper/{f1,f2,f3}

   chmod  -v  777  /home/vftper/{f1,f2,f3}

   cat  > f1 <<EOF

    write_enable=YES

    anon_world_readable_only=NO

    anon_upload_enable=YES

    anon_mkdir_write_enable=YES

    anon_other_write_enable=YES

    local_root=/home/vftper/f1

   EOF


  #允许f2这个用户在自己的家目录中可读,但不可写。

  cat  > f2 <<EOF

  #添加local_root这行即可,其余内容可以不添加。

   local_root=/home/vftper/f2

   write_enable=NO

   anon_world_readable_only=NO

   anon_upload_enable=NO

   anon_mkdir_write_enable=NO

   anon_other_write_enable=NO

  EOF


8.重启vsftpd服务,并分别用虚拟用户账号访问共享。

  systemctl  restart  vsftpd

  ftp  192.168.11.11 -->用f1、f2虚拟用户分别访问共享,测试文件的上传。