Linux下基于vsftpd的FTP文件传输协议详解(附完整流程命令)

理论概述

基本概念

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

vsftpd是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。
vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。

使用协议及端口

  • TCP 21 建立命令链路
  • TCP 20 在主动传输模式下服务器使用20端口向客户端建立数据链路

工作原理

  1. 客户端向服务器发出连接请求,同时客户端系统动态地打开一个大于1024的端口等候服务器连接(比如1031端口)
  2. 若FTP服务器在端口21侦听到该请求,则会在客户端1031端口和服务器的21端口之间建立一个FTP会话连接
  3. 当需要传输数据时,FTP客户端动态地打开一个大于1024的端口(比如1032端口)连接到服务器的20端口,并在这两个端口之间进行数据的传输。当数据传输完毕后,这两个端口会自动关闭
  4. 当FTP客户端断开与FTP服务器的连接时,客户端上动态分配的端口将自动释放

工作模式

  • 主动传输模式(Active FTP):
    在主动传输模式下,FTP客户端随机开启一个大于1024的端口N(1025)向服务器的21号端口发起连接,然后开放N+1号端口(1026)进行监听,并向服务器发送PORT 1026命令。服务器接收到命令后,会用其本地的FTP数据端口(通常20)来连接客户端指定的端口1026,进行数据传输。

  • 被动传输模式(Passive FTP):
    在被动传输模式下,FTP客户端随机开启一个大于1024的端口N(1025)向服务器的21号端口发起连接,同时会开启N+1号端口(1026),然后向服务器发送PASV 命令。通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024端口(1521)进行监听,然后用PORT 命令通知客户端,自己的数据端口是1521.客户端收到命令后会通过1026号端口连接服务器的1521,然后在两个端口之间进行数据传输。

传输模式

  • 二进制模式:图片和执行文件压缩文件
  • 文本模式:CGI脚本和普通HTML文件

目前服务器上面和FTP客户端软件能够自动识别文件类型并选择相应的传输方式

账户类型

  • 匿名用户:ftp 或 anonymous
  • 本地用户:Linux服务器本机的系统用户账号
  • 虚拟用户:账号信息存放在独立的文件或数据库内

默认安装vsftpd特点

  • 匿名用户与本地用户都可以登录
  • 匿名用户登录到/var/ftp,只能下载不能上传
  • 本地用户登录到本地用户的家目录,可以上传和下载

访问ftp服务器方法

  • 常见的网页浏览器(Firefox、IE等)
  • 常见的下载工具(wget、curl等)
  • 专用的FTP管理工具(Filezilla、CuteFTP、WinSCP等)
    ftp和lftp命令
get  //下载
put  //上传
mget    //下载多个,支持通配符
mput    //上传多个,支持通配符
!cmd    //执行外面命令
lcd     //切换外面路径

访问FTP地址表示方法

  • 匿名访问
ftp://192.168.4.5
ftp://192.168.4.5/path/to/file
  • 用户验证访问
ftp://user:pass@192.168.4.5
ftp://user:pass@192.168.4.5/path/to/file

URL,统一资源定位器(网址)
Unified Resource Locator
协议://用户名:密码@服务器地址:端口/目录路径/文件名

vsftpd相关文件说明

主配置文件

/etc/vsftpd/vsftpd.conf

anonymous_enable=YES         //开启匿名共享
local_enable=YES             //开启本地账户共享
write_enable=YES             //本地账户是否可写
anon_upload_enable=YES       //匿名用户是否可以上传文件
anon_mkdir_write_enable=YES  //匿名可创建目录
anon_other_write_enable=YES  //匿名删除,重命名
chroot_local_user           //禁锢本地账户
anon_root=/abc              //定义匿名用户根目录为/abc目录
anon_umask=022              //定义匿名用户上传的掩码值
listen_address=192.168.4.5  //定义监听地址为192.168.4.5

其他配置文件

  • 黑名单:/etc/vsftpd/ftpusers
  • 黑/白名单:/etc/vsftpd/user_list
    在字段userlist_enable=YES或NO //是否开启user_list文件
    在字段userlist_deny=NO时user_list是白名单

