想要实现文件的远程传输可以使用scp命令和rsync命令,可以参考《Linux基础_文件在系统中的传输rsync》这篇博客,最近我又学到了ftp远程传输服务,只要在ftp服务器上下载相应的软件,将文件放到ftp的发布目录下,客户端只要登陆ftp服务器,就能浏览,下载,上传文件。
要搭建ftp服务器很简单,只要下载其相应的软件vsftp服务端软件和lftp客户端软件就完成了。
在安装软件之前,首先要将selinux内核级防火墙关闭,否则会影响客户端的登陆。编辑/etc/sysconfig/selinux文件,关闭selinux。
[root@localhost ~]# vim /etc/sysconfig/selinux
如下图编辑:

在改变selinux之后需要重启主机,让内核重新加载,识别selinux的值。
除此之外还需要修改防火墙配置,关闭防火墙或者如下方式将lftp服务加入防火墙策略:
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# firewall-cmd --permanent --add-service=ftp
[root@localhost ~]# firewall-cmd --reload #平滑加载火墙配置
[root@localhost ~]# firewall-cmd --list-all #查看火墙策略
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ftp ssh #如果此处有ftp则添加成功
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
下来就可以安装vsftp和lftp了:
[root@localhost ~]# yum install vsftpd -y #安装服务端软件
[root@localhost ~]# yum install lftp -y #安装客户端软件
[root@localhost ~]# systemctl start vsftpd #打开vsftpd
[root@localhost ~]# systemctl enable vsftpd 开机启动
下来客户端就可以进行测试,可以在本机上测试,也可以在别的主机上测试。
[root@localhost ~]# lftp 172.25.254.182

lftp的默认发布目录为/var/ftp/,所以在客户端登陆后看到的是pub目录。
像上面的这种方式是以匿名用户登陆的lftp,除此之外还可以用本地用户的身份登陆服务器,需要强调的是这里的用户是服务端的用户,不是客户端的用户,并且本地登陆的用户是具有创建,删除,上传和下载权限的。
我在我的服务端创建了一个westos用户,并给该用户一个密码:

在客户端使用westos用户登陆ftp服务器:
[root@foundation80 mnt]# lftp 172.25.254.182 -u westos

lftp中没有touch命令,可用的命令可以使用**?** 进行查看。
作为一个有尊严的服务器,是绝对不允许客户端在服务端为所欲为,所以需要对客户端的登陆进行控制,只要在lftp的配置文件/etc/vsftpd/vsftpd.conf中添加相应的参数,就可以进行控制。
常用的lftp配置文件参数:
anonymous_enable=YES #允许匿名用户登陆
local_enable=YES #允许本地用户登陆
write_enable=YES #允许登陆的用户可写
anon_upload_enable=YES #匿名用户可写
anon_root=/westos #更改匿名用户登陆后的家目录(+)
anon_umask=022 #更改匿名用户上传文件的权限(+)
anon_world_readable_only=NO #匿名用户可以浏览文件(+)
anon_other_write_enable=YES #匿名用户可以删除(+)
anon_mkdir_write_enable=YES #匿名用户可以makidr
anon_max_rate=1024000 #1000K,控制下载速率(+)
max_clients=2 #最大链接数(+)
chown_uploads=YES #更改用户登陆时的用户
chown_username=westos
local_root=/directory #本地用户家目录修改
local_umask=077 #本地用户上传文件的保留权限
上列所有参数带(+)的,配置文件中是没有的,需要写入到配置文件中。下面是这些参数的示例,所有修改都在配置文件/var/vsftpd/vsftpd.conf中,并且在修改后重启服务,建议在客户端退出登陆后再重启vsftpd:
禁止匿名用户登陆

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

禁止本地用户登陆

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

相应的错误号如下:
530:认证失败,服务不给认证或者认证过程有问题
550:服务本身未开放这样的功能
553:本地文件系统权限过小
500:本地文件系统权限过大
禁止登陆的用户可写

默认情况下匿名用户只有读权限,本地用户有写权限,所以是对本地用户写权限的控制,如下图,本地用户westos登陆后不能上传和删除文件:

匿名用户可以上传文件

上传文件时会有553的报错,是因为文件权限过小导致的:

所以需要将pub目录的属性进行更改:
[root@localhost westos]# chgrp ftp /var/ftp/pub/
[root@localhost westos]# chmod g+w /var/ftp/pub/
将pub目录的组改为ftp是因为匿名用户再登陆时默认为ftp用户,在给pub的组加上w权限之后,保证所有的匿名用户可以上传文件:

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


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

group和passwd文件为修改前,inittab文件为修改默认权限后的文件。
允许匿名用户可以删除
anon_other_write_enable=YES

允许匿名用户可写

不存在touch命令

控制传输速率
执行以下命令生成一个大小为1000M的file文件:

正常情况下的传输速率如下:

将传输速率更改为1000K之后,传输速率明显变慢:


只允许同时存在2个链接

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

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


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


修改本地用户登陆的权限

group文件为修改之后上传的文件:

修改本地用户登陆的目录
本地用户默认登陆之后的目录为本用户的家目录,修改为/var/ftp:


除了以上这些参数外,还可以设置登陆黑名单,禁止一些用户登陆lftp服务器。涉及两个文件
/etc/vsftpd/user_list #临时黑名单
/etc/vsftpd/ftpusers #永久黑名单
将本地用户lee加入/etc/vsftpd/user_list文件之后,lee用户就不能登陆:

临时黑名单和永久黑名单最大的区别是,加入永久黑名单的用户永远不能登陆,但是加入临时黑名单的用户,在给配置文件加上以下参数之后,临时黑名单就转化为了白名单,只有在user_list文件中用户可以登陆,其余用户都禁止登陆:
userlist_deny=NO

在实际生产应用中,客户端在登陆时需要注册帐号,就好像每个人的qq号。qq的用户非常多,如果每个用户注册帐号,服务端就要创建一个本地用户,是没有办法实现的。因为本地用户的创建个数是有一定数量的,比实际生产所需要的用户要少的多,所以就需要创建一些虚拟帐号,来满足这种生产环境。
要生成虚拟用户,首先需要以一张表去记录这些虚拟用户,在/etc/vsftpd/目录下创建一个文件,文件名根据自己的喜好而定:
[root@localhost vsftpd]# vim /etc/vsftpd/loginusers
westos1 #虚拟帐号westos1
westos1 #虚拟帐号westos1的密码
westos2 #虚拟帐号wetos2
westos2 #虚拟帐号westos2的密码
该文件是明文的,为了安全,需要对 该文件加密:
[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/loginusers /etc/vsftpd/loginusers.db
-t #指定加密方式
-f #指定加密文件
/etc/vsftpd/loginusers.db #加密后的文件
加密完成之后需要在/etc/pam.d/目录下创建一个文件,如下:
[root@localhost vsftpd]# vim /etc/pam.d/ftpauth
account required pam_userdb.so db=/etc/vsftpd/loginusers
auth required pam_userdb.so db=/etc/vsftpd/loginusers
account #帐号
required #必须有帐号
pam_userdb.so db=/etc/vsftpd/loginusers #通过pam_userdb.so插件去/etc/vsftpd/loginusers文件中查找输入的帐号和loginusers中的帐号是否匹配,如果帐号存在,则输入密码进行认证,与account相同。否则登陆失败。
虚拟帐号的设置完成,此时就需要将虚拟帐号和ftp服务联系起来,编辑配置文件:
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=ftpauth #帐号密码认证时去查找/etc/pam.d/ftpauth文件
guest_enable=YES #允许虚拟帐号登陆
编辑配置文件需要重启文件生效策略:
[root@localhost vsftpd]# systemctl restart vsftpd
客户端使用虚拟帐号进行测试:
[root@foundation80 ~]# lftp 172.25.254.181 -u westos1

虚拟帐号登陆成功,并且虚拟帐号在登陆之后在/var/ftp目录下,要使虚拟帐号在登陆时使用别的用户的身份,可以在配置文件中添加以下参数:
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
guest_username=student #让虚拟帐号在登陆ftp服务器时使用student用户的身份

虚拟帐号如果以student的身份登陆时,则进入的是student用户的家目录/home/student/,在该目录下创建了一个studentfile文件进行测试,并且将/home/student/目录的权限改为555:
[root@localhost vsftpd]# systemctl restart vsftpd
[root@localhost vsftpd]# chmod 555 /home/student/
[root@localhost vsftpd]# touch /home/student/studentfile
测试效果如下:

如果需要让虚拟用户在登陆之后有自己独立的家目录,在配置文件中添加以下参数:
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
local_root=/ftpuserhome/$USER
user_sub_token=$USER
$USER #是shell中的一个变量,配置文件中是不识别的,所以需要添加user_sub_token=$USER参数声明$USER是一个shell中的变量。
创建虚拟帐号的独立家目录:
[root@localhost vsftpd]# mkdir -p /ftpuserhome/westos{1..2}
[root@localhost vsftpd]# mkdir /ftpuserhome/westos1/westos1data #westos1的家目录
[root@localhost vsftpd]# mkdir /ftpuserhome/westos2/westos2data #westos2的家目录
重启vsftpd,进行测试:

westos1帐号登陆之后家目录为/ftpuserhome/westos1/,westos2帐号登陆后的家目录为/ftpuserhome/westos2/。
如果在服务的配置文件/etc/vsftpd/vsftpd.conf文件中配置,改变的是所有帐号的配置,如果需要对单独的帐号进行配置,可以在/etc/vsftpd/user_conf/目录下创建文件,该文件名需要和帐号名相同。
[root@localhost vsftpd]# vim /etc/vsftpd/user_conf/westos1
anon_upload_enable=YES #允许westos1帐号上传文件
要上传文件,需要更改/ftpuserhome/westos1/westos1data/权限,让用户可以上传文件:
[root@localhost vsftpd]# chmod 777 /ftpuserhome/westos1/westos1data/
[root@localhost vsftpd]# systemctl restart vsftpd
此时,westos1帐号就可以上传文件,但是westos2帐号无法上传文件。


本文详细介绍如何搭建和配置FTP服务器,包括禁用selinux、防火墙配置、安装vsftp和lftp软件、用户权限控制及虚拟账号设置等关键步骤。
315

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



