FTP服务

FTP服务

文章目录

  • FTP服务
    • FTP简介
    • FTP架构
    • FTP数据连接模式
    • 用户认证
    • vsftpd
      • vsftpd安装
      • vsftpd配置
      • vsftpd虚拟用户配置

FTP简介

网络文件共享服务主流的主要有三种,分别是ftpnfssamba

FTP:文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供。

FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间,会非常长;并且不时的必须执行一些冗长的登录进程。

在使用FTP时候,用户经常会遇到两种概念:

  • 上传

将自己电脑上的文件拷贝到远端主机上

  • 下载

从远端主机拷贝文件到自己的电脑上面

FTP架构

FTP工作于应用层,它监听tcp的21号端口,是一种c/s架构的应用程序。其有多种客户端和服务端的应用程序

  • 客户端工具

    • ftp
    • liftp,lftpget
    • wget,curl
    • filezilla
    • gftp(linux GUI)
    • 商业软件(flashftp,cuteftp)
  • 服务端软件

    • wu-ftpd
    • proftpd(提供web接口的一种ftp服务端程序)
    • pureftp
    • vsftpd(Very Secure)
    • ServU(windows平台的一种强大ftp服务端程序)

FTP数据连接模式

ftp有2种数据连接模式:

  • 命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止
  • 数据连接:是指数据传输,按需创建及关闭的连接
    • 数据传输格式:
      • 文件传输
      • 二进制传输
    • 数据传输模式:
      • 主动模式:由服务器端创建数据连接
      • 被动模式:由客户端创建数据连接
  • 主动模式下

    • 命令连接:

    客户端以大于1023的随机端口去连接ftp服务端的21号端口

    1024 --> 21 建立命令连接

    • 数据连接:

    服务端以自己的20号端口去连接客户端建立命令连接时的端口+1的端口号

    20 --> 1025 建立数据连接

  • 被动模式下

    • 命令连接

    客户端以一个随机端口(1110)来连接服务器端的21号端口,之后服务器会返回一个告知客户端连接服务端的哪个端口号

    1110 --> 21 (告知客户端连接哪一个端口)

    • 数据连接

    客户端以创建命令连接的端口+1 (1110 + 1)的端口号去连接服务器端通过命令连接告知自己的一个随机端口号来创建数据连接

    1111 --> (服务端告知自己的端口)

注意:

主动模式有个弊端,因为客户端的端口是随机的,如果客户端开了防火墙,那么服务器端去连接客户端创建数据连接时就可能会被拒绝。

用户认证

FTP的用户主要有三种:

  • 虚拟用户:仅用于访问某特定服务中的资源
  • 系统用户:可以登录系统的真实用户
  • 匿名用户

vsftpd

vsftpd安装

[root@client111 ~]# yum install -y vsftpd
........
已安装:
  vsftpd.x86_64 0:3.0.2-22.el7

完毕!

vsftpd配置

# 配置文件目录
[root@client111 ~]# ls -ld /etc/vsftpd
drwxr-xr-x. 2 root root 88 6月  27 15:45 /etc/vsftpd

# 主配置文件
[root@client111 ~]# ls -l /etc/vsftpd/vsftpd.conf
-rw-------. 1 root root 5030 8月   3 2017 /etc/vsftpd/vsftpd.conf

# vsftpd用户认证配置文件
[root@client111 ~]# ls -l /etc/pam.d/vsftpd
-rw-r--r--. 1 root root 335 8月   3 2017 /etc/pam.d/vsftpd


# 匿名用户(映射为ftp用户)的共享资源位置是/var/ftp
# 系统用户通过ftp访问的资源位置为用户的家目录
# 虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录
 anonymous_enable=YES				启用匿名用户登陆
 anon_upload_enable=YES			允许匿名用户上传
 anon_mkdir_write_enable=YES		允许匿名用户创建目录,但是不能删除
 anon_other_write_enable=YES		允许匿名用户创建和删除目录
 local_enable=YES					启用本地用户登陆
 write_enable=YES					允许本地用户有写权限
 local_umask=022					通过FTP上传文件的默认遮罩码
 chroot_local_user=YES				禁锢所有FTP本地用户只能在其家目录中
 chroot_list_enable=YES			开启禁锢文件列表;需要与chroot_list_file参数一起使用
 chroot_list_file=/etc/vsftp/chroot_list	 指定禁锢列表文件路径;在此文件里面的用户将被禁锢在其家目录中
 allow_writeable_chroot=YES		允许被禁锢的用户家目录有写权限
 xferlog_enable=YES				是否启用传输日志,记录FTP传输过程
 xferlog_std_format=YES			传输日志是否使用标准格式
 xferlog_file=/var/log/xferlog		指定传输日志存储的位置
 chown_uploads=YES					是否启用改变上传文件属性的功能
 chown_username=whoever			指定要将上传的文件的属主改为哪个用户,此用户必须在系统中存在
 pam_service_name=vsftpd			指定vsftp使用/etc/pam.d下的哪个pam配置文件进行用户认证
 userlist_enable=YES				是否启用控制用户登陆的列表文件:默认为/etc/vsftpd/user_list文件
 userlist_deny=YES					是否拒绝userlist指定的列表文件中存在的用户登陆FTP
 max_cients=`#`					最大并发连接数
 max_per_ip=`#`					每个IP可同时发起的并发请求数
 anon_max_rate						匿名用户的最大传输速率,单位是‘字节/秒’
 local_max_rate					本地用户的最大传输速率,单位是‘字节/秒’
 dirmessage_enable=YES				启用某目录下的.message描述信息
 #假设有一个目录,在此目录下面创建一个名为.message的文件,在此文件内写入一些描述信息之后切换出目录,目录会自动显示.message文件中的内容
 
 message_file						设置访问一个目录时获得的目录信息文件的文件名,默认是.message
 idle_session_timeout=600			设置默认的断开不活跃session的时间
 data_connection_timeout=120		设置数据传输超时时间
 ftpd_banner="Welcome to chenlf FTP service."	定制欢迎信息,登陆FTP时自动显示
 