其他常用选项

  • listen_port=端口号
  • listen_address=IP地址

默认的vsftpd服务:

允许匿名FTP访问,只能下载不能上传 【/var/ftp/】
允许本地用户FTP访问,既可以下载,也可以上传 【~用户名】

并发连接和速度:

max_clients     //最大并发连接数
max_per_ip      //同一IP地址的最大并发连接数
anon_max_rate   //匿名用户访问速度(字节/秒)
local_max_rate  //本地用户访问速度(字节/秒)

实践操作

[root@server99 yum.repos.d]# yum -y install vsftpd  //使用Yum进行安装
[root@server99 yum.repos.d]# service vsftpd start
为 vsftpd 启动 vsftpd:                                    [确定]
[root@server99 yum.repos.d]# chkconfig vsftpd on   //设置为开机自启
[root@server99 yum.repos.d]# chkconfig vsftpd --list //验证查看开机状态
vsftpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
//添加本地用户,来验证ftp
[root@server99 yum.repos.d]# useradd ftp-test-01
[root@server99 yum.repos.d]# echo 123456 | passwd --stdin ftp-test-01
Changing password for user ftp-test-01.
passwd: all authentication tokens updated successfully.
//查看用户
[root@server99 yum.repos.d]# grep ftp /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin  //安装vsftpd后,生成的系统用户
ftp-test-01:x:500:500::/home/ftp-test-01:/bin/bash
//在ftp的缺省目录中添加标识文件,方便验证
[root@server99 ~]# cd /var/ftp/         //匿名用户缺省登录访问目录
[root@server99 ftp]# ls
pub
[root@server99 ftp]# echo "anon user test file" > anon.txt
[root@server99 ftp]# ls
anon.txt  pub
[root@server99 ftp]# cd /home/ftp-test-01/      //普通(本地)用户缺省登录访问目录
[root@server99 ftp-test-01]# ls
[root@server99 ftp-test-01]# echo "local user test file" > local.txt
[root@server99 ftp-test-01]# ls
local.txt

