FTP协议
一、FTP介绍
ftp(File Transfer Protocol)是早期的三个应用级协议之一,基于C/S结构,双通道协议,数据和命令连接,数据传输格式默认是二进制,当然也支持文本方式传输。默认情况下FTP协议使用TCP端口中的21和20这两个端口,其中20用于数据传输,21用作命令传输,但是20号端口是否作为数据传输的端口,这与FTP使用的传输模式有关,从FTP服务器的角度讲,FTP传输数据的模式分为主动模式和被动模式。主动模式就是服务器主动去连接客户端,被动模式就是客户端去连接服务器。不管FTP服务器工作在那个模式下,它的命令控制端口都监听在ftp服务器的tcp21端口,而主动模式(PORT)中数据传输端口是ftp服务器的20号端口去连接客户端的一个随机端口来传输数据,在被动模式(PASV)是客户端的一个随机端口去连接FTP服务端的一个随机端口,这样一来各位可能会有一个疑问就是在被动模式中,客户端怎么知道去连接那个端口和服务器连接传输数据呢?双方的随机端口怎么确认呢?它的工作流程是这样的,在被动模式中我们知道命令控制端口是连接FTP服务器的21号端口(这是默认情况,不更改其监听的端口),客户端连接服务端的时候就会和服务端协商,到底哪个端口来当做数据传输的端口啊,事实上被动模式或主动模式中数据传输端口是通过命令链路双方协商好的,主动模式的数据传输端口是通过命令连接告诉给服务端的,这样一来当我们需要下载数据时,服务端会以20端口去连接客户端的一个协商好的端口,同理被动模式中,数据端口也是双方协商好了的,在我们下载数据时,客户端会以一个随机端口去连接协商好的那个服务端的端口。
服务器被动模式数据端口示例
[ ~]#ftp 192.168.0.99 Connected to 192.168.0.99 (192.168.0.99). 220 (vsFTPd 3.0.2) Name (192.168.0.99: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,0,99,43,241). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 6 Oct 30 2018 pub 226 Directory send OK. ftp>
说明:我们可以看到消息状态为227的告诉我们被动模式(192.168.0.99,43,241)这是什么意思呢,其实它这就是告诉客户端我们连接服务端的那个端口,它的计算方式是这样的,以上为例它会去连接服务端的11249,这个端口就是通过43*256+241得来的,每传输一次数据都会协商好一个数据端口,这就是ftp工作在被动模式的端口确定方式。
227 Entering Passive Mode (192,168,0,99,201,83). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 1073741824 Dec 27 04:25 bigfile 226 Directory send OK. ftp> ! ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.0.99:51838 192.168.0.99:21 ESTAB 0 0 192.168.0.99:59860 192.168.0.99:3306 ESTAB 0 0 192.168.0.99:3306 192.168.0.99:59860 ESTAB 0 0 192.168.0.99:41319 192.168.0.232:1678 ESTAB 0 216 192.168.0.99:41319 192.168.0.232:1616 ESTAB 0 0 ::ffff:192.168.0.99:21 ::ffff:192.168.0.99:51838 ftp> get bigfile local: bigfile remote: bigfile 227 Entering Passive Mode (192,168,0,99,247,183). 150 Opening BINARY mode data connection for bigfile (1073741824 bytes).
说明:可看到命令链路上是客户端的一个随机端口连接服务端的21 端口 ,在下载数据时双方协定的端口是256×247+183,接下来我们在来看看服务端上的端口连接情况
[ ~]$ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.0.99:51838 192.168.0.99:21 ESTAB 0 0 192.168.0.99:59860 192.168.0.99:3306 ESTAB 0 0 192.168.0.99:3306 192.168.0.99:59860 ESTAB 204800 0 192.168.0.99:35409 192.168.0.99:63415 ESTAB 0 216 192.168.0.99:41319 192.168.0.232:1678 ESTAB 0 0 192.168.0.99:41319 192.168.0.232:1616 ESTAB 0 0 ::ffff:192.168.0.99:21 ::ffff:192.168.0.99:51838 ESTAB 0 0 ::ffff:192.168.0.99:63415 ::ffff:192.168.0.99:35409 [ ~]$bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty‘. 256*247+183 63415
说明:可以看到客户端的35409这个端口与服务端的63415连接着。63415就是在下载数据的时候双方协商好的数据传输端口
二、FTP软件介绍
FTP服务器软件有Wu-ftpd,Proftpd,Pureftpd,servU,IIS,vsftpd,在centos上默认的FTP服务器软件就是vsftpd,它号称是非常安全的FTPDaemon ,高速,稳定,下载速度是WU-FTP的两倍,官方数据告诉我们单机最多可支持15000个并发。听上去很牛逼的样子,接下来我们来看看它基本介绍
[ ~]#yum info vsftpd 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com 已安装的软件包 名称 :vsftpd 架构 :x86_64 版本 :3.0.2 发布 :25.el7 大小 :353 k 源 :installed 来自源:base 简介 : Very Secure Ftp Daemon 网址 :https://security.appspot.com/vsftpd.html 协议 : GPLv2 with exceptions 描述 : vsftpd is a Very Secure FTP daemon. It was written completely from : scratch. [ ~]#
说明:你看看它的简介就是说非常安全的FTP Daemon。具体它的并发能够达到多少,有待测试
在Linux系统上FTP客户端软件有,ftp,lftp,lftpget ,wget curl,其中ftp和lftp最为常用,ftp这个客户端工具一般用于测试,因为它不具备命令补全的功能,在生产环境中用起来不是很方便,还有就是它列出来的文件、目录,只能看文件属性信息里的‘-’,‘d’来区分,所以在字符界面一般我们都很少用ftp这个客户端,相反lftp就弥补了ftp的确定,受到大众的喜爱,它支持命令补全,我们用它就感觉是操作Linux文件系统一样。
ftp连接FTP服务器的使用方法:
[ ~]#ftp -A 192.168.0.99 2121 Connected to 192.168.0.99 (192.168.0.99). 220 (vsFTPd 3.0.2) Name (192.168.0.99:root): ftp 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. drwxr-xr-x 2 0 0 21 Dec 27 04:25 pub 226 Directory send OK. ftp> cd pub 250 Directory successfully changed. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 0 0 1073741824 Dec 27 04:25 bigfile 226 Directory send OK. ftp> bye 221 Goodbye. [ ~]#ftp -p 192.168.0.99 2121 Connected to 192.168.0.99 (192.168.0.99). 220 (vsFTPd 3.0.2) Name (192.168.0.99: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,0,99,20,204). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 21 Dec 27 04:25 pub 226 Directory send OK. ftp> cd pub 250 Directory successfully changed. ftp> ls 227 Entering Passive Mode (192,168,0,99,205,210). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 1073741824 Dec 27 04:25 bigfile 226 Directory send OK. ftp> bye 221 Goodbye. [ ~]#
说明:-A表示主动模式,-p(小写) 表示被动模式,centos系统上默认ftp客户端是使用的被动模式,这也说明了一点不同的客户端,其连接服务器的模式是不一样。
lftp连接ftp服务器的使用方法:
[ ~]#lftp -u ftp 192.168.0.99 -p 2121 口令: lftp [email protected]:~> ls drwxr-xr-x 2 0 0 21 Dec 27 04:25 pub lftp [email protected]:/> cd pub/ lftp [email protected]:/pub> ls -rw-r--r-- 1 0 0 1073741824 Dec 27 04:25 bigfile lftp [email protected]:/pub> bye [ ~]#lftp [email protected] -p 2121 口令: lftp [email protected]:~> ls drwxr-xr-x 2 0 0 21 Dec 27 04:25 pub lftp [email protected]:/> cd pub/ lftp [email protected]:/pub> ls -rw-r--r-- 1 0 0 1073741824 Dec 27 04:25 bigfile lftp [email protected]:/pub> bye [ ~]#
说明:-p是指定端口 -u 指定用户名,如果不用-u指定,可把用户名写在@前
还有一些别的客户端工具如浏览器,Windows的资源管理器,filezilla等等,这些都不在这里过多演示
三、FTP服务
1)状态码说明
1xx:表示信息类,比如125:表示数据连接打开
2xx:表示成功类状态,比如200:命令ok 230表示登录成功
3xx:表示补充类,比如331表示用户名OK
4xx:表示客户端错误,比如425表示不能打开数据链接
5xx:表示服务器错误,比如530表示不能登录
2)用户认证
支持匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务端专用用户,独立的用户/密码文件
四、vsftpd服务介绍
vsftpd由vsftpd包提供,默认不再由xinetd管理,当然我们是可以配置成非独立服务的,让它由xinetd服务代管。用户认证配置文件:/etc/pam.d/vsftpd,服务脚本:centos7上是/usr/lib/systemd/system/vsftpd.service,centos6上是/etc/rc.d/init.d/vsftpd;服务主配置文件是:/etc/vsftpd/vsftpd.conf
其中/etc/vsftpd/vsftpd.conf 可以通过man 5 vsftpd.conf 来查看配置文件帮助,它里面的格式是option=value的格式,等号前后不能有多余的空格,否则服务将无法正常启动。匿名用户(映射为系统用户ftp)共享文件位置上:/var/ftp,这个目录就是默认ftp的共享目录;系统用户共享文件位置就是用户的家目录;虚拟用户共享文件位置:为其映射的系统用户家目录
五、vsftpd服务配置
命令端口的配置:命令端口的指定由listen_port=xx来指定,不写在配置文件中表示使用默认的命令端口21
主动模式端口:connet_from_port_20=YES 表示主动模式端口为20;ftp_data_port=xx表示指定主动模式的端口,默认是20
被动端口范围:Linux客户端默认使用被动模式,Windows客户端默认使用主动模式;pasv_min_port=xxx;pasv_max_port=xxx通过这两条选项来指定ftp最小连接端口和最大的连接端口,这样配置后,数据端口就只能使用在指定这个范围内的端口。其中0表示随机分配端口
使用当地时间:use_localtime=YES默认的配置上是NO,使用GMT
关于匿名用户的配置:
anonymous_enable=YES 支持匿名用户
no_anon_password=YES(默认NO) 匿名用户略过口令检查
anon_world_readable_only (默认YES)只能下载全部读的文件
anon_upload_enable=YES 匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES 匿名建目录
anon_umask=0333 指定匿名上传文件的umask,默认077
anon_other_write_enable=YES 可删除和修改上传的文件
指定上传文件的默认的所有者和权限
chown_uploads=YES(默认NO)
chown_username=wang
chown_upload_mode=0644
关于Linux系统用户的配置
local_enable=YES 是否允许linux用户登录
write_enable=YES 允许linux用户上传文件
local_umask=022 指定系统用户上传文件的默认权限
guest_enable=YES 所有系统用户都映射成guest用户
guest_username=ftp 配合上面选项才生效,指定guest用户
local_root=/ftproot guest用户登录所在目录
这里需要注意一个点,映射成guest用户后,用户登录所指定的目录,不能有guest所指定的用户有可写的权限,否则用户无法登陆。也就是说ftp的根目录是不能有当前用户的写权限的。
禁锢所有系统用户在家目录中
chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户
chroot_list_enable=YES开启禁锢列表
chroot_list_file=/etc/vsftpd/chroot_list禁锢或不禁锢用户的名单文件,当chroot_local_user=YES时,则chroot_list中的用户不禁锢(白名单),当chroot_local_user=NO时,chroot_list中的用户禁锢(黑名单)
wu-ftp日志:默认启用
xferlog_enable=YES (默认) 启用记录上传下载日志
xferlog_std_format=YES (默认) 使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认)可自动生成
vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log(默认)可自动生成
登录提示信息
ftpd_banner=“welcome to mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt 优先上面的选项生效
目录访问提示信息
dirmessage_enable=YES (默认)
message_file=.message(默认) 信息存放在指定目录下.message
使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
- /etc/vsftpd/ftpusers 默认文件中用户拒绝登录,当然具体这里面的用户数拒绝还是允许需要看/etc/pam.d/vsftpd 是怎么定义的了