基础要点
文件传输协议(File Transfer Protocol)
基于TCP,端口号为20(数据传输端口),21(控制连接端口)
工作模式有两种,分别是主动模式(Port模式)和被动模式(Passive模式)
工作过程
1.主动模式:
client----------------------------------------------------------------server
(TCP:21连接初始化,控制端口)
Port xxxx --------------------------SYN-----------------------> Port 21
Port xxxx ----------------------SYN+ACK-------------------> Port 21
Port xxxx --------------------------ACK-----------------------> Port 21
(控制操作:用户列目录或传输文件)
Port xxxx <---------------------Port,IP,Port yyyy------------ Port 21
Port xxxx <----------------------Port Seccussful------------ Port 21
Port xxxx --------------------List,Retr or Stor--------------> Port 21
(TCP:20连接初始化,数据端口)
Port yyyy <-------------------------SYN------------------------ Port 20
Port yyyy ----------------------SYN+ACK--------------------> Port 20
Port yyyy <-------------------------ACK------------------------- Port 20
(数据操作:数据传输)
Port yyyy <---------------------Data+ACK------------------> Port 20

2.被动模式
client----------------------------------------------------------------server
(TCP:21连接初始化,控制端口)
Port xxxx --------------------------SYN-----------------------> Port 21
Port xxxx ----------------------SYN+ACK-------------------> Port 21
Port xxxx --------------------------ACK-----------------------> Port 21
(PASV操作:被动连接数据端口初始化)
Port xxxx -------------------------PASV-----------------------> Port 21
Port xxxx <--------------PASV OK,IP,Port yyyy------------ Port 21
Port zzzz -------------------------SYN------------------------> Port yyyy
Port zzzz <---------------------SYN+ACK-------------------- Port yyyy
Port zzzz --------------------------ACK-----------------------> Port yyyy
(数据操作:数据传输)
Port xxxx ---------------List,Retr or Stor--------------------> Port 21
Port zzzz <---------------------Data+ACK-------------------> Port yyyy
以上就是课本所描述的工作过程,我觉得难理解就搜寻了很多网上主动和被动模式的区别,初始化控制连接的过程两者是差不多的,区别在于主动模式中客户端发送ls,dir等命令时,发送的是PORT命令,包含了一个临时端口,就是客户端后面要进行数据传输的端口yyyy,而被动模式发送的是PASV命令,意思是希望连接服务端的某一端口也就是后面服务端的yyyy和自己的临时端口zzzz

服务端
安装软件包vsftpd

[root@localhost vsftpd]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd   #日志轮转文件
/etc/pam.d/vsftpd  #安全认证相关
/etc/vsftpd #主目录
/etc/vsftpd/ftpusers #用户列表(黑名单)
/etc/vsftpd/user_list #用户列表(默认是黑名单,可通过配置变成白名单),初始用户与ftpusers相同
/etc/vsftpd/vsftpd.conf #配置文件
/usr/sbin/vsftpd #二进制文件
/var/ftp #匿名用户数据的根目录(数据传输的目录)
/var/ftp/pub #匿名用户数据目录的扩展

配置文件的内容

[root@localhost ftp]# cat /etc/vsftpd/vsftpd.conf |grep -v ^#.*$
anonymous_enable=YES #匿名用户是否开启,默认的匿名用户是ftp和anonymous
local_enable=YES
write_enable=YES #写权限,总开关
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

配置文件相关内容可使用man 5 vsftpd.conf 命令查看文档,如下效果

  anon_other_write_enable
              If set to YES, anonymous users will  be  permitted  to  perform  write
              operations  other  than  upload and create directory, such as deletion
              and renaming. This is generally not recommended but included for  com‐
              pleteness.

              Default: NO

       anon_upload_enable
              If set to YES, anonymous users will be permitted to upload files under
              certain conditions. For this to work, the option write_enable must  be
              activated,  and  the  anonymous ftp user must have write permission on
              desired upload locations. This setting is also  required  for  virtual
              users  to upload; by default, virtual users are treated with anonymous
              (i.e. maximally restricted) privilege.

              Default: NO

       anon_world_readable_only
              When enabled, anonymous users will only be allowed to  download  files
 Manual page vsftpd.conf(5) line 89 (press h for help or q to quit)

客户端
安装2个登录工具ftp和lftp
ftp默认使用用户名密码登录

[root@localhost ~]# ftp 10.50.2.129
Connected to 10.50.2.129 (10.50.2.129).
220 (vsFTPd 3.0.2)
Name (10.50.2.129:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

lftp默认是用匿名用户登录

[root@localhost ~]# lftp 10.50.2.129
lftp 10.50.2.129:~> ls
-rw-r--r--    1 0        0              98 Jul 20 12:15 aa
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
lftp 10.50.2.129:/> user xh
口令:

例子
匿名登录服务器下载文件aa,可以看到下载成功

[root@localhost ~]# ftp 10.50.2.129
Connected to 10.50.2.129 (10.50.2.129).
220 (vsFTPd 3.0.2)
Name (10.50.2.129:root): 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 (10,50,2,129,131,189).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              98 Jul 20 12:15 aa
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
226 Directory send OK.
ftp> get aa
local: aa remote: aa
227 Entering Passive Mode (10,50,2,129,224,93).
150 Opening BINARY mode data connection for aa (98 bytes).
226 Transfer complete.
98 bytes received in 0.0178 secs (5.50 Kbytes/sec)
ftp> exit
221 Goodbye.
[root@localhost ~]# ls
aa  anaconda-ks.cfg  bb  nginx-1.6.2  nginx-1.6.2.tar.gz

而上传文件bb则失败,原因是匿名用户无权限

ftp> put bb
local: bb remote: bb
227 Entering Passive Mode (10,50,2,129,98,191).
553 Could not create file.

使用本地用户xh登录,并上传则成功

ftp> put bb
local: bb remote: bb
227 Entering Passive Mode (10,50,2,129,231,179).
150 Ok to send data.
226 Transfer complete.
63 bytes sent in 0.000247 secs (255.06 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,50,2,129,46,46).
150 Here comes the directory listing.
-rw-r--r--    1 1001     1001           63 Nov 05 10:06 bb
226 Directory send OK.

由此可知默认情况下匿名用户是有下载权限,而没有上传权限的,本地用户则都有,如果有需要可以在配置文件的更改相关参数,ftp的知识与应用相对简单