```
以下是客户端上的操作步骤:
```
[root@pc-97 ~]# yum -y install ftp //使用yum安装ftp访问客户端,还可以使用浏览器等方式访问,这里我们姑且使用ftp即可。
//匿名用户
[root@pc-97 ~]# ftp 192.168.4.99  //访问ftp服务器,保证客户端PC和FTP服务器可以连通
Connected to 192.168.4.99 (192.168.4.99).
220 (vsFTPd 2.2.2)
Name (192.168.4.99:root): ftp   //匿名用户,也就是安装vsftpd生成的系统用户,用作匿名用户进行访问
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 (192,168,4,99,85,130).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              20 Dec 16 23:45 anon.txt   //这里就是我们刚才创建的文件
drwxr-xr-x    2 0        0            4096 Mar 06  2015 pub
226 Directory send OK.
ftp> cd ..                          //返回上一级目录,缺省配置下,匿名用户会被禁锢根目录
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,4,99,91,171).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              20 Dec 16 23:45 anon.txt
drwxr-xr-x    2 0        0            4096 Mar 06  2015 pub
226 Directory send OK.
ftp> get anon.txt                       //测试下载文件,使用该方法会默认将文件下载的当前的本地目录下
local: anon.txt remote: anon.txt
227 Entering Passive Mode (192,168,4,99,114,170).
150 Opening BINARY mode data connection for anon.txt (20 bytes).
226 Transfer complete.
20 bytes received in 5.2e-05 secs (384.62 Kbytes/sec)
ftp> quit
221 Goodbye.
[root@pc-97 ~]# ls anon.txt                //验证文件下载
anon.txt
[root@pc-97 ~]# echo "ftp put test file" > ftp-put.txt //测试文件上传
[root@pc-97 ~]# ls ftp-put.txt 
ftp-put.txt
[root@pc-97 ~]# ftp 192.168.4.99
Connected to 192.168.4.99 (192.168.4.99).
220 (vsFTPd 2.2.2)
Name (192.168.4.99:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put ftp-put.txt                    //该命令可从当前本地目录进行文件的上传
local: ftp-put.txt remote: ftp-put.txt
227 Entering Passive Mode (192,168,4,99,241,45).
550 Permission denied.                  //显示权限不足,已经被拒绝,由于缺省不允许进行文件上传操作

//本地用户
[root@pc-97 ~]# ftp 192.168.4.99
Connected to 192.168.4.99 (192.168.4.99).
220 (vsFTPd 2.2.2)
Name (192.168.4.99:root): ftp-test-01       //在服务器新建的本地ftp测试用户
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 (192,168,4,99,46,149).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              21 Dec 16 23:45 local.txt //服务器端创建的本地用户的验证文件
226 Directory send OK.
ftp> cd ..
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,4,99,73,87).
150 Here comes the directory listing.
drwx------    4 500      500          4096 Dec 16 23:45 ftp-test-01
226 Directory send OK.
//验证本地用户目录禁锢
ftp> cd ..
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,4,99,248,92).
150 Here comes the directory listing.
dr-xr-xr-x    2 0        0            4096 Apr 20  2016 bin
dr-xr-xr-x    5 0        0            1024 Mar 29  2016 boot
drwxr-xr-x    2 0        0            4096 Jan 06  2015 cgroup
drwxr-xr-x   19 0        0            3660 Dec 16 23:15 dev
drwxr-xr-x   89 0        0            4096 Dec 16 23:41 etc
drwxr-xr-x    3 0        0            4096 Dec 16 23:40 home
dr-xr-xr-x   10 0        0            4096 Mar 29  2016 lib
dr-xr-xr-x    9 0        0           12288 Apr 20  2016 lib64
drwx------    2 0        0           16384 Mar 29  2016 lost+found
drwxr-xr-x    2 0        0            4096 Jun 28  2011 media
drwxr-xr-x    2 0        0            4096 Jun 28  2011 mnt
drwxr-xr-x    3 0        0            4096 Mar 29  2016 opt
dr-xr-xr-x  104 0        0               0 Dec 17  2016 proc
dr-xr-x---   11 0        0            4096 Dec 16 23:35 root
dr-xr-xr-x    2 0        0           12288 Apr 20  2016 sbin
drwxr-xr-x    7 0        0               0 Dec 17  2016 selinux
drwxr-xr-x    2 0        0            4096 Jun 28  2011 srv
drwxr-xr-x   13 0        0               0 Dec 17  2016 sys
drwxrwxrwt    3 0        0            4096 Dec 16 23:32 tmp
drwxr-xr-x   13 0        0            4096 Mar 29  2016 usr
drwxr-xr-x   20 0        0            4096 Dec 16 23:32 var
226 Directory send OK.      //可以看到本地用户在缺省状态下,并没有禁锢ftp目录,可以已知查看到根文件系统
//验证本地用户缺省下载
ftp> ls
227 Entering Passive Mode (192,168,4,99,48,154).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              21 Dec 16 23:45 local.txt
226 Directory send OK.
ftp> get local.txt
local: local.txt remote: local.txt
227 Entering Passive Mode (192,168,4,99,181,48).
150 Opening BINARY mode data connection for local.txt (21 bytes).
226 Transfer complete.
21 bytes received in 4.9e-05 secs (428.57 Kbytes/sec)
[root@pc-97 ~]# ls local.txt   //下载成功 
local.txt
//验证本地用户的缺省的上传功能
[root@pc-97 ~]# ls ftp-put.txt 
ftp-put.txt
[root@pc-97 ~]# ftp 192.168.4.99
Connected to 192.168.4.99 (192.168.4.99).
220 (vsFTPd 2.2.2)
Name (192.168.4.99:root): ftp-test-01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put ftp-put.txt
local: ftp-put.txt remote: ftp-put.txt
227 Entering Passive Mode (192,168,4,99,251,192).
150 Ok to send data.
226 Transfer complete.
18 bytes sent in 5.7e-05 secs (315.79 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,4,99,88,150).
150 Here comes the directory listing.
-rw-r--r--    1 500      500            18 Dec 17 00:22 ftp-put.txt
-rw-r--r--    1 0        0              21 Dec 16 23:45 local.txt   //上传成功
226 Directory send OK.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值