文章目录
FTP 服务
课程目标
- 了解FTP服务器的应用场景
- 了解FTP服务器的两种工作模式
- 掌握FTP服务的基本配置
- 能够根据需求对FTP进行访问控制
一、FTP服务介绍
FTP(File Transfer Protocol)是一种应用非常广泛并且古老的一个互联网文件传输协议。
- 主要用于互联网中文件的双向传输(上传和下载)、文件共享
- 跨平台:Linux 、Windows
- FTP是C/S架构,拥有一个客户端和服务端,使用TCP协议作为底层传输协议,提供可靠的数据传输
- FTP的默认端口是21号(命令端口),20号(数据端口) 默认被动模式下
- FTP程序(软件)vsftpd
二、搭建简易的FTP服务器
思路:
- 关闭防火墙和selinux
- 配置yum源
- 软件三步曲(安装 | 确认 | 查看软件列表)
- 了解配置文件 ——>(man 5 xxx.conf)
- 根据需求通过修改配置文件来完成服务的搭建
- 启动服务,开机自启动
- 测试验证
简易ftp服务器如下:(只能下载,不能上传)
[root@ftp-server ~]# cd /var/ftp
[root@ftp-server ftp]# ls
pub
[root@ftp-server ftp]# touch file{1..5}
[root@ftp-server ftp]# ls
file1 file2 file3 file4 file5 pub
在浏览器搜索ftp://10.1.1.2或者在Windows文件资源管理器搜索都会找到相关文件
三、FTP服务的客户端工具
Linux:ftp、lftp(客户端程序)
Windows:FileZilla、IE、Chrome、Firefox
lftp和ftp工具区别:
- lftp可以批量并且下载目录
lftp localhost:~> mirror remote local 下载整个目录到本地 lftp localhost:~> mirror -R local remote rename 上传整个目录到远程同时可以重命名
四、FTP服务的两种工作模式
- 主动模式
- 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的21号端口发起请求
- 服务端的21号命令端口响应客户端的随机命令端口
- 服务端的20号端口主动请求连接客户端的随机数据端口
- 客户端的随机数据端口进行确认
- 被动模式
五、FTP服务的基本配置
1. FTP服务的基本应用
默认安装:没有任何需求
环境:server:FTP-server 10.1.1.2
client:10.1.1.3
1.1 关闭防火墙和selinux
chkconfig iptables off
vim /etc/sysconfig/selinux
SELINUX=disabled
临时关闭 setenforced 0 和 service iptables stop
1.2 配置yum源
略
1.3 软件三步曲(安装 | 确认 | 查看软件列表)
- 安装软件
[root@ftp-server ~]# yum -y install vsftpd
- 确认安装成功
[root@ftp-server ~]# rpm -q vsftpd
vsftpd-2.2.2-11.el6_4.1.x86_64
- 查看配置文件
[root@ftp-server ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd // 日志轮转的文件
/etc/pam.d/vsftpd // 安全认证相关的文件
/etc/rc.d/init.d/vsftpd // 启动脚本
/etc/vsftpd // 配置文件的主目录
/etc/vsftpd/ftpusers // 用户列表文件 黑名单
/etc/vsftpd/user_list // 用户列表文件 (默认黑名单,可黑可白)
/etc/vsftpd/vsftpd.conf // 主配置文件
/usr/sbin/vsftpd // 二进制命令
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS // 虚拟主机
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS/README
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS // 虚拟用户
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/README
/usr/share/man/man5/vsftpd.conf.5.gz // man文档
/var/ftp // 匿名用户的默认数据根目录
/var/ftp/pub // 匿名用户的默认数据目录的扩展目录
1.4 了解配置文件 ——>(man 5 xxx.conf)
[root@ftp-server ~]# grep -v ^# /etc/vsftpd/vsftpd.conf
anonymous_enable=YES // 支持匿名用户访问
local_enable=YES // 严格来说是非匿名用户,可以理解为本地用户
write_enable=YES // 写总开关
local_umask=022 // 反掩码 (file 644) (dir 755)
dirmessage_enable=YES // 启用消息功能
xferlog_enable=YES // 开启xferlog日志
connect_from_port_20=YES // 支持主动模式20号(默认被动模式)
xferlog_std_format=YES // xferlog日志格式
listen=YES // 独立模式下监听,如果托管给xinetd,需改为NO
pam_service_name=vsftpd // 指定认证文件
userlist_enable=YES // 启用用户列表
tcp_wrappers=YES // 支持tcp_wrappers功能
1.5 根据需求通过修改配置文件来完成服务的搭建
[root@ftp-server ~]# man 5 vsftpd.conf
1.6 启动服务,开机自启动
[root@ftp-server ~]# chkconfig --list |grep vsftpd
vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@ftp-server ~]# chkconfig vsftpd on
[root@ftp-server ~]# chkconfig --list |grep vsftpd
vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@ftp-server ~]# netstat -nltp|grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1853/vsftpd
1.7 测试验证
client:
[root@client ~]# yum -y install ftp lftp
[root@client ~]# ftp 10.1.1.2
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): ftp // 匿名用户ftp
331 Please specify the password.
Password: // 无需密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ? // 命令帮助
Commands may be abbreviated. Commands are:
ftp> lcd /tmp // 切换到外部目录
Local directory now /tmp
ftp> get file1
local: file1 remote: file1
227 Entering Passive Mode (10,1,1,2,106,228).
150 Opening BINARY mode data connection for file1 (0 bytes).
226 Transfer complete.
ftp> lcd /root
Local directory now /root
ftp> put install.log
local: install.log remote: install.log
227 Entering Passive Mode (10,1,1,2,209,19).
550 Permission denied. // 权限拒绝
此时看ftp-server 端
[root@ftp-server ftp]# ls
file1 file2 file3 file4 file5 pub
[root@ftp-server ftp]# pwd
/var/ftp
[root@ftp-server ftp]# ll -d
drwxr-xr-x 3 root root 4096 Apr 20 16:51 .
说明这个目录没有写权限,但是修改后仍然会出现拒绝,那就考虑服务端不允许匿名用户上传文件,应该修改配置文件
接下来用lftp来尝试验证
[root@client ~]# lftp 10.1.1.2
lftp 10.1.1.2:~> // 直接登录,默认匿名用户
lftp 10.1.1.2:~>
lftp 10.1.1.2:~> ls
-rw-r--r-- 1 0 0 0 Apr 20 08:51 file1
-rw-r--r-- 1 0 0 0 Apr 20 08:51 file2
-rw-r--r-- 1 0 0 0 Apr 20 08:51 file3
-rw-r--r-- 1 0 0 0 Apr 20 08:51 file4
-rw-r--r-- 1 0 0 0 Apr 20 08:51 file5
drwxr-xr-x 2 0 0 4096 Mar 01 2013 pub
lftp 10.1.1.2:/> put install.log
put: Access failed: 550 Permission denied. (install.log) // 同样不能上传
lftp 10.1.1.2:~> user liuwei // 切换本地用户
先在服务端ftp-server切换到liuwei用户,然后在家目录下创建test1文件,继续测试
lftp liuwei@10.1.1.2:~> get test1
12 bytes transferred
lftp liuwei@10.1.1.2:~> exit
[root@client ~]# ls
anaconda-ks.cfg install.log install.log.syslog test1
[root@client ~]# lftp liuwei@10.1.1.2
Password:
lftp liuwei@10.1.1.2:~> put install.log
51880 bytes transferred // 上传成功
在ftp-server端liuwei用户家目录下
[liuwei@ftp-server ~]$ ll -d
drwx------. 27 liuwei liuwei 4096 Apr 20 19:03 .
显然liuwei有对家目录的写权限
本地用户之所以能上传,是因为第一个是对家目录有权限,第二个是配置文件写开关是打开的
总结:
- ftp 默认使用用户名和密码登录 -->ftp 或 匿名用户anonymous
- lftp 默认使用的匿名用户登录 --> lftp 10.1.1.2:/> user username 或者 lftp user@10.1.1.2
- 工具不知道怎么用,在里面输入 ? 或者man ftp或lftp
- 匿名用户可以下载文件但是不能上传文件
- 本地用户可以上传和下载文件
需求1:允许匿名用户上传文件
[root@ftp-server ftp]# pwd
/var/ftp
[root@ftp-server ftp]# cd /etc/vsftpd/
[root@ftp-server vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@ftp-server vsftpd]# vim vsftpd.conf
[root@ftp-server vsftpd]# grep -v ^# vsftpd.conf |tee vsftpd.conf.bak
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
增加以下内容:
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
重启vsftpd服务
lftp 10.1.1.2:/> put install.log
put: Access failed: 553 Could not create file. (install.log)
不能去创建文件,查看服务端/var/ftp/的权限
[root@ftp-server vsftpd]# ll -d /var/ftp/
drwxr-xr-x 3 root root 4096 Apr 20 16:51 /var/ftp/
[root@ftp-server vsftpd]# chmod o+w /var/ftp/ // 增加权限
lftp 10.1.1.2:/> put install.log
51880 bytes transferred // 测试成功
[root@ftp-server vsftpd]# ls /var/ftp
file1 file2 file3 file4 file5 install.log pub // 多了一个install.log 成功
总结:第一,服务本身是否允许,第二,目录是否有权限
修改权限后,重新连接,发现如下图的错误:
出现这个错误的原因是匿名用户的目录权限太大了,将目录权限改回后不再报错。
将pub的目录权限变大,cd pub,然后上传下载
需求2:下载其他匿名用户上传的文件
[root@ftp-server pub]# ll
total 52
-rw------- 1 ftp ftp 51880 Apr 20 20:35 install.log
[root@client ~]# lftp 10.1.1.2
lftp 10.1.1.2:~> cd pub/
lftp 10.1.1.2:/pub> ls
-rw------- 1 14 50 51880 Apr 20 12:35 install.log //上次匿名用户上传的
lftp 10.1.1.2:/pub> lcd /tmp
lcd ok, local cwd=/tmp
lftp 10.1.1.2:/pub> get install.log
get: Access failed: 550 Failed to open file. (install.log) // 注意权限,匿名用户作为其他人不能下载前匿名用户上传的文件
怎么控制上传文件的权限?
man 5 vsftpd.conf anon_umask默认为077,所以文件权限600
[root@server vsftpd]# vim vsftpd.conf
anon_umask=022 // 对应文件权限644
[root@server vsftpd]# service vsftpd restart
在客户端匿名用户测试验证
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (10,1,1,2,203,47).
150 Here comes the directory listing.
-rw------- 1 14 50 51880 Apr 20 12:35 install.log
-rw-r--r-- 1 14 50 10225 Apr 20 13:14 install.log.syslog
226 Directory send OK.
ftp> lcd /tmp
Local directory now /tmp
ftp> get install.log.syslog
local: install.log.syslog remote: install.log.syslog
227 Entering Passive Mode (10,1,1,2,32,0).
150 Opening BINARY mode data connection for install.log.syslog (10225 bytes).
226 Transfer complete. //修改anon_umask=022后下载成功
10225 bytes received in 4e-05 secs (255625.01 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,1,1,2,249,53).
150 Here comes the directory listing.
-rw------- 1 14 50 51880 Apr 20 12:35 install.log
-rw-r--r-- 1 14 50 10225 Apr 20 13:14 install.log.syslog
226 Directory send OK.
ftp> lcd /tmp
Local directory now /tmp
ftp> get install.log
local: install.log remote: install.log
227 Entering Passive Mode (10,1,1,2,64,152).
550 Failed to open file. // 失败的原因是该文件是修改前上传的文件,权限不够,无法下载
需求3:开启本地用户消息功能
- 本地用户访问–>/home/username
- 匿名用户访问–>/var/ftp
第一种方式是在访问目录下创建 .message文件,如下:
消息功能默认开启
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
dirmessage_enable=YES
[root@server ~]# echo "welcome to anon home" >/var/ftp/.message // 匿名用户
[liuwei@server ~]$ echo "welcome to myhome" > .message // 本地用户
客户端测试
本地用户liuwei登录
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): liuwei
331 Please specify the password.
Password:
230-welcome to myhome // 消息出现
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
匿名用户ftp登录
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): ftp
331 Please specify the password.
Password:
230-welcome to anon home // 消息出现
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
第二种方式如下:
1.修改配置文件指定消息文件
banner_file=/etc/vsftpd/banner_file
2.创建消息文件
vim /etc/vsftpd/banner_file
2019-4-22
重启服务
3.测试验证
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220-2019-4-22
220
Name (10.1.1.2:root):
需求4:禁锢本地用户的家,只能在自己的家中活动
- 禁锢所有的本地用户
打开原始配置文件/opt/vsftpd.conf查看
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
#chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
#
[root@server vsftpd]# vim vsftpd.conf
chroot_local_user=YES // 添加此行
重启服务后测试验证
ftp> pwd
257 "/"
ftp> cd /etc/
550 Failed to change directory.
ftp> cd /home
550 Failed to change directory.
- 禁锢大部分用户,允许小部分
chroot_local_user=YES
chroot_list_enable=YES // 启用用户文件列表
chroot_list_file=/etc/vsftpd/chroot_list // 定义用户文件列表
[root@server vsftpd]# echo liuwei >chroot_file
[root@server vsftpd]# service vsftpd restart
测试成功,liuwei相当于“VIP用户”,不止在当前用户目录操作
添加一个新用户stu1对比测试
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220-2019-4-22
220
Name (10.1.1.2:root): stu1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" // “/”表示当前用户家目录,该用户被禁锢
- 禁锢小部分用户,允许大部分
chroot_local_user=YES // 改为NO 或者注释#
chroot_list_enable=YES // 启用用户文件列表
chroot_list_file=/etc/vsftpd/chroot_list // 定义用户文件列表
将小部分用户添加到chroot_list中,被禁锢
测试验证
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220-2019-4-22
220
Name (10.1.1.2:root): stu1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
需求5:指定匿名用户和本地用户上传文件的目录
按照如下要求搭建一个ftp服务器:
1) 允许匿名用户上传文件,并且可以下载其他用户上传的文件
anon_upload_enable=YES
anon_umask=022
2)匿名用户上传的文件都保存在/anon/data里
默认情况:/var/ftp
mkdir /anon/data -p
vim /etc/vsftpd/vsftpd.conf
…
anon_root=/anon/data
3)本地用户上传的文件都保存到/local/data里
默认情况:/home/username
mkdir /local/data -p
…
local_root=/local/data
4)禁锢所有用户的家,不能来回跳转
chroot_local_user=YES