ftp服务的搭建和配置

linux中常见的文件远程传输除了scp命令和rsync命令

还有ftp文件传输协议这种方式

只要在ftp服务器上下载相应的软件,将文件放到ftp的发布目录下,

客户端只要登陆ftp服务器,就能浏览,下载,上传文件。

要搭建ftp远程传输下载其相应的软件vsftp服务端软件和lftp客户端软件。

在安装软件之前,首先要将selinux内核级防火墙关闭,

否则会影响客户端的登陆。

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一
FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端
其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源
在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上
由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议
默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息
但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关
如果采用主动模式,那么数据传输端口就是20;

如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定

同大多数Internet服务一样,FTP也是一个客户/服务器系统
用户通过一个客户机程序连接至在远程计算机上运行的服务器程序
依照 FTP 协议提供服务,进行文件传送的计算机就是 FTP服务器
而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端
用户要连上FTP 服务器,就要用到 FTP 的客户端软件,通过lftp命令连接

 

ftp的简单介绍:

ftp(文件传输协议)是internet上仍常用的最老的网络协议之一,

它为系统提供了通过网络与远程服务器进行传输的简单方法。

在red hat entreprise linux 6中ftp服务包的名称为vsftpd,

它代表very secure file transferprotocol damon服务名称也叫做vsftp。

默认配置文件让anonymous用户只能下载位于chroot目录中的内容。

这意味着远程ftp 用户端能以用户anonymous或ftp身份连接到服务器(无需密码),

并从ftp服务器上的/var/ftp目录下载文件(其本地ftp用户可以读取 这些文件)

 

如果显示结果不是disabled

则需编辑/etc/sysconfig/selinux文件,关闭selinux

vim /etc/sysconfig/selinux

如下图编辑:



在改变selinux之后需要重启主机,让内核重新加载,识别selinux的值。
除此之外还需要修改防火墙配置,关闭防火墙或者如下方式将lftp服务加入防火墙策略:

systemctl start firewalld

firewall-cmd --permanent --add-service=ftp

firewall-cmd --reload

firewall-cmd --list-all

public(default,active)

interfaces:eth0

services:dhcpv6-client ftp ssh           #如果此处有ftp则添加成功

masquerade:no

 

下来就可以安装vsftp和lftp了:

yum install vsftpd            安装服务端软件

 

yum install lftp                   安装客户端软件

systemctl start vsftpd            打开vsftpd

systemctl enable vsftpd         开机启动

下来客户端就可以进行测试,可以在本机上测试,也可以在别的主机上测试。

lftp 172.25.254.157


lftp的默认发布目录为/var/ftp/,所以在客户端登陆后看到的是pub目录。
像上面的这种方式是以匿名用户登陆的lftp,

除此之外还可以用本地用户的身份登陆服务器,

需要强调的是这里的用户是服务端的用户,不是客户端的用户,

并且本地登陆的用户是具有创建,删除,上传和下载权限的

在服务端创建一个westosstudent用户,并给该用户一个密码(我两个设的一样方便记忆):自己设置



在客户端使用westos用户登陆ftp服务器:

lftp 172.25.254.157 -u westos

lftp中没有touch命令,可用的命令可以使用**?** 进行查看。


作为一个安全的服务器,不允许客户端有这么多的操作,

所以需要对客户端的登陆进行控制,

只要在vftp的配置文件/etc/vsftpd/vsftpd.conf中添加相应的参数,

就可以进行控制。

常用的vftp配置文件参数:

 

anonymous_enable=YES            允许匿名用户登陆

local_enable=YES                        允许本地用户登陆

write_enable=YES                        允许登陆的用户可写

anon_upload_enable=YES          匿名用户可写

anon_root=/westos                        更改匿名用户登陆后的家目录

anon_umask=022                          更改匿名用户上传文件的权限 

anon_world_readable__only=N   匿名用户可以下载,此处设置为NO表示可以下载

anon_other_write_enable=YES   匿名用户可以删除

anon_mkdir_write_enable=YES   匿名用户可以创建文件夹

anon_max_rate=1024000             控制下载速率

max_clients=2                                 最多主机连接数

chown_uploads=YES                    

chown_username=westos              更改用户登陆时的用户

local_root=/directory                       本地用户家目录修改

local_umask=077                            本地用户上传文件的保留权限

上列所有参数带(+)的,配置文件中是没有的,需要写入到配置文件中。

下面是这些参数的示例,所有修改都在配置文件/etc/vsftpd/vsftpd.conf中,

并且在修改后重启服务,建议在客户端退出登陆后再重启vsftpd

注意:

1.更改ftp配置时(即执行vim /var/vsftpd/vsftpd.conf的命令)完后,都要执行systemctl restart vsftpd

2.每次做下一个实验时都要将环境还原到最适合的状态否则会影响下一个实验(尤其是更改:配置的实验)

禁止匿名用户登陆

更改之前:


重启服务后如下图,登陆成功是可以浏览到其内容,否则为失败:



禁止本地用户登陆(改的时候将anonymous_enable参数改回为YES)

改之前



客户端再次登陆会出现530的报错,即成功禁止本地用户登陆:



相应的错误号如下:

530:认证失败,服务不给认证或者认证过程有问题

550:服务本身为开放该功能

553:本地文件系统权限过小

500:本地文件系统权限过大

修改本地用户登陆的权限



/root/westos文件为修改之后上传的文件:

修改本地用户登陆的目录(将上面两个参数改回为YES)
本地用户默认登陆之后的目录为本用户的家目录,修改为/var/ftp:

禁止登陆的用户可写

改之前:



默认情况下匿名用户只有读权限,本地用户有写权限,

所以是对本地用户写权限的控制,

如下图,本地用户student登陆后不能上传和删除文件:



匿名用户可以上传文件

匿名用户上传文件时由于文件权限太小

553:本地文件系统权限过小,如下图


所以需要将pub目录的属性进行更改:

chgrp ftp /var/ftp/pub/          

#设置/var/ftp/pub/目录ftp组(因为匿名用户默认登陆),所以给这个目录的组用户添加写权限

#如果给/var/ftp目录的其他用户增加写权限,往里面上传文件时会报错500(服务端用户权限过大)

chmod 775 /var/ftp/pub/

将pub目录的组改为ftp是因为匿名用户再登陆时默认为ftp用户(如果只给/etc/ftp/pub增加权限不设置ftp用户组的话报错553权限不够)

在给pub的775权限(相当于给组加上w权限)

保证了所有的匿名用户可以上传文件:

更改匿名用户家目录

在anon_upload enable=YES

下加上anon_root=/root/westos

默认情况下匿名用户在登陆之后的目录为/var/ftp,更改为/root/westos




允许匿名用户上传

改之前:


更改匿名用户上传文件的权限,默认为077,更改为022之后,如下:



文件huige2为修改默认权限后的文件。

允许匿名用户可以下载
anon_world_readable_only=NO



允许匿名用户可以删除
anon_other_write_enable=YES

anon_mkdir_write_enable=YES  #使匿名用户可以创建目录


只允许同时存在2个链接



当有第三个链接时,登陆失败:



所有用户登陆的用户都为westos

chown_uploads=YES
chown_username=westos

#设置后所有匿名用户登陆后就是以westos用户的身份去完成动作的


修改之后在上传文件的所有人为westos,westos的id为1002

看文件huig3的ID与westos相同




可以设置登陆黑名单

#将上一个实验的两个参数注释

#chown_uploads=YES
#chown_username=westos

禁止一些用户登陆lftp服务器。涉及两个文件

/etc/vsftpd/user_list   临时黑名单
/etc/vsftpd/ftpusers    永久黑名单

将本地用户huige加入/etc/vsftpd/user_list文件之后,huige用户就不能登陆:

临时黑名单和永久黑名单最大的区别是,

加入永久黑名单的用户永远不能登陆,但是加入临时黑名单的用户,

在给配置文件加上以下参数之后,临时黑名单就转化为了白名单,

只有在user_list文件中用户可以登陆,其余用户都禁止登陆:

userlist_deny=NO

   在实际生产应用中,客户端在登陆时需要注册帐号

qq的用户非常多,如果每个用户注册帐号,服务端就要创建一个本地用户,

是没有 办法实现的。因为本地用户的创建个数是有一定数量的,比实际生产所需要的用户要少的多,

所以就需要创建一些虚拟帐号,来满足这种生产环境。

要生成虚拟用户,首先需要以一张表去记录这些虚拟用户,

在/etc/vsftpd/目录下创建一个文件,文件名根据自己的喜好而定:

该文件是明文的,为了安全,需要对 该文件加密:

-T 转换

-t  指定加密方式
-f  指定加密文件
/etc/vsftpd/loginusers.db  加密后的文件

加密完成之后需要在/etc/pam.d/目录下创建一个文件,如下:

account  帐号
required  必须有帐号
pam_userdb.so db=/etc/vsftpd/loginusers  通过pam_userdb.so插件去/etc/vsftpd/loginusers

vim /etc/pam.d/xvnivsftpd

[root@ftpserver pam.d]# cat xvnivsftpd
account required pam_userdb.so db=/etc/vsftpd/loginusers
auth required pam_userdb.so db=/etc/vsftpd/loginusers

编辑配置文件:

如图:修改pam_service_name=vsftpd

            为pam_service_name=xvnivsftpd

            并添加guest_enable=YES

检测:

在另一个shell中用虚拟用户连接

虚拟用户使用本地用户身份登陆:

我将/etc/vsftpd/loginusers的内容改了然后重做了一下:

[root@ftpserver ~]# cat /etc/vsftpd/loginusers
redhat1
123
redhat2
123
redhat3
123

[root@ftpserver ~]# db_load -T -t hash -f /etc/vsftpd/loginusers /etc/vsftpd/loginusers.db

[root@ftpserver ~]# useradd redhat

我们这里想让虚拟用户登陆使用server上本地用户redhat身份:

[root@ftpserver ~]# vim /etc/vsftpd/vsftpd.conf

pam_service_name=xvnivsftpd
guest_enable=YES
#userlist_enable=NO
tcp_wrappers=YES
guest_username=redhat

[root@ftpserver redhat3]# systemctl restart vsftpd

[root@ftpserver ~]# chmod u-w /home/redhat     

#如果这里不去掉文件所属者的写权限,客户端使用虚拟用户登陆时报错500(权限过大),如下

#ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

客户端测试:

[root@ftpclient ~]# vim 幸福

[root@ftpclient ~]# lftp 172.25.21.1 -u redhat1

Password:
lftp redhat1@172.25.21.1:~> ls      
lftp redhat1@172.25.21.1:/> put 幸福
put: Access failed: 553 Could not create file. (幸福)

#然后这里报错553本地文件权限过小

#所以我们又给server上的u+w

server端:

[root@ftpserver vsftpd]# chmod u+w /home/redhat

客户端:

[root@ftpclient ~]# lftp 172.25.21.1 -u redhat1
Password:
lftp redhat1@172.25.21.1:~> ls      

lftp redhat1@172.25.21.1:/> put 幸福
8 bytes transferred
lftp redhat1@172.25.21.1:/> ls
-rw-------    1 1003     1003            8 Oct 14 10:14 幸福

 

服务端:

[root@ftpserver vsftpd]# id redhat
uid=1003(redhat) gid=1003(redhat) groups=1003(redhat)

#可以看到上传的文件的用户id和组id都是redhat用户的id

虚拟用户成功使用指定本地用户身份登陆ftp服务

 

指定虚拟账户登陆时的家目录:

[root@ftpserver ~]# vim /etc/vsftpd/vsftpd.conf

tcp_wrappers=YES
guest_username=redhat
local_root=/redhathome/$USER
user_sub_token=$USER

[root@ftpserver redhat3]# systemctl restart vsftpd

[root@ftpserver ~]# mkdir /redhathome/

[root@ftpserver ~]# chgrp redhat /redhathome/

[root@ftpserver ~]# chmod g+s /redhathome/

[root@ftpserver ~]# mkdir /redhathome/redhat{1..3}

[root@ftpserver ~]# cd /redhathome/redhat1

[root@ftpserver redhat1]# touch redhat1dir

[root@ftpserver redhat1]# cd ..
[root@ftpserver redhathome]# cd redhat2/
[root@ftpserver redhat2]# touch redhat2dir

[root@ftpserver redhat2]# cd ..
[root@ftpserver redhathome]# cd redhat3/
[root@ftpserver redhat3]# touch redhat3dir

客户端:

[root@ftpclient ~]# lftp 172.25.21.1 -u redhat1
Password:
lftp redhat1@172.25.21.1:~> ls      
-rw-r--r--    1 0        1003            0 Oct 14 08:45 redhat1dir
lftp redhat1@172.25.21.1:/> exit
[root@ftpclient ~]# lftp 172.25.21.1 -u redhat2
Password:
lftp redhat2@172.25.21.1:~> ls
-rw-r--r--    1 0        1003            0 Oct 14 08:45 redhat2dir

 

#由于虚拟使用了local_root参数,

所以导致本地用户登陆不上去,

#解决方法: 将local_root注释掉,

在配置文件里添加user_config_dir=/etc/vsftpd/vsftpd_user_conf

mkdir /etc/vsftpd/vsftpd_user_conf

然后创建与本地用户同名的配置文件,

如:

cd /etc/vsftpd/vsftpd_user_conf

vim westos

local_root=/home/westos

保存退出,重启vsftpd即可

多个用户添加多个配置文件即可

 

 

虚拟帐号配置独立

(想让哪个用户干什么用户就干什么 ,vsftpd的安全性就体现在这里)

vim /etc/vsftpd/vsftpd.conf

user_config_dir=/etc/vsftpd/userconf

mkdir -p /etc/vsftpd/userconf
vim /etc/vsftpd/userconf/ftpuser1

在此文件中设定配置文件中的所有参数,此文件的优先级高

只能在登陆服务器的子目录下面写/var/ftp/pub/下面写和上传
直接在/var/ftp/这个目录下不可以操作 发布目录不能给满权限,否则不安全
每次改完配置文件里面 /etc/vsftpd/vsftpd.conf 都要重启 systemctl restart vsftpd

在ftp服务器端改权限有多种方法
方法一
setfacl -m u:ftp:rwx /var/ftp/pub/ 给ftp这个用户对后面这个目录可读可写可执行的权力
因为匿名用户默认以ftp用户的身份登陆ftp服务器
此时匿名用户就可以对pub/这个子目录进行操作
方法二
chgrp ftp /var/ftp/pub
chmod 775 /var/ftp/pub
此时匿名用户就可以对pub/这个子目录进行操作

 

限制ftp用户只在其主目录(/home/用户名)下活动

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

chroot_local_user #是否将所有用户限制在主目录(YES启用,默认值为NO)

                              #安装完vsftpd服务后不做配置的话,默认ftp用户是可以向上切换到目录之外的

chroot_list_enable #是否限制用户的名单,YES启用,NO禁用(默认禁用)

chroot_list_file=/etc/vsftpd/chroot_list    #是否限制在主目录下的用户名单

                                                               #至于是限制名单还是排除名单取决于chroot_local_user的值

#chroot_local_user=YES时,全部用户被锁定在主目录,为NO时所有用户不被锁定,

#chroot_local_user参数是一个全居的设定,我们势必需要在全局设定下能作出一些"微调"(一种例外机制)

所以当chroot_local_user=YES时,我们需要列外:不锁定的用户有哪些

所以当chroot_local_user=NO时,我们需要列外:要锁定的用户有哪些

#当chroot_list_enable=YES则有例外,为NO则无例外

本地用户的主目录是: server端该用户的家目录

匿名用户的主目录是: /var/ftp

                                      

所有用户被锁定到自己的家目录中

chroot_local_user=YES

chmod u-w /home/*
 

不限制所有用户在自己主目录中活动,有要限制的例外,例外用户写在/etc/vsftpd/chroot_list中
chroot_local_user=NO

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list
 

限制所有用户在自己的主目录中活动, 有不限制的例外,例外用户写在/etc/vsftpd/chroot_list中

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

 

 



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值