1. ftp简介
网络文件共享服务主流的主要有三种,分别是ftp、nfs、samba。
FTP是File Transfer Protocol(文件传输协议)的简称,用于internet上的控制文件的双向传输。
FTP也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
在FTP的使用当中,经常遇到两种概念:下载和上传
下载(Download) | 上传(Upload) |
---|---|
从远程主机拷贝文件至自己的计算机上 | 将文件从自己的计算机上拷贝至远程主机上 |
2.ftp架构
FTP工作于应用层,监听于tcp的21号端口,是一种C/S架构的应用程序。其有多种客户端和服务端的应用程序,下面来简单介绍一下
客户端工具 服务端软件
ftp
lftp,lftpget
wget,curl
filezilla
gftp(Linux GUI)
商业软件(flashfxp,cuteftp) wu-ftpd
proftpd(提供web接口的一种ftp服务端程序)
pureftp
vsftpd(Very Secure)
ServU(windows平台的一种强大ftp服务端程序)
3. ftp数据连接模式
ftp有2种数据连接模式:命令连接和数据连接
命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止
数据连接:是指数据传输,按需创建及关闭的连接
其中数据连接需要关注的有2点,一是数据传输格式,二是数据传输模式
数据传输格式有以下两种:
文件传输
二进制传输
数据传输模式也有2种:
主动模式:由服务器端创建数据连接
被动模式:由客户端创建数据连接
两种数据传输模式的建立过程:
传输模式 建立过程
主动模式 命令连接:
Client(1025)–> Server(21)
客户端以一个随机端口(大于1023)来连服务器端的21号端口
数据连接:
Server(20/tcp) --> Client(1025+1)
服务器端以自己的20号端口去连客户端创建命令连接时使用的随机端口+1的端口号
被动模式 命令连接:
Client(1110) --> Server(21)
客户端以一个随机端口来连成服务器端的21号端口
数据连接:
Client(1110+1) --> Server(随机端口)
客户端以创建命令连接的端口+1的端口号去连服务器端通过命令连接告知自己的一个随机端口号来创建数据连接
主动模式有个弊端,因为客户端的端口是随机的,客户端如果开了防火墙,
则服务器端去连客户端创建数据连接时可能会被拒绝
4. 用户认证
ftp的用户主要有三种:
虚拟用户:仅用于访问某特定服务中的资源
系统用户:可以登录系统的真实用户
匿名用户:不需要密码登录
5.vsftpd
vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点
5.1安装vsftpd
[root@xj ~]# yum -y install vsftpd
已加载插件:product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
正在解决依赖关系
--> 正在检查事务
---> 软件包 vsftpd.x86_64.0.3.0.2-9.el7 将被 安装
--> 解决依赖关系完成
....
正在安装 : vsftpd-3.0.2-9.el7.x86_64 1/1
验证中 : vsftpd-3.0.2-9.el7.x86_64 1/1
已安装:
vsftpd.x86_64 0:3.0.2-9.el7
完毕!
5.2 vsftpd配置
/etc/pam.d/vsftpd //vsftpd用户认证配置文件
/etc/vsftpd/ //配置文件目录
/etc/vsftpd/vsftpd.conf //主配置文件
匿名用户(映射为ftp用户)的共享资源位置是/var/ftp
//系统用户通过ftp访问的资源位置为用户的家目录
//虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录
vsftpd常见的配置参数:
参数 | 作用 |
---|---|
listen=[YES NO] | 是否以独立运行的方式监听服务 |
listen_address=IP地址 | 设置要监听的IP地址 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=[YES NO] | 是否允许下载文件 |
userlist_enable=[YES NO] userlist_deny=[YES NO] | 设置用户列表为“允许”还是“禁止”操作 |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址的最大连接数,0为不限制 |
anonymous_enable=[YES NO] | 是否允许匿名用户访问 |
anon_upload_enable=[YES NO] | 是否允许匿名用户上传文件 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_root=/var/ftp | 匿名用户的FTP根目录 |
anon_mkdir_write_enable=[YES NO] | 是否允许匿名用户创建目录 |
anon_other_write_enable=[YES NO] | 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限) |
anon_max_rate=0 | 匿名用户的最大传输速率(字节/秒),0为不限制 |
local_enable=[YES NO] | 是否允许本地用户登录FTP |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/var/ftp | 本地用户的FTP根目录 |
chroot_local_user=[YES NO] | 是否将用户权限禁锢在FTP目录,以确保安全 |
local_max_rate=0 | 本地用户最大传输速率(字节/秒),0为不限制 |
5.3配置匿名用户
安装vsftpd步骤略
.....
更改配置文件
[root@xj ~]# vim /etc/vsftpd/vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES (默认是yes)
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022 (本地用户的遮罩码)
anon_umask=022 (添加匿名的遮罩码)
....
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
anon_upload_enable=YES (把匿名用户的上传功能的注释取消)
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES (允许匿名用户创建目录)
anon_other_write_enable=YES (允许匿名用户创建和删除目录)
[root@xj ~]# systemctl restart vsftpd
图形化界面验证
上传文件
下载文件
命令行测试
[root@xxx ~]# lftp 192.168.125.128
lftp 192.168.125.128:~> ls
drwxrwxrwx 3 0 0 28 Feb 18 12:27 pub
lftp 192.168.125.128:/> cd pub/
lftp 192.168.125.128:/pub> ls
-rw-r--r-- 1 0 0 0 Feb 18 12:23 tt
drwxr-xr-x 2 14 50 6 Feb 18 12:27 测试
lftp 192.168.125.128:/pub> rm -rf 测试/ (删除目录)
rm 成功, 删除 `测试/'
lftp 192.168.125.128:/pub> ls
-rw-r--r-- 1 0 0 0 Feb 18 12:23 tt
lftp 192.168.125.128:/pub> mkdir ll (创建目录)
mkdir 成功, 建立 `ll'
lftp 192.168.125.128:/pub> ls
drwxr-xr-x 2 14 50 6 Feb 18 12:33 ll
-rw-r--r-- 1 0 0 0 Feb 18 12:23 tt
lftp 192.168.125.128:/pub> get tt (下载文件)
lftp 192.168.125.128:/pub> exit
[root@xxx ~]# ls
anaconda-ks.cfg tt
[root@xxx ~]# ls
anaconda-ks.cfg tt
[root@xxx ~]# lftp 192.168.125.128
lftp 192.168.125.128:/pub> put anaconda-ks.cfg (上传文件)
810 bytes transferred
lftp 192.168.125.128:/pub> ls
-rw-r--r-- 1 14 50 810 Feb 18 12:39 anaconda-ks.cfg
drwxr-xr-x 2 14 50 6 Feb 18 12:33 ll
-rw-r--r-- 1 0 0 0 Feb 18 12:23 tt
在客户端查看用户是ftp匿名用户
[root@xj pub]# ll
总用量 4
-rw-r--r--. 1 ftp ftp 810 2月 18 20:39 anaconda-ks.cfg
drwxr-xr-x. 2 ftp ftp 6 2月 18 20:33 ll
-rw-r--r--. 1 root root 0 2月 18 20:23 tt
5.3.1 搭建系统用户
[root@xj ~]# vim /etc/vsftpd/vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO (把yes改为no)
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES (默认)
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES(默认)
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022 (默认)
[root@xj ~]# systemctl restart vsftpd
创建一个普通用户并设置密码
[root@xj ~]# useradd fff
[root@xj ~]# passwd fff
更改用户 fff 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
图像界面测试
[root@xj ~]# cd /home/fff/
[root@xj fff]# ls
[root@xj fff]# touch aaa
[root@xj fff]# mkdir bb
[root@xj fff]# ll
总用量 0
-rw-r--r--. 1 root root 0 2月 18 20:49 aaa
drwxr-xr-x. 2 root root 6 2月 18 20:49 bb
上传文件
下载文件
创建文件并在服务器上查看
文件的拥有主为普通用户fff
[root@xj fff]# ll
总用量 0
-rw-r--r--. 1 root root 0 2月 18 20:49 aaa
drwxr-xr-x. 2 root root 6 2月 18 20:49 bb
-rw-r--r--. 1 fff fff 0 2月 18 20:55 hh
drwxr-xr-x. 2 fff fff 6 2月 18 20:55 oo
drwxr-xr-x. 2 fff fff 6 2月 18 20:54 测试
5.3.2搭建虚拟用户
创建文本格式的用户名和密码
[root@xj ~]# vim /etc/vsftpd/xx.list
[root@xj ~]# cat /etc/vsftpd/xx.list
tom
123
jerry
456
[root@xj ~]# yum -y install db* (安装db工具)
[root@xj ~]# db_load -T -t hash -f /etc/vsftpd/xx.list /etc/vsftpd/xx.db (将文本格式的用户名和密码改为数据库文件)
[root@xj ~]# chmod 600 /etc/vsftpd/xx.* (将文件权限改为600,提高安全)
[root@xj ~]# ll /etc/vsftpd/xx.*
-rw-------. 1 root root 12288 2月 18 21:04 /etc/vsftpd/xx.db
-rw-------. 1 root root 18 2月 18 21:00 /etc/vsftpd/xx.list
[root@xj ~]# useradd -d /var/ftpxx -s /sbin/nologin vftp (创建虚拟用户的映射账号)
[root@xj ~]# chmod 755 /var/ftpxx
[root@xj ~]# ll /var/ftpxx/ -d
drwxr-xr-x. 2 vftp vftp 59 2月 18 21:12 /var/ftpxx/
[root@xj ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak (创建pam认证)
[root@xj ~]# vim /etc/pam.d/vsftpd
[root@xj ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/xx
account required pam_userdb.so db=/etc/vsftpd/xx
[root@xj ~]# vim /etc/vsftpd/vsftpd.conf (修改配置,开启虚拟用户)
guest_enable=YES
guest_username=vftp
为不同的虚拟用户配置独立的配置文件
user_config_dir=/etc/vsftpd/vusers_dir
allow_writeable_chroot=YES
[root@xj ~]# systemctl restart vsftpd
[root@xj ~]# mkdir /etc/vsftpd/vusers_dir
设置tom用户可上传创建文件
[root@xj ~]# vim /etc/vsftpd/vusers_dir/tom
[root@xj ~]# cat /etc/vsftpd/vusers_dir/tom
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@xj ~]# systemctl restart vsftpd
jerry用户无权限,默认只有下载权限
[root@xj ~]# touch /etc/vsftpd/vusers_dir/jerry
图形化界面验证,tom用户不能删除文件
可以创建文件,并且用户名为映射用户vftp
[root@xj ftpxx]# ll
总用量 0
-rw-------. 1 vftp vftp 0 2月 18 21:37 gg
-rw-r--r--. 1 root root 0 2月 18 21:36 jj
drwx------. 2 vftp vftp 6 2月 18 21:37 uu
下载文件JJ
上传文件 KK
测试用户jerry
不能创建文件和目录
不能上传文件
可以下载文件FFDD
命令行验证
[root@xxx ~]# lftp -u tom 192.168.125.128
口令:
lftp tom@192.168.125.128:~> mkdir tt (创建文件)
mkdir 成功, 建立 `tt'
lftp tom@192.168.125.128:/> ls
-rw-r--r-- 1 0 0 0 Feb 18 13:47 rr
drwx------ 2 1001 1001 6 Feb 18 13:48 tt
lftp tom@192.168.125.128:/> get rr (下载文件)
lftp tom@192.168.125.128:/> put anaconda-ks.cfg (上传文件)
810 bytes transferred
lftp tom@192.168.125.128:/> ls
-rw------- 1 1001 1001 810 Feb 18 13:48 anaconda-ks.cfg
-rw-r--r-- 1 0 0 0 Feb 18 13:47 rr
drwx------ 2 1001 1001 6 Feb 18 13:48 tt
lftp tom@192.168.125.128:/> exit
[root@xxx ~]# ls
anaconda-ks.cfg rr
验证jerry用户
lftp jerry@192.168.125.128:~> mkdir ii
mkdir: Access failed: 550 Permission denied. (ii) (不能创建文件)
lftp jerry@192.168.125.128:/> put anaconda-ks.cfg
put: Access failed: 550 Permission denied. (anaconda-ks.cfg) (不能上传文件)
lftp jerry@192.168.125.128:/> exit
[root@xxx ~]# ls
anaconda-ks.cfg rr
lftp jerry@192.168.125.128:~> get rr (可以下载文件)
lftp jerry@192.168.125.128:/> exit
[root@xxx ~]# ls
anaconda-ks.cfg rr