端口
TCP 21 命令
TCP 20 数据
模式:
被动模式
主动模式:服务器使用20 端口连接客户端
主动模式FTP
主动模式下,FTP客户端从任意的非特殊端口(N>1023)连入到 FTP服务器的命令端口–21端口。然后客户端在N+1(N+1>=1024)端口监听,并且在N+1(N+1>=1024)端口发送命令给FTP服务器,服务器会反过来连接用户本地指定的数据端口,比如20端口:
- FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
- FTP服务器命令(21)端口到客户端端口(服务器响应客户端命令)
- FTP服务数据(20)端口到客户端端口(>1023)(服务器初始化数据连接到客户端数据端口)
- FTP服务器数据(20)端口接受客户端端口(>1023)(客户端发送ACK包到服务器的数据端口)
工作过程:
- 客户端以随机非特权端口N,就是大于1024的端口,对server端21端口发起连接
- 客户端开始监听 N+1端口;
- 服务端会主动以20端口连接到客户端的N+1端口。
优点:
服务端配置简单,利于服务器安全管理,服务器只需要开放21端口
缺点:
如果客户端开启了防火墙,或客户端处于内网(NAT网关之后), 那么服务器对客户端端口发起的连接可能会失败
被动模式FTP
在被动操作模式下,则FTP服务器是被动的等待,等待 客户段与其的20号端口建立连接,被动模式是指服务器被动地等待客户端连接自己的数据端口
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORTP命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
-
FTP服务器命令(21)端口接受客户端任意端口(客户端的初始连接)
-
FTP服务器命令(21)端口到客户端端口(服务器响应客户端命令)
-
FTP服务器数据端口(任意)接受客户端端口(客户端初始化数据连接到服务器指定的任意端口)
-
FTP服务器数据端口(任意)到客户端端口(服务器发送ACK响应和数据到客户端的数据端口)
工作过程:
- 客户端以随机非特权端口连接服务端的21端口
- 服务端开启一个非特权端口为被动端口,并返回给客户端
- 客户端以非特权端口+1的端口主动连接服务端的被动端口
缺点:
服务器配置管理稍显复杂,不利于安全,服务器需要开放随机高位端口以便客户端可以连接,因此大多数FTP服务软件都可以手动配置被动端口的范围
优点:
对客户端网络环境没有要求
主被动模式比较
主动模式FTP对服务器管理有利,是由FTP主动与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞。
被动模式对客户端管理有利,它是企图与服务器的随机端口建立连接但又可能被服务器的防火墙拒绝
FTP的用户
- 匿名用户
- 系统用户
- 虚拟用户
- 主配置文件
/etc/vsftpd/vsftpd.conf
- 从配置文件
/var/ftp/pub
- 默认分享文件目录为
/var/ftp/pub
案例
1.匿名用户
修改配置文件中匿名上传的相关选项
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@localhost ftp]# chmod 777 pub/
[root@localhost ftp]# systemctl restart vsftpd
测试可以上传下载但是不能删除
修改配置文件添加删除权限
anon_other_write_enable=YES
2.本地用户
开启本地用户权限
anonymous_enable=NO
-
匿名用户登录看到的是/var/ftp/pub目录,本地用户看到的是自己的家目录
-
遍历
首先开启chroot选项
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
allow_writeable_chroot=YES
//通过chroot对用户宿主目录实现禁锢
chroot_local_user=YES
//指定本地用户不能chroot,不能翻
chroot_list_enable=YES
//通过列表的方式来指定用户
chroot_list_file=/etc/vsftpd/chroot_list
//指定用户列表文件
[root@localhost vsftpd]# vim chroot_list
//创建用户列表目录
redhat
-
当chroot_list_enable=YES,chroot_local_user=YES,在列表中列出的用户可以切换到 / 目录;没有列出的用户,不能切换到其他目录
-
当chroot_list_enable=YES,chroot_local_user=NO,在列表中列出的用户不能切换到 / 目录;没有列出的用户,可以切换到 / 目录
-
当chroot_list_enable=NO,chroot_local_user=YES,所有的用户均不能切换到 / 目录
-
当chroot_list_enable=NO,chroot_local_user=NO,所有的用户都可以切换到 / 目录
3.虚拟用户
创建系统用户,禁止该用户进行登录
[root@localhost ~]# useradd -s /sbin/nologin vhaha
[root@localhost ~]# chmod 704 /home/vhaha/
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vhaha
virtual_use_local_privs=YES
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vhaha // 一行用户名,一行密码
abc
redhat
xyz
redhat
xixi
redhat
[root@localhost vsftpd]# db_load -T -t hash -f vhaha vhaha.db //将虚拟用户文件转换成用户数据库文件
[root@localhost vsftpd]# chmod 600 vhaha.db
查看虚拟用户数据库文件权限:
[root@localhost vsftpd]# ll /home/vhaha/ -d
drwx---r--. 3 vhaha vhaha 74 Apr 11 22:23 /home/vhaha/
编辑认证配置文件:
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd
注释所有内容,添加两行信息
auth required pam_userdb.so db=/etc/vsftpd/vhaha
account required pam_userdb.so db=/etc/vsftpd/vhaha
注:(.so动态连接库)数据文件名".db"不用输入