vsftpd虚拟用户配置

  • 虚拟用户的配置:

    • 所有的虚拟用户会被统一映射为一个指定的系统账号,访问的共享位置即为此系统账号的家目录
    • 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
    • 虚拟用户账号的存储方式:
      • 文件:编辑文件,此文件需要为编码hash格式。
        • 文件奇数行为用户
        • 偶数行为密码
      • 关系型数据库的表中:
        • 通过即时查询数据库完成用户认证
        • mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装

vsftpd虚拟用户的配置步骤:

  • 安装依赖的程序
[root@client111 ~]# cd /etc/yum.repos.d/
[root@client111 yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@client111 yum.repos.d]# vim CentOS7-Base-163.repo
[root@client111 yum.repos.d]# tail -n 5 CentOS7-Base-163.repo
name=CentOS-$releasever - Plus - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=1   # 此处将0改为1
gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7
[root@client111 yum.repos.d]# yum clean all
[root@client111 yum.repos.d]# yum install -y epel-release
[root@client111 yum.repos.d]# yum install -y vsftpd

  • 创建文本格式的用户名以及密码
[root@client111 yum.repos.d]# cd /etc/vsftpd/
[root@client111 vsftpd]# vim vu.list
[root@client111 vsftpd]# cat vu.list
123
123321
abc
123321
# 用户和密码一一对应,前面为账户,后面为密码
[root@client111 vsftpd]# id 123
id: 123: no such user
[root@client111 vsftpd]# id abc
id: abc: no such user
# 账户在系统中没有创建过

  • 安装db4工具
[root@client111 vsftpd]# yum install -y db4*
  • 使用db4工具将刚才编辑的vu.list转换成数据库文件(vu.db)
-T 表示转换		-t 表示加密方式使用hash算法加密
[root@client111 vsftpd]# db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db
[root@client111 vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh  vu.db  vu.list
[root@client111 vsftpd]# file vu.*
vu.db:   Berkeley DB (Hash, version 9, native byte-order)
vu.list: ASCII text

  • 为防止数据泄露,将文件权限设置为600
[root@client111 vsftpd]# chmod 600 vu.*
[root@client111 vsftpd]# ls -l vu.*
-rw-------. 1 root root 12288 6月  27 17:16 vu.db
-rw-------. 1 root root    22 6月  27 17:08 vu.list

  • 添加虚拟用户的映射账号,创建ftp的根目录
[root@client111 vsftpd]# useradd -d /file -s /sbin/nologin vftp
[root@client111 vsftpd]# cd /
[root@client111 /]# ls -ld file
drwx------. 3 vftp vftp 78 6月  27 17:32 file
[root@client111 /]# chmod 755 file
[root@client111 /]# ls -ld file
drwxr-xr-x. 3 vftp vftp 78 6月  27 17:32 file
  • 备份vsftpd用户认证配置文件
[root@client111 pam.d]# cp /etc/pam.d/vsftpd{,.bak}
[root@client111 pam.d]# ls vsftpd*
vsftpd  vsftpd.bak

  • 为虚拟用户建立pam认证
[root@client111 pam.d]# vim /etc/pam.d/vsftpd
[root@client111 pam.d]# cat /etc/pam.d/vsftpd
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vu
account required pam_userdb.so db=/etc/vsftpd/vu

  • 修改vsftpd配置文件,添加虚拟用户支持
[root@client111 pam.d]# vim /etc/vsftpd/vsftpd.conf
[root@client111 pam.d]# tail -n 2 /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vftp
  • 为不同的虚拟用户建立独立的配置文件
[root@client111 pam.d]# vim /etc/vsftpd/vsftpd.conf
[root@client111 pam.d]# tail -n 2 /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
allow_writeable_chroot=YES

上述配置配置完成之后,转到/etc/vsftpd/vusers_dir目录中为每个虚拟用户分别建立配置文件

[root@client111 pam.d]# mkdir /etc/vsftpd/vusers_dir
[root@client111 pam.d]# cd /etc/vsftpd/vusers_dir
[root@client111 vusers_dir]# ls
[root@client111 vusers_dir]# touch 123
[root@client111 vusers_dir]# touch abc
  • 设置虚拟用户123能上传和下载,而abc可以上传文件和创建目录、以及下载。
[root@client111 vusers_dir]# vim 123
[root@client111 vusers_dir]# vim abc
[root@client111 vusers_dir]# cat 123
anon_upload_enable=YES
[root@client111 vusers_dir]# cat abc
anon_upload_enable=YES
anon_mkdir_write_enable=YES

  • 重启服务
[root@client111 vusers_dir]# systemctl restart vsftpd

此时用另外一台主机去访问

  • 安装lftp
[root@server222 ~]# yum install -y lftp
  • 查看lftp的帮助用法
[root@server222 ~]# lftp --help
用法: lftp [OPTS] <site>
`lftp' 是在 rc 文件执行后 lftp 执行的第一个命令
 -f <file>           执行文件中的命令后退出
 -c <cmd>            执行命令后退出
 --help              显示帮助信息后退出
 --version           显示 lftp 版本后退出
 其他的选项同 `open' 命令
 -e <cmd>            在选择后执行命令
 -u <user>[,<pass>]  使用指定的用户名/口令进行验证
 -p <port>           连接指定的端口
 <site>              主机名, URL 或书签的名字
  • 连接192.168.176.111中的abc用户
[root@server222 ~]# lftp -u abc,123321 192.168.176.111
lftp [email protected]:~> ls
lftp [email protected]:/> mkdir abc
mkdir 成功, 建立 `abc'
lftp [email protected]:/> ls
drwx------    2 1001     1001            6 Jun 27 14:28 abc
  • 可用help或者?来查看帮助命令
lftp [email protected]:/> help
    !<shell-command>                     (commands)
    alias [<name> [<value>]]             attach [PID]
    bookmark [SUBCMD]                    cache [SUBCMD]
    cat [-b] <files>                     cd <rdir>
    chmod [OPTS] mode file...            close [-a]
    [re]cls [opts] [path/][pattern]      debug [<level>|off] [-o <file>]
    du [options] <dirs>                  exit [<code>|bg]
    get [OPTS] <rfile> [-o <lfile>]      glob [OPTS] <cmd> <args>
    help [<cmd>]                         history -w file|-r file|-c|-l [cnt]
    jobs [-v] [<job_no...>]              kill all|<job_no>
    lcd <ldir>                           lftp [OPTS] <site>
    ln [-s] <file1> <file2>              ls [<args>]
    mget [OPTS] <files>                  mirror [OPTS] [remote [local]]
    mkdir [-p] <dirs>                    module name [args]
    more <files>                         mput [OPTS] <files>
    mrm <files>                          mv <file1> <file2>
    [re]nlist [<args>]                   open [OPTS] <site>
    pget [OPTS] <rfile> [-o <lfile>]     put [OPTS] <lfile> [-o <rfile>]
    pwd [-p]                             queue [OPTS] [<cmd>]
    quote <cmd>                          repeat [OPTS] [delay] [command]
    rm [-r] [-f] <files>                 rmdir [-f] <dirs>
    scache [<session_no>]                set [OPT] [<var> [<val>]]
    site <site-cmd>                      source <file>
    torrent [-O <dir>] <file|URL>...     user <user|URL> [<pass>]
    wait [<jobno>]                       zcat <files>
    zmore <files>

  • 进入192.168.176.111
[root@client111 /]# cd file/
[root@client111 file]# ls
abc
[root@client111 file]# echo "1234567890" > abc.txt
[root@client111 file]# ls
abc  abc.txt

  • 进入192.168.176.222
[root@server222 ~]# lftp -u abc,123321 192.168.176.111
lftp [email protected]:~> ls
drwx------    3 1001     1001           21 Jun 27 14:34 abc
-rw-r--r--    1 0        0              11 Jun 27 14:39 abc.txt

  • 下载abc.txt
[root@server222 ~]# lftp -u abc,123321 192.168.176.111
lftp [email protected]:~> ls
drwx------    3 1001     1001           21 Jun 27 14:34 abc
-rw-r--r--    1 0        0              11 Jun 27 14:39 abc.txt
lftp [email protected]:/> get abc.txt -o /opt
11 bytes transferred
lftp [email protected]:/> exit
[root@server222 ~]# ll /opt
总用量 4
-rw-r--r--. 1 root root 11 6月  27 22:39 abc.txt
drwxr-xr-x. 2 root root  6 3月  26 2015 rh

你可能感兴趣的:(Linux)