ftp文件服务
vsftpd 是“very secure FTP daemon”的缩写,是一个完全免费的、开放源代码的ftp服务器软件。特点是:非常高的安全性需求、带宽限制、良好的可伸缩性等。(FTP和NFS不同的地方在于文件的管理上是不同的,NFS是以块的形式读取文件,FTP是以副本的形式来存取文件,即读的是整个文件)
工作原理
vsftpd使用ftp协议,该协议属于应用层协议。它是典型的c/s架构,ftp服务端用来存储文件,ftp客户端可以通过ftp协议连接服务端实现上传和下载资源。
ftp使用tcp的21端口进行命令传输,然后用tcp 的20端口进行数据传输(主动模式端口固定20)。默认是被动模式(端口随机分配)。
安装部署(selinux 防火墙关闭)
服务端192.168.179.100 客户端 192.168.179.99
[root@localhost ~]# yum install vsftpd -y --服务端安装
vsftpd: 为服务端软件
ftp、lftp: 为客户端工具,推荐使用lftp
[root@localhost ~]# yum install ftp lftp -y --客户端安装ftp lftp这些都是客户端的工具
服务端启动服务
[root@localhost ~]# systemctl enable vsftpd
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# netstat -tpln | grep vsftpd --可以看到多了21端口
tcp6 0 0 :::21 :::* LISTEN 4962/vsftpd
客户端测试 匿名用户访问
用ftp客户端匿名登录需要输入用户名及密码验证,匿名用户名为:ftp或者anonymous,密码为空。用lftp客户端匿名登录则不需要输入以上信息。
匿名用户去访问ftp服务器
[root@localhost ]# ftp 192.168.179.100 --客户端访问服务端
Connected to 192.168.179.100 (192.168.179.100).
220 (vsFTPd 3.0.2)
Name (192.168.179.100:root): ftp --使用匿名登入
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,179,100,113,193).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Oct 30 2018 pub
226 Directory send OK.
匿名用户默认登入的目录是位于ftp服务端的pub目录,这个目录位于服务端的/var/ftp下面
[root@localhost ~]# cd /var/ftp/
[root@localhost ftp]# ls
pub
[root@localhost ftp]# cp /etc/fstab /var/ftp/pub/ --服务端将/etc/fstab文件拷贝到pub目录下,服务端pub下有了fstab文件了
ftp> pwd --服务端查看pub下是否存在ftp文件
257 "/pub"
ftp> ls
227 Entering Passive Mode (192,168,179,100,156,253).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 501 Mar 04 12:25 fstab
226 Directory send OK.
匿名用户get单个下载文件
ftp> get fstab --对该文件进行下载
local: fstab remote: fstab
227 Entering Passive Mode (192,168,179,100,111,116).
150 Opening BINARY mode data connection for fstab (501 bytes).
226 Transfer complete.
501 bytes received in 0.00225 secs (222.17 Kbytes/sec)
ftp> exit --退出看看文件有没有下载到本地
221 Goodbye.
[root@localhost ~]# ls
anaconda-ks.cfg fstab
[root@localhost pub]# touch file1{1..9} --在服务端再创建一些文件
[root@localhost pub]# ls
file11 file12 file13 file14 file15 file16 file17 file18 file19 fstab
ftp> ls --客户端要批量下载这些文件
227 Entering Passive Mode (192,168,179,100,206,50).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file11
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file12
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file13
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file14
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file15
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file16
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file17
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file18
-rw-r--r-- 1 0 0 0 Mar 04 12:44 file19
-rw-r--r-- 1 0 0 501 Mar 04 12:25 fstab
匿名用户mget批量下载文件(不管是mget还是get命令下载的内容都在服务端当前目录下)
ftp> mget file* --ftp客户端批量下载服务端文件,可以看出交互式的,每次下载都得询问,,要查看ftp更多命令使用ftp>help来查看
mget file11?
227 Entering Passive Mode (192,168,179,100,63,59).
150 Opening BINARY mode data connection for file11 (0 bytes).
226 Transfer complete.
mget file12? y
ftp> prompt off --关闭询问这种交互模式
Interactive mode off.
ftp> prompt off --再去下载就不会有询问是否要下载文件
Interactive mode off.
ftp> mget file*
local: file11 remote: file11
227 Entering Passive Mode (192,168,179,100,30,126).
150 Opening BINARY mode data connection for file11 (0 bytes).
226 Transfer complete.
local: file12 remote: file12
227 Entering Passive Mode (192,168,179,100,175,245).
.................................................................................................
ftp> put fstab --可以看到匿名用户不能上传,因为没有权限
local: fstab remote: fstab
227 Entering Passive Mode (192,168,179,100,208,220).
550 Permission denied.
ftp> mkdir abc --匿名用户也不能创建目录
550 Create directory operation failed.
总结就是:使用匿名用户登入,默认配置只能进行文件的读取和下载,不能进行写入和上传文件
修改ftp的配置文件,开启匿名用户创建文件,重命名,删除,上传权限(注意selinux要关闭和防火墙关闭)
[root@localhost pub]# vi /etc/vsftpd/vsftpd.conf --开启下面三个权限差不多开启了匿名用户大部分功能
anon_upload_enable=YES --开启上传权限
anon_mkdir_write_enable=YES --开启创建文件权限
anon_other_write_enable=YES --开启重命名,删除权限
[root@localhost pub]# systemctl restart vsftpd --修改配置文件之后重启服务
来到客户端
ftp> cd pub
250 Directory successfully changed.
ftp> lcd /etc --lcd是切换到本地客户端的目录
Local directory now /etc
ftp> put fstab --可以看到还是上传不了,这个是因为上一级目录权限的问题
local: fstab remote: fstab
421 Timeout.
Passive mode refused.
[root@localhost pub]# ls -ld /var/ftp/pub --当服务端的配置都已经修改好,那么就应该考虑目录的权限问题了
drwxr-xr-x. 2 root root 145 Mar 4 20:44 /var/ftp/pub
[root@localhost pub]# chmod o+w /var/ftp/pub/ --修改目录权限
[root@localhost pub]# ls -ld /var/ftp/pub
drwxr-xrwx. 2 root root 145 Mar 4 20:44 /var/ftp/pub
再次来到客户端
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir abc --可以创建目录
257 "/pub/abc" created
[root@localhost pub]# ll
total 8
drwx------ 2 ftp ftp 6 Mar 5 20:05 abc
ftp> lcd /etc
Local directory now /etc
ftp> put fstab --可以上传文件(如果是实用得ftp客户端,不能直接实用绝对路径上传,需要先切换到本地文件路径,直接上传文件)
local: fstab remote: fstab
227 Entering Passive Mode (192,168,179,100,98,80).
150 Ok to send data.
226 Transfer complete.
501 bytes sent in 7.6e-05 secs (6592.11 Kbytes/sec)
lftp 192.168.179.100:/pub> put /etc/fstab -o fs --使用lftp上传文件想改名就要带-o refile了
501 bytes transferred
[root@localhost pub]# ll fs
-rw------- 1 ftp ftp 501 Mar 5 20:20 fs
我们将本地文件fstab上传到了匿名用户的pub目录并修改了文件名
lftp上传多个文件,可以使用put和mput命令上传,多个文件之间用空格分隔,如果想使用通配符,只有mput命令支持:
lftp 192.168.179.100:/> cd pub
lftp 192.168.179.100:/pub> put /etc/fstab /etc/favicon.png
1580 bytes transferred
Total 2 files transferred
lftp 192.168.179.100:/pub> mput /etc/f*
1688 bytes transferred
Total 4 files transferred
lftp下载目录
[root@localhost pub]# mkdir -p test --服务端创建目录
[root@localhost pub]# ls
test
lftp 192.168.179.100:/pub> mirror test --客户端下载该目录
Total: 1 directory, 0 files, 0 symlinks
lftp 192.168.179.100:/pub> rmdir test --删除目录
rmdir ok, `test' removed
lftp 192.168.179.100:/pub> rm file1 --删除文件
rm ok, `file1' removed
本地用户访问ftp服务器
修改配置文件,可以设置不让匿名用户登录,只能本地用户登录:
重启服务。然后再次访问:
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
[root@localhost pub]# systemctl restart vsftpd
[root@localhost ~]# lftp 192.168.179.100 --这个登录,表示匿名用户已经无法登录了。
lftp 192.168.179.100:~> ls
`ls' at 0 [Sending commands...]
如果使用本地用户访问,需要服务端有对应的用户存在才行。
[root@localhost ~]# id jerry --服务端的jerry用户
uid=1000(jerry) gid=1000(jerry) groups=1000(jerry)
[root@localhost ~]# lftp jerry@192.168.179.100 --这样登入到的是服务端jerry的家目录
Password:
lftp jerry@192.168.179.100:~> pwd --并不是在服务端的匿名用户的pub目录,是在服务端jerry的家目录 (上传和下载和匿名用户一样的使用方法)
ftp://jerry@192.168.179.100/%2Fhome/jerry
lftp jerry@192.168.179.100:/var/ftp/pub> cd / --可以看到jerry用户可以随意切换到服务端的任何目录下面,这是不安全的,最好是限制只能在家目录活动,(限制系统用户越狱:在安装vsftpd后不做配置的话,系统用户是可以向上切换到其他目录的)。
cd ok, cwd=/
lftp jerry@192.168.179.100:/> ls
lrwxrwxrwx 1 0 0 7 Mar 01 19:43 bin -> usr/bin
dr-xr-xr-x 5 0 0 4096 Mar 01 19:52 boot
drwxr-xr-x 19 0 0 3200 Mar 05 10:05 dev
drwxr-xr-x 81 0 0 8192 Mar 05 12:39 etc
drwxr-xr-x 3 0 0 19 Mar 05 12:39 home
lftp jerry@192.168.179.100:/> put /etc/fstab /etc/favicon.png --同时可以看到本地用户对家目录是没有写权限的
put: Access failed: 553 Could not create file. (fstab)
put: Access failed: 553 Could not create file. (favicon.png)
限制系统用户越狱:在安装vsftpd后不做配置的话,系统用户是可以向上切换到其他目录的。(限制在家目录,不让其看其他目录信息)
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES --是否将所有用户限制在主目录,YES为启用,NO禁用.(该项默认值是NO)
chroot_list_enable=NO --chroot_list_enable: 是否启动限制用户(特例)的名单 YES为启用,NO禁用(包括注释掉也为禁用)
allow_writeable_chroot=YES --允许用户具有主目录写权限
[root@localhost pub]# systemctl restart vsftpd
[root@localhost ~]# lftp jerry@192.168.179.100 --在客户端这边可以看到限制了用户的越狱,只能在家目录活动
lftp jerry@192.168.179.100:/> cd /
lftp jerry@192.168.179.100:/> pwd
ftp://jerry@192.168.179.100/
lftp jerry@192.168.179.100:/> put /etc/fstab --可以正常上传文件,对家目录有写权限
501 bytes transferred
如果不加allow_writeable_chroot=YES这个参数重启服务客户端会报错,允许对家目录的写,即可以上传
[root@localhost ~]# lftp jerry@192.168.179.100
Password:
lftp jerry@192.168.179.100:~> ls
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
(1)如果想全部限制,所有用户都不能切换家目录
chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES
(2)如果想让部分用户有切换的家目录的权限,则需要开启限制:
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
chroot_list中写上要放行用户