一、FTP服务概述
1.定义
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。主要是用来传输文件的协议。
默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于建立数据连接并传输数据,21用于奖励控制连接并传输控制信息。
2.数据连接
FTP数据连接分为主动模式和被动模式
主动模式
客户端给服务端的21控制端口发命令说,我要下载什么什么,并且还会说我已经打开了自己的某个端口,你就从这里把东西给我吧,服务器知道后就会连接客户端已打开的那个数据端口把东西传给客户端,这就是主动模式。可以理解为服务器主动发起数据连接。
被动模式
客户端给服务器端的21端口发命令说,我要下载什么什么,服务端知道后,就打开一个空闲的端口,然后告诉客户端,我已经打开了某某端口,你自己进去拿吧。于是客户端就从那个端口进去拿文件了,这就是被动模式.可以理解为服务器被动等待数据连接。
二、FTP配置
1.安装FTP服务
前置条件是服务端已经配置DHCP,配置本地yum源仓库,安装ftp服务并备份配置文件
[root@host ~]# yum install -y vsftpd
//查询ftp服务是否安装成功
[root@host ~]# ls /mnt/Packages/ | grep vsftpd
vsftpd-3.0.2-28.el7.x86_64.rpm
2.匿名账户的部署过程
查询配置文件并备份
//查询配置文件目录
[root@host ~]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
[root@host yum.repos.d]# cd /etc/vsftpd/
[root@host vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
//备份配置文件
[root@host vsftpd]# cp vsftpd.conf{,.bak}
[root@host vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd.conf.bak vsftpd_conf_migrate.sh
修改配置文件,设置软件级别的允许权限
[root@host vsftpd]#vim vsftpd.conf
//开启匿名用户访问
anonymous_enable=YES
//开放服务器的写权限(若要上传,必须开启)。默认已开启
write_enable=YES
//设置匿名用户所上传数据的权限掩码(反掩码)。
anon_umask=022
//允许匿名用户上传文件。默认已注释,需取消注释
anon_upload_enable=YES
//允许匿名用户创建(上传)目录。默认已注释,需取消注释
anon_mkdir_write_enable=YES
//允许删除、重命名、覆盖等操作。需添加
anon_other_write_enable=YES
设置系统级别的权限
[root@host ~]# cd /var/ftp/
[root@host ftp]# mkdir aaa
[root@host ftp]# ll
总用量 0
drwxr-xr-x. 2 root root 6 4月 18 16:37 aaa
drwxr-xr-x. 2 root root 6 10月 14 2020 pub
//给aaa目录以及子目录文件所有权限
[root@host ftp]# chmod 777 /var/ftp/aaa/
[root@host ftp]# ll
总用量 0
drwxrwxrwx. 2 root root 6 4月 18 16:37 aaa
drwxr-xr-x. 2 root root 6 10月 14 2020 pub
[root@host ftp]# cd aaa/
[root@host aaa]# ls
[root@host aaa]# echo 'helloworld' > abc.txt
[root@host aaa]# ls
abc.txt
[root@host aaa]# cat abc.txt
开启服务,关闭防火墙和增强型安全功能
[root@host ftp]# systemctl start vsftpd
//设置开机自启
[root@host ftp]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@host ftp]# systemctl stop firewalld
[root@host ftp]# setenforce 0
匿名访问测试
在Windows系统打开 开始 菜单,输入 cmd 命令打开命令提示符,测试是否能连接上
//建立ftp连接
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
//匿名访问,用户名为ftp,密码为空,直接回车即可完成登录
用户(192.168.223.100:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp>
在windows系统中执行常用命令
//匿名访问ftp的根目录为Linux系统的/var/ftp/目录
ftp> pwd
257 "/"
//查看当前目录
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
aaa
pub
226 Directory send OK.
ftp: 收到 13 字节,用时 0.00秒 13000.00千字节/秒。
//切换到aaa 目录
ftp> cd aaa
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
abc.txt
226 Directory send OK.
ftp: 收到 12 字节,用时 0.01秒 0.80千字节/秒。
//下载文件到当前Windows本地目录(C:\Users\Tang目录)
ftp> get abc.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for abc.txt (11 bytes).
226 Transfer complete.
ftp: 收到 11 字节,用时 0.00秒 11000.00千字节/秒。
ftp> quit
421 Timeout.
//切换下载或上传目录即切换windows虚拟机的cmd目录
C:\Users\Tang>cd C:\Users\Tang\Desktop
C:\Users\Tang\Desktop>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
//匿名访问,用户名为ftp,密码为空,直接回车即可完成登录
用户(192.168.223.100:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp>
//将桌面的123.txt文件上传到服务端(C:\Users\Tang\Desktop)
ftp> cd aaa
250 Directory successfully changed.
ftp> put 123.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 12 字节,用时 0.00秒 12000.00千字节/秒。
3.本地用户的部署过程
命令操作进行进行连接服务端
备份配置文件
[root@host aaa]# cd /etc/vsftpd/
[root@host vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd.conf.bak vsftpd_conf_migrate.sh
//备份文件
[root@host vsftpd]# cp vsftpd.conf vsftpd.conf.bak1
[root@host vsftpd]# ls
ftpusers vsftpd.conf vsftpd.conf.bak1
user_list vsftpd.conf.bak vsftpd_conf_migrate.sh
修改配置文件,设置软件级别的允许权限
[root@host vsftpd]# vim vsftpd.conf
//关闭匿名用户访问
anonymous_enable=NO
//启用本地用户
local_enable=YES
//开放服务器的写权限(若要上传,必须开启)。默认已开启
write_enable=YES
//可设置仅宿主用户拥有被上传的文件的权限(反掩码)
local_umask=077
添加本地用户zhangsan、lisi
[root@host vsftpd]# useradd zhangsan
[root@host vsftpd]# useradd lisi
[root@host vsftpd]# echo '123456' | passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@host vsftpd]# echo '123123' | passwd --stdin lisi
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
//重启服务
[root@host vsftpd]# systemctl restart vsftpd
在Windows系统打开 开始 菜单,输入 cmd 命令打开命令提示符,测试匿名用户和本地用户是否能连接上
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): zhangsan
331 Please specify the password.
密码:
230 Login successful.
ftp> quit
221 Goodbye.
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): ftp
331 Please specify the password.
密码:
530 Login incorrect.
登录失败。
ftp>
测试相关命令
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): zhangsan
331 Please specify the password.
密码:
230 Login successful.
//查询目录为本地用户的家目录
ftp> pwd
257 "/home/zhangsan"
ftp>
设置本地用户无法访问其他目录,但有写的权限
[root@host vsftpd]# vim vsftpd.conf
//将访问禁锢在用户的宿主目录中
chroot_local_user=YES
//允许被限制的用户主目录具有写权限
allow_writeable_chroot=YES
测试能否切换目录
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): zhangsan
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/"
ftp> cd /etc
550 Failed to change directory.
图形化操作进行连接服务端
在服务端创建数据方便客户端查看
[root@host ~]# su - zhangsan
上一次登录:二 4月 18 18:29:56 CST 2023pts/1 上
mount: 只有 root 能执行该操作
[zhangsan@host ~]$ mkdir 321
[zhangsan@host ~]$ touch abc.txt
[zhangsan@host ~]$ ll
总用量 0
drwxrwxr-x. 2 zhangsan zhangsan 6 4月 18 18:31 321
-rw-rw-r--. 1 zhangsan zhangsan 0 4月 18 18:31 abc.txt
[zhangsan@host ~]$
在windows虚拟机上的文件地址栏上输入
ftp://192.168.223.100
命令进入服务端,输入本地用户的账号与密码即可登录成功
4.其他部署操作
修改本地用户登录的默认根目录(匿名用户可以同样设置)
添加本地用户默认根目录
//创建
[root@host var]# mkdir home
[root@host var]# cd home/
[root@host home]# mkdir test
[root@host ~]# vim /etc/vsftpd/vsftpd.conf
//anon_root 针对匿名用户
anon_root=/var/www/html
//local_root 针对系统用户
local_root=/var/home
[root@host ~]# systemctl restart vsftpd
在windows系统的虚拟机测试本地用户根目录
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): zhangsan
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
test
226 Directory send OK.
ftp: 收到 9 字节,用时 0.00秒 9000.00千字节/秒。
黑名单设置
设置zhangsan为黑名单
//使用user_list 用户列表文件
[root@host vsftpd]# vim /etc/vsftpd/user_list
//末尾添加zhangsan用户
zhangsan
[root@host vsftpd]# vim /etc/vsftpd/vsftpd.conf
//启用user_list用户列表文件
userlist_enable=YES
//若不添加userlist_deny,默认为YES,为黑名单,禁用
//重启服务
[root@host vsftpd]# systemctl restart vsftpd
在windows系统的虚拟机测试zhangsan是否为黑名单,是否能登陆,测试lisi是否能登陆
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): zhangsan
530 Permission denied.
登录失败。
ftp> quit
221 Goodbye.
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): lisi
331 Please specify the password.
密码:
230 Login successful.
ftp>
白名单设置
设置zhangsan为白名单
[root@host vsftpd]# vim /etc/vsftpd/vsftpd.conf
//启用user_list用户列表文件
userlist_enable=YES
//设置白名单,仅允许user_list用户列表文件的用户访问
userlist_deny=NO
//重启服务
[root@host vsftpd]# systemctl restart vsftpd
在windows系统的虚拟机测试zhangsan是否为白名单,是否能登陆,测试lisi是否能登陆
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): zhangsan
331 Please specify the password.
密码:
230 Login successful.
ftp> quit
221 Goodbye.
C:\Users\Tang>ftp 192.168.223.100
连接到 192.168.223.100。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.223.100:(none)): lisi
530 Permission denied.
登录失败。
ftp>