FTP简介
FTP文件传输协议(File Transfer Protocol),用于Internet上的控制文件的双向传输,是一个应用程序。工作在TCP/IP协议族的应用层,其传输层协议是TCP协议,目的在于提高文件传输的共享性和可靠性,是基于客户/服务器模式工作的
FTP协议
FTP会建立两个连接,将命令与数据分开传输,正是因为这样,提高了传输效率。
连接端口 作用
控制端口:21 基于tpc协议,建立控制连接
传输端口:20 上传/下载文件
每一个FTP命令发送后,FTP服务器就会返回一个字符串,其中包含一个响应码和一些说明信息,其中响应码主要用于判断命令是否被成功执行。
FTP客户端与服务端的沟通流程
步骤:
-
建立控制连接
客户端以一个随机端口(大于1023)以TCP层根据服务器的IP,三次握手之后与服务端的21端口建立连接。这个TCP连接称为控制连接,用户发出的FTP命令和服务器的回应都是依靠该连接来传送的,在用户退出前一直存在。 -
建立数据连接
在控制连接的基础上,客户端会以控制连接的随机端口+1的端口号来对服务端进行连接 -
关闭FTP
当用户退出FTP时,客户端发送退出命令,之后控制连接被关闭,FTP服务结束。
FTP主动模式和被动模式
FTP 是仅基于 TCP 的服务,不支持 UDP,与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)但FTP工作方式的不同。数据端口并不是20。这就是主动与被动FTP的最大不同之处。
- 主动FTP:服务器主动通过20号端口给用户传输数据。
在主动模式下:客户端从一个任意的非特权端口N(N>1024)连结到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令 “port N+1” 到FTP服务器。服务器接收到命令后,会用其本地的FTP数据端口 (通常是20)来连接客户端指定的端口N+1,进行数据传输。
针对FTP服务器前面的防火墙来说,必须允许下以通讯才能支持主动方式FTP:
1,任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)。
2,FTP服务器的21端口到大于1024的端口。(服务器相应客户端的控制端口)。
3,FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
4,大于1024端口到FTP副武器的30端口(客户端发送ack响应到服务器的数据端口)。
主动模式:客户端和服务端通过21号端口建立控制通道(传输用户名和密码以及控制指令),然后再通过20号端口传输数据。即主动模式下,ftp客户端和服务器通过21和20两个端口建立两个链接。
- 被动ftp:
为了解决服务器发起到客户的链接的问题,人们开发了一种不同的FTP链接方式,这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器他处于被动模式时才启用。
在被动方式FTP中,命令链接和数据链接都有客户端发起,这样就可以解决从服务器到客户端的数据端口的入口方向连接被防火墙过滤掉的问题。
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起链接,同事会开启N+1号端口,然后向服务器发送PASV命令,通知服务器自己处于被动模式,服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1 号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1,从任何大于1024的端口到服务器的21端口(客户端初始化的连接 )。
2 , 服务器的21端口到任何大于1024的端口(服务器相应到客户端的控制端口的连接)。
3,从任何大于1024端口的服务器到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)。
4,服务器的大于1024端口到远程的大于的1024的端口(服务器发送ACk相应数据到客户端的数据端口)。
认证方式
1.匿名登录
2.服务器上系统用户登录
3.虚拟账户登录
匿名登录
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf 修改主配置文件
......
anonymous_enable=YES
......
local_umask=022
anon_umask=022 为上传的文件设置默认权限
......
anon_upload_enable=YES 设置上传权限
#
......
# new
anon_mkdir_write_enable=YES 为ftp用户设置写权限
anon_other_write_enalbe=YES 为ftp账户设置删除权限
[root@localhost vsftpd]# setfacl -m u:ftp:rwx /var/ftp/pub/ 设置文件特殊控制,将匿名用户ftp设置与共享文件的高级权限
[root@localhost vsftpd]# getfacl /var/ftp/pub/
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/pub/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x
[root@localhost vsftpd]# systemctl enable --now vsftpd 启动服务
验证效果图:
本来为空文件,从电脑中可以上传文件到此目录
系统用户登录
[root@localhost vsftpd]# useradd ftp_user 添加用户,共享用户的家目录
[root@localhost vsftpd]# id ftp_user
uid=1000(ftp_user) gid=1000(ftp_user) groups=1000(ftp_user)
[root@localhost vsftpd]# passwd ftp_user 为用户设置密码
Changing password for user ftp_user.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully
验证:
虚拟账户登录
[root@client ~]# useradd -d /var/ftproot/ -s /sbin/nologin test
[root@client ~]# idtest
-bash: idtest: command not found
创建系统用户。家目录即为共享目录
vsftpd配置目录下新建虚拟账户及密码
[root@client ~]# id test
uid=1001(test) gid=1001(test) groups=1001(test)
[root@client vsftpd]# cat vu.list
a
123
b
123
c
123
对虚拟账号进行加密操作
[root@client vsftpd]# db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db
为两个用户文件设置权限
[root@client vsftpd]# chmod 600 vu.*
备份用户配置文件
[root@client vsftpd]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
[root@client vsftpd]# vim /etc/pam.d/vsftpd
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
auth required pam_userdb.so db=/etc/vsftpd/vu
account required pam_userdb.so db=/etc/vsftpd/vu
[root@client vsftpd]# vim vsftpd.conf
.......
# Make sure, that one of the listen options is commented !!
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
guest_enable=YES
guest_username=test 指定用户名
user_config_dir=/etc/vsftpd/share_dir 指定虚拟账户配置文件的地址
allow_writeable_chroot=YES
[root@client vsftpd]# cd /etc/vsftpd/share_dir/
[root@client share_dir]# touch it 在配置文件下新建单个虚拟账户的配置文件
[root@client share_dir]# vim it
anon_upload_enable=YES 为虚拟用户it配置上传权限
anon_mkdir_write_enable=YES 写入权限