1.ftp简介
网络文件共享服务主流的主要有三种,分别是ftp、nfs、samba。
FTP是File Transfer Protocol(文件传输协议)的简称,用于internet上的控制文件的双向传输。
FTP也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
在FTP的使用当中,用户经常遇到两种概念:下载和上传
| 下载(Download) | 上传(Upload) |
|---|---|
| 从远程主机拷贝文件至自己的计算机上 | 将文件从自己的计算机上拷贝至远程主机上 |
2. ftp架构
FTP工作于应用层,监听于tcp的21号端口,是一种C/S架构的应用程序。
下面是常用版本:
| 客户端工具 | 服务端软件 |
|---|---|
| lftp 命令行 filezilla 图形化 | vsftpd(Very Secure) |
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配置
/etc/pam.d/vsftpd //vsftpd用户认证配置文件
[root@linux131 vsftpd]# cat /etc/pam.d/vsftpd
/etc/vsftpd/ //配置文件目录
[root@linux131 ~]# cd /etc/vsftpd/
[root@linux131 vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
主配置文件 迁移数据的脚本
//匿名用户(映射为ftp用户)的共享资源位置是/var/ftp
//系统用户通过ftp访问的资源位置为用户的家目录
//虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录
vsftpd常见的配置参数:
| 参数 | 作用 |
|---|---|
| anonymous_enable=YES | 启用匿名用户登录 |
| anon_upload_enable=YES | 允许匿名用户上传 |
| anon_mkdir_write_enable=YES | 允许匿名用户创建目录,但是不能删除 |
| anon_other_write_enable=YES | 允许匿名用户创建和删除目录 |
| local_enable=YES | 启用本地用户登录 |
| write_enable=YES | 允许本地用户有写权限 |
| local_umask=022 | 通过ftp上传文件的默认遮罩码 |
| chroot_local_user=YES | 禁锢所有的ftp本地用户于其家目录中 |
| chroot_list_enable=YES | 开启禁锢文件列表需要与chroot_list_file参数一起使用 |
| chroot_list_file=/etc/vsftpd/chroot_list | 指定禁锢列表文件路径在此文件里面的用户将被禁锢在其家目录中 |
| allow_writeable_chroot=YES | 允许被禁锢的用户家目录有写权限 |
| xferlog_enable=YES | 是否启用传输日志,记录ftp传输过程 |
| xferlog_std_format=YES | 传输日志是否使用标准格式 |
| xferlog_file=/var/log/xferlog | 指定传输日志存储的位置 |
| chown_uploads=YES | 是否启用改变上传文件属主的功能 |
| chown_username=whoever | 指定要将上传的文件的属主改为哪个用户此用户必须在系统中存在 |
| pam_service_name=vsftpd | 指定vsftpd使用/etc/pam.d下的哪个pam配置文件进行用户认证 |
| userlist_enable=YES | 是否启用控制用户登录的列表文件:默认为/etc/vsftpd/user_list文件 |
| userlist_deny=YES | 是否拒绝userlist指定的列表文件中存在的用户登录ftp |
| max_clients=# | 最大并发连接数 |
| max_per_ip=# | 每个IP可同时发起的并发请求数 |
| anon_max_rate | 匿名用户的最大传输速率,单位是“字节/秒” |
| local_max_rate | 本地用户的最大传输速率,单位是“字节/秒” |
| dirmessage_enable=YES | 启用某目录下的.message描述信息假定有一个目录为/upload, 在其下创建一个文件名为.message,在文件内写入一些描述信息, 则当用户切换至/upload目录下时会自动显示.message文件中的内容 |
| message_file | 设置访问一个目录时获得的目录信息文件的文件名,默认是.message |
| idle_session_timeout=600 | 设置默认的断开不活跃session的时间 |
| data_connection_timeout=120 | 设置数据传输超时时间 |
| ftpd_banner=“Welcome to chenlf FTP service.” | 定制欢迎信息,登录ftp时自动显示 |
- 修改配置
[root@linux131 ~]# vim /etc/vsftpd/vsftpd.conf
local_enable=NO //本地无法登陆
write_enable=NO //本地用户没有写权限
chown_username=tom //指定要将上传的文件的属主改为哪个用户
pam_service_name=vsftpd //指定vsftpd使用/etc/pam.d下的文件名必须一致
userlist_enable=YES //黑名单,默认为/etc/vsftpd/user_list文件
userlist_deny=YES //白名单
max_clients=# //最大并发连接数,等于1就只能连接1个
max_per_ip=# //每个IP可同时发起的并发请求数
[root@linux131 ~]# systemctl restart vsftpd //重启服务
命令行工具ftp和lftp的使用
- 下载安装
[root@linux131 ~]# yum -y install ftp lftp
新建一个tom用户
[root@linux131 ~]# useradd tom
[root@linux131 ~]# echo '123456' |passwd --stdin tom
- ftp的使用:
[root@linux131 ~]# ftp 192.168.152.131
Connected to 192.168.152.131 (192.168.152.131).
220 (vsFTPd 3.0.3)
Name (192.168.152.131:root): tom //登陆用户
331 Please specify the password.
Password: //输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,152,131,97,48).
150 Here comes the directory listing.
drwxr-xr-x 2 1005 1005 6 Oct 15 08:58 haha
drwxr-xr-x 2 1005 1005 6 Oct 15 08:58 xixi
226 Directory send OK.
ftp> ? //查看它可以使用的命令
Commands may be abbreviated. Commands are:
! debug mdir sendport site
$ dir查看 mget put上传 size
account disconnect mkdir创建目录 pwd status
append exit退出 mls quit struct
ascii form mode quote system
bell get下载 modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd进入 open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete删除 mdelete proxy send
- lftp的使用:
[root@linux131 ~]# lftp -u tom,123456 192.168.152.131 //加-u直接登陆
lftp tom@192.168.152.131:~> ls
drwxr-xr-x 2 1005 1005 6 Oct 15 08:58 haha
-rw-rw-r-- 1 1005 1005 0 Oct 15 09:20 xiaoli
drwxr-xr-x 2 1005 1005 61 Oct 15 09:04 xixi
删除文件
lftp tom@192.168.152.131:~> rm -f xiaoli
rm ok, `xiaoli' removed
lftp tom@192.168.152.131:~> ls
drwxr-xr-x 2 1005 1005 6 Oct 15 08:58 haha
drwxr-xr-x 2 1005 1005 61 Oct 15 09:04 xixi
[tom@linux131 ~]$ ls
haha xixi
创建目录
lftp tom@192.168.152.131:~> mkdir laowang
mkdir ok, `laowang' created
lftp tom@192.168.152.131:~> ls
drwxr-xr-x 2 1005 1005 6 Oct 15 08:58 haha
drwxr-xr-x 2 1005 1005 6 Oct 15 09:29 laowang
drwxr-xr-x 2 1005 1005 61 Oct 15 09:04 xixi
get下载xiaoli文件直接退出
[root@linux131 ~]# lftp -u tom,123456 -e "get xiaoli;exit" 192.168.152.131
[root@linux131 ~]# ls
anaconda-ks.cfg xiaoli
mirror -R上传目录,mirror下载目录
[root@linux131 ~]# ls
anaconda-ks.cfg lili xiaoli
lftp tom@192.168.152.131:~> mirror -R lili
lftp tom@192.168.152.131:~> ls
drwxr-xr-x 2 1005 1005 6 Oct 15 08:58 haha
drwxr-xr-x 2 1005 1005 6 Oct 15 09:29 laowang
drwxr-xr-x 2 1005 1005 6 Oct 15 09:37 lili
drwxr-xr-x 2 1005 1005 61 Oct 15 09:04 xixi
lftp tom@192.168.152.131:~> mirror laowang
[root@linux131 ~]# ls
anaconda-ks.cfg laowang lili xiaoli
下载目录并改名
lftp tom@192.168.152.131:~> mirror laowang haha
[root@linux131 ~]# ls
anaconda-ks.cfg haha laowang lili xiaoli
配置匿名用户ftp
- 下载安装vsftpd
[root@linux131 ~]# yum -y install vsftpd
[root@linux131 vsftpd]# pwd
/etc/vsftpd
[root@linux131 vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@linux131 vsftpd]# vim vsftpd.conf //修改配置文件
anonymous_enable=YES //找到这一行,最后的值改为YES
[root@linux131 pub]# pwd //新建一个文件,确认位置
/var/ftp/pub
[root@linux131 pub]# touch wangyibo
- 登录验证



-
这个共享目录只能下载文件,无法删除文件和上传文件



-
修改主配置文件
找到以下两行进行修改
[root@linux131 vsftpd]# vim vsftpd.conf
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
去掉注释,再加上最后一行
anon_upload_enable=YES //可以上传文件
anon_mkdir_write_enable=YES //可以创建文件
anon_other_write_enable=YES //可以删除文件
设置ftp的权限
[root@linux131 ~]# setfacl -m u:ftp:rwx /var/ftp/pub/
[root@linux131 ~]# getfacl /var/ftp/pub/
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/pub/
# owner: root
# group: root
user::rwx
user:ftp:rwx //可读可写可执行
group::r-x
mask::rwx
other::r-x
重启服务
[root@linux131 vsftpd]# systemctl restart vsftpd
- 验证:可上传,可创建,可删除



查看上传的文件权限为600
[root@linux131 ~]# ll /var/ftp/pub/
total 0
drwx------ 2 ftp ftp 6 Oct 14 16:43 新文件夹
-rw------- 1 ftp ftp 0 Oct 14 16:43 肖战.txt
修改配置
[root@linux131 ~]# vim /etc/vsftpd/vsftpd.conf
找到第一行,再下面加上一行
local_umask=022
anon umask=022 //添加匿名用户的遮罩码
[root@linux131 vsftpd]# systemctl restart vsftpd //重启服务
再上传的文件权限就改为644
[root@linux131 ~]# ll /var/ftp/pub/
total 0
-rw-r--r-- 1 ftp ftp 0 Oct 14 16:59 wangyibo
drwx------ 2 ftp ftp 6 Oct 14 16:43 新文件夹
-rw------- 1 ftp ftp 0 Oct 14 16:43 肖战.txt
配置系统用户ftp
- 创建新用户,设置密码
[root@linux131 vsftpd]# useradd xiaozhan
[root@linux131 vsftpd]# echo '123456'|passwd --stdin xiaozhan
Changing password for user xiaozhan.
passwd: all authentication tokens updated successfully.
[root@linux131 vsftpd]# systemctl restart vsftpd //重启服务
新建的文件在用户的家目录
[root@linux131 vsftpd]# ls ~xiaozhan
新文件夹
- 登录验证:



配置虚拟用户ftp
//虚拟用户的配置:
//所有的虚拟用户会被统一映射为一个指定的系统帐号,访问的共享位置即为此系统帐号的家目录
//各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
//虚拟用户帐号的存储方式:
1.文件:编辑文件,此文件需要被编码为hash格式。
奇数行为用户名
偶数行为密码
2.关系型数据库的表中:
通过即时查询数据库完成用户认证
mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装
创建文本格式的用户名、密码列表,例如若要添加两个用户tom、jerry
[root@linux131 ~]# cat /etc/vsftpd/lp.list
tom
123456 //密码
jerry
000000 //密码
[root@linux131 ~]# ls /etc/vsftpd/
ftpusers lp.list user_list vsftpd.conf vsftpd_conf_migrate.sh
将刚创建的文本格式用户名、密码文件使用db4工具转换成数据库文件
[root@linux131 vsftpd]# db_load -T -t hash -f lp.list lp.db
[root@linux131 vsftpd]# ls
ftpusers lp.db lp.list user_list vsftpd.conf vsftpd_conf_migrate.sh
为提高虚拟用户帐号文件的安全性,应将文件权限设置为600,以避免数据外泄
[root@linux131 vsftpd]# chmod 600 lp.*
[root@linux131 vsftpd]# ll
total 36
-rw------- 1 root root 12288 Oct 14 17:25 lp.db
-rw------- 1 root root 24 Oct 14 17:18 lp.list
添加虚拟用户的映射帐号、创建ftp根目录。例如要将使用的ftp根目录设置为/opt/ftp
//映射帐号的名称为vftp,可以执行以下操作
[root@linux131 vsftpd]# useradd -d /opt/ftp -s /sbin/nologin vftp
[root@linux131 vsftpd]# chmod 755 /opt/ftp //更改权限
[root@linux131 vsftpd]# ll /opt/
total 0
drwxr-xr-x 2 vftp vftp 62 Oct 14 17:31 ftp
[root@linux131 pam.d]# pwd
/etc/pam.d
[root@linux131 pam.d]# mv vsftpd{,-bak} //移动文件备份
自己配置一个新的vsftpd
[root@linux131 pam.d]# vim vsftpd
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/lp
account required pam_userdb.so db=/etc/vsftpd/lp
[root@linux131 pam.d]# ls
vsftpd-bak //备份
vsftpd //重新配置的文件
[root@linux131 vsftpd]# mkdir xing
修改vsftpd配置文件,添加虚拟用户支持,为不同的虚拟用户建立独立的配置文件
[root@linux131 ~]# vim /etc/vsftpd/vsftpd.conf //最后加上这4行
guest_enable=YES //虚拟账户打开
guest_username=vftp //虚拟账户映射的账户为vftp
user_config_dir=/etc/vsftpd/xing //用户配置目录写入的路径
allow_writeable_chroot=YES //允许写入
设置tom用户只有默认的下载权限,只需要创建一个名为tom的空文件即可
[root@linux131 xing]# pwd
/etc/vsftpd/xing
[root@linux131 xing]# touch tom
设置jerry用户可上传文件、创建目录、删除文件
[root@linux131 xing]# cat jerry
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@linux131 xing]# ll
total 4
-rw-r--r-- 1 root root 82 Oct 14 18:09 jerry
-rw-r--r-- 1 root root 0 Oct 14 18:04 tom
[root@linux131 xing]# systemctl restart vsftpd //重启服务
在/opt/ftp创建两个文件
[root@linux131 ftp]# touch abc
[root@linux131 ftp]# touch 123
[root@linux131 ftp]# ls
123 abc
-
验证Tom:只能下载,不能上传,不能删除,不能新建





-
验证Jerry:能上传,能删除,能新建



本文介绍了FTP服务的基础知识,包括FTP的架构、数据连接模式、用户认证方式。重点讲解了在Linux中配置vsftpd服务,包括匿名用户、系统用户和虚拟用户的设置,以及如何解决主动模式和被动模式下的数据连接问题。
1733

被折叠的 条评论
为什么被折叠?



