FTP(File Transfer Protocol,文件传输协议)是Internet中应用广泛的服务之一,主要用提供在Internet上任意计算机之间相互传输文件的机制。
FTP(File Transfer Protocol,文件传输协议)是用来在不同类型的计算机之间传输文件的协议。而FTP服务器,是在网络中提供存储文件空间的计算机,应用FTP协议提供服务。用户可以连接到服务器来下载文件,也可以将文件上传到FTP服务器中。因此,FTP服务器方便了用户之间远程交换文件的需要,充分体现了网络资源共享的优越性。
FTP协议属于TCP/IP协议簇,它工作在OSI模式的第七层,TCP/IP模型的第四层,是一种面向连接的协议。FTP在对外提供服务时需要维护两个连接:一个是控制连接,负责监听21端口,用来传输控制命令;另一个是数据连接,在主动传输方式下监听20端口,用来传输数据。
FTP协议有两种工作模式,一种叫做主动模式(也就是PORT模式);另一种叫做被动模式(也就是PSAV)模式。主动模式FTP的客户端发送PORT命令到FTP服务器,被动模式FTP的客户端发送PSAV命令到FTP服务器,这两种方式的工作过程如下:
1、主动模式的工作过程
(1)客户端随机开启一个大于1024的端口X向FTP服务器的21端口发送连接请求。
(2)客户端开放X+1号端口进行监听。
(3)FTP服务器接受连接,并建立一个控制连接会话。
(4)当需要传递数据时,FTP服务器从20端口向客户端的X+1号端口发送连接请求,建立一条数据链路来传送数据。
(5)通过建立的数据连接传送数据。
(6)数据传输完成后,断开数据连接,客户端释放端口X+1。
(7)客户端X端口断开与服务器21端口间的控制连接,客户端释放X端口。
在主动模式下传送数据时,是由FTP服务器主动连接客户端,如果客户端在防火墙或NAT网关后面,由于防火墙无法预知客户端用于数据连接的端口,所以这时使用主动模式将无法与网络上的FTP服务器传送数据。在这种情况下就需要使用被动模式。
2、被动模式的工作过程
(1)客户端随机开启一个大于1024的端口X向FTP服务器的21端口发送连接请求。
(2)客户端开放X+1号端口进行监听。
(3)客户端向FTP服务器发送PASV命令,表明客户端此时处于被动模式。
(4)FTP服务器收到命令后,会开放一个大于1024的端口Y进行监听。
(5)FTP服务器向客户端发送PORT命令,表明服务器此时的数据端口是Y。
(6)客户端收到命令后,会通过X+1端口连接服务器的Y端口,建立数据连接。
(7)通过建立的数据连接传送数据。
(8)数据传输完成后,断开数据连接,客户端释放端口X+1,服务器释放端口Y。
(9)客户端X端口断开与服务器21端口间的控制连接,客户端释放X端口。
(1)ASCLL传输方式:如果用户正在复制的文件是简单的ASCLL码文本,而远程服务器上运行的不是UNIX,当文件传输时FTP通常会自动调整文件的内容,以便于把文件解释成另外那台计算机存储文本文件的格式。
(2)二进制文件传输方式:如果用户正在传输的不是文本文件,可能是程序、数据、或者压缩文件,就要使用二进制传输。在二进制传输中,保存文件位序以便原始和复制的是逐位一一对应的。
基于FTP服务器安全性的考虑,可以采用分用户访问FTP服务器的方式。FTP的用户默认提供三类用户,不同的用户对应着不同的权限和操作方式。
(1)匿名用户:也就是Anonymous用户。即当客户端访问FTP资源时,可以在没有服务器的账户名及密码的情况下,使用匿名用户访问FTP服务器的共享资源。
(2)实体用户:指FTP服务器的本地账户。即当用户登入FTP服务器时,其默认的工作主目录就是以其账户命名的目录,也可变更其工作主目录。该用户不仅可以访问FTP共享资源,还可以访问系统下该用户的资源。
(3)虚拟用户:指FTP建立专有的用户。将帐号和密码保存在数据库中,采用非系统账户访问服务器资源。相比于FTP的实体用户,虚拟用户只能访问FTP共享资源,而没有操作系统其它资源的权利。
案例1:某公司新购一台服务器,服务器上已安装Linux操作系统,现要求将服务器配置成FTP服务器,主要为公司内的主机提供文件传送服务,而且将来可能需要实现合作伙伴通过互联网访问。具体要求如下:
(1)创建存放下载资源的目录/var/ftp/course
(2)要求匿名用户可以在此目录中下载(down.txt)、上传文件(up.txt),并可以对上传的文件进行改名。
(3)设置数据连接超时300秒,空闲会话超时800秒
(4)启用FTP Banner功能,内容为“welcome to FTP service.”
(5)匿名用户的上传和下载速度为10Kbit/s。
角色 | 主机名 | 操作系统 | 网卡 | IP地址 | 备注 |
---|---|---|---|---|---|
FTP服务器 | ftpserver | CentOS7.4 | vmnet1 | 192.168.92.11/24 | 虚拟机 |
FTP客户端 | ftpclient | CentOS7.4 | vmnet1 | 192.168.92.101/24 | 虚拟机 |
FTP服务器
[root@ftpserver ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.92.11
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
[root@ftpserver ~]# hostname
ftpserver.gc.com
[root@ftpserver ~]# getenforce
Disabled
[root@ftpserver ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@ftpserver ~]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
dvd local enabled: 3,894
repolist: 3,894
FTP客户端
[root@ftpclient ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.92.101
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
[root@ftpclient ~]# hostname
ftpclient.gc.com
[root@ftpclient ~]# getenforce
Disabled
[root@ftpclient ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@ftpclient ~]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
dvd local enabled: 3,894
repolist: 3,894
(1)配置文件解析
/etc/logrotate.d/vsftpd. ###vsftpd的日志文件
/etc/pam.d/vsftpd ###PAM认证文件
/usr/lib/systemd/system/vsftpd.service ###服务管理脚本
/etc/vsftpd ###vsftpd的配置文件存放的目录
/etc/vsftpd/ftpusers ###禁止使用vsftpd的用户列表文件
/etc/vsftpd/user_list ###禁止或允许使用vsftpd的用户列表文件
/etc/vsftpd/vsftpd.conf ###主配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh ###vsftpd操作的一些变量和设置
/usr/sbin/vsftpd ###vsftpd的主程序
/var/ftp ###匿名用户主目录
/var/ftp/pub ###匿名用户的下载目录
(2)安装软件包
[root@ftpserver ~]# yum install vsftpd -y
(3)准备目录和文件
[root@ftpserver ~]# mkdir /var/ftp/course
[root@ftpserver ~]# echo "down" > /var/ftp/course/down.txt
[root@ftpserver ~]# chmod -R o+w /var/ftp/course
[root@ftpserver ~]# ll /var/ftp/course -d
drwxr-xrwx 2 root root 22 May 15 13:52 /var/ftp/course
(4)修改配置文件
[root@ftpserver ~]# vim /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
idle_session_timeout=800
data_connection_timeout=300
ftpd_banner=Welcome to FTP service.
anon_max_rate=8192
(5)启动服务并设置开机自启动
[root@ftpserver ~]# systemctl start vsftpd
[root@ftpserver ~]# systemctl enable vsftpd
(1)安装软件包
[root@ftpclient ~]# yum install ftp -y
(2)ftp登入测试
[root@ftpclient ~]# ftp 192.168.92.11
Connected to 192.168.92.11 (192.168.92.11).
220 Welcome to FTP service.
Name (192.168.92.101: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 (192,168,92,11,77,66).
150 Here comes the directory listing.
drwxr-xrwx 2 0 0 22 May 15 14:01 course
drwxr-xr-x 2 0 0 6 Aug 03 2017 pub
226 Directory send OK.
ftp> cd course
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,92,11,242,175).
150 Here comes the directory listing.
-rw-r--rw- 1 0 0 5 May 15 14:03 down.txt
226 Directory send OK.
ftp> get down.txt
local: down.txt remote: down.txt
227 Entering Passive Mode (192,168,92,11,225,161).
150 Opening BINARY mode data connection for down.txt (5 bytes).
226 Transfer complete.
5 bytes received in 3.7e-05 secs (135.14 Kbytes/sec)
ftp> bye
221 Goodbye.
[root@ftpclient ~]# ll
total 8
-rw-------. 1 root root 1244 Apr 19 16:26 anaconda-ks.cfg
-rw-r--r-- 1 root root 5 May 23 14:04 down.txt
3、上传
[root@ftpclient ~]# echo "up" > ./up.txt
[root@ftpclient ~]# ll
total 12
-rw-------. 1 root root 1244 Apr 19 16:26 anaconda-ks.cfg
-rw-r--r-- 1 root root 5 May 23 14:04 down.txt
-rw-r--r-- 1 root root 3 May 23 14:06 up.txt
[root@ftpclient ~]# ftp 192.168.92.11
Connected to 192.168.92.11 (192.168.92.11).
220 Welcome to FTP service.
Name (192.168.92.101:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd course
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,92,11,153,193).
150 Here comes the directory listing.
-rw-r--rw- 1 0 0 5 May 15 14:03 down.txt
226 Directory send OK.
ftp> put up.txt
local: up.txt remote: up.txt
227 Entering Passive Mode (192,168,92,11,160,171).
150 Ok to send data.
226 Transfer complete.
3 bytes sent in 3.7e-05 secs (81.08 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,92,101,60,180).
150 Here comes the directory listing.
-rw-r--rw- 1 0 0 5 May 15 14:03 down.txt
-rw------- 1 14 50 3 May 15 14:07 up.txt
226 Directory send OK.
4、改名
ftp> rename up.txt up1.txt
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (192,168,92,101,65,206).
150 Here comes the directory listing.
-rw-r--rw- 1 0 0 5 May 15 14:03 down.txt
-rw------- 1 14 50 3 May 15 14:07 up1.txt
226 Directory send OK.
ftp> bye
221 Goodbye.
案例2:在案例1的基础上扩展。
(1)服务器上有两个本地账户user1和user2(如果没有账户,需要先创建账户,并在两个账户的家目录中分别以用户的身份创建user1.txt和user2.txt文件用于测试),user1账户在登录FTP服务器时,被限制在自己的工作目录中,user2账户在登录FTP服务器时,不限制。
(2)设置FTP服务器的最大并发连接数为1000。
(3)设置本地用户的上传和下载速度为50Kbit/s。
(1)、创建用户
[root@serverftp ~]# useradd user1
[root@serverftp ~]# useradd user2
[root@serverftp ~]# echo 123456 | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@serverftp ~]# echo 123456 | passwd --stdin user2
Changing password for user user2.
passwd: all authentication tokens updated successfully.
(2)、创建文件
[root@serverftp ~]# su - user1 -c "touch ~/user1.txt"
[root@serverftp ~]# su - user2 -c "touch ~/user2.txt"
[root@ftpserver ~]# vim /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
idle_session_timeout=800
data_connection_timeout=300
ftpd_banner=Welcome to FTP service.
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
anon_max_rate=8192
max_clients=500
max_per_ip=2
local_max_rate=40960
[root@serverftp ~]# echo "user1" > /etc/vsftpd/chroot_list
[root@serverftp ~]# systemctl restart vsftpd
user1
[root@client ~]# ftp 192.168.92.101
Connected to 192.168.92.101 (192.168.92.101).
220 Welcome to FTP service.
Name (192.168.92.101:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> exit
221 Goodbye.
user2
[root@client ~]# ftp 192.168.92.101
Connected to 192.168.92.101 (192.168.35.101).
220 Welcome to FTP service.
Name (192.168.92.101:root): user2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/user2"
ftp> bye
221 Goodbye.