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,除此之外还可以用本地用户的身份登陆服务器,
需要强调的是这里的用户是服务端的用户,不是客户端的用户,
并且本地登陆的用户是具有创建,删除,上传和下载权限的。
在服务端创建一个westos和student用户,并给该用户一个密码(我两个设的一样方便记忆):自己设置
在客户端使用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