FTP 服务

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服务的两种工作模式

  • 主动模式

在这里插入图片描述

  1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的21号端口发起请求
  2. 服务端的21号命令端口响应客户端的随机命令端口
  3. 服务端的20号端口主动请求连接客户端的随机数据端口
  4. 客户端的随机数据端口进行确认
  • 被动模式

在这里插入图片描述

五、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:禁锢本地用户的家,只能在自己的家中活动
  1. 禁锢所有的本地用户
打开原始配置文件/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.
  1. 禁锢大部分用户,允许小部分
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 "/"			///”表示当前用户家目录,该用户被禁锢

  1. 禁锢小部分用户,允许大部分
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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值