当前位置: 首页 > 工具软件 > FTP for PHP > 使用案例 >

FTP服务以及NFS服务

关宏毅
2023-12-01

FTP服务以及NFS服务

1、vsftp服务简介

ftp服务器:就是file transfer protocol server ,就是在互联网上提供文件存储和访问服务的计算机,是依照ftp协议提供服务的;

ftp:就是文件传输协议,file transfer protocol;

我们常见的ftp服务:

  • proftpd:这是一个unix平台上或者是类Unix平台上的ftp程序
  • vsftpd:这个就是我们主要用的

vsftp:就是一个基于GPL发布的类Unix系统上使用的ftp服务器软件,全称就是非常安全的文件传输协议;very secure file transfer protocol;

  • 这是个很安全、高速、稳定的ftp服务器
  • 模式也是C/S模式
  • 端口:20—>适用于传输数据的
  • 端口:21–>这个是传输指令的

简单的理解一下vsftp的工作原理

  • ftp会话会有两个通道
    • 一个是控制通道
    • 一个是数据通道
  • ftp的工作也会有两种模式
    • 一种是主动模式:服务器主动连接客户端
    • 一种是被动模式:等待客户端的连接
  • 主动模式的讲解:
    • 客户端–>连接到ftp服务器的21端口–>发发欧诺个用户名和密码
    • 客户端随机开放一个1024以上的端口–>通过21端口发送命令到ftp服务器
    • 然后ftp收到主动模式的命令和端口后,通过20宽口和客户端开放的1024以上的端口建立连接–>然后发送数据

主动模式大致的过程如下:

1)客户端发起ftp的请求–>包括用户名、密码;还有一个随机的1024以上的端口

2)然后服务器接收到的信息,响应一个ACK,通过21端口和客户端建立连接

3)然后服务器在把自己的20号端口和客户端的1024以上的端口建立连接,请求就是主动模式命令提供的端口

4)最后客户端发送ACK确认了,开始传输数据

被动模式的讲解

PASV是passive的缩写,就是被动模式;

1)客户端连接到服务器的21端口–>发送用户名和密码,–>然后再发送PASV命令到ftp服务器端

2)然后服务器在本地随机开放一个1024以上的端口,告诉客户端

3)然后客户端连接服务器开放的端口–>传输数据

其实这里的主动模式和被动模式都是相对于FTP server 端来判断的

  • 如果server去连接client开放的端口就是主动的;
  • 如果客户端去连接server开放的端口就是被动的;

2、vsftp服务的搭建

vsftpd服务的搭建也是很简单;直接一条命令就能够完成

[root@vsftpd-server ~]# yum -y install vsftpd lftp

上面的一条命令涉及了lftp

  • 从rhel6开始,系统镜像中默认就是没有ftp客户端的命令,取而代之的就是lftp命令
  • lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。
  • llftp的界面非常好一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。

了解一下vsftpd的相关重要的文件

[root@vsftpd-server ~]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd				
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers				#这个文件用于指定那些用户不能访问ftp服务器,黑名单
/etc/vsftpd/user_list				#这个就是指定哪些用户可以访问ftp服务器,白名单
/etc/vsftpd/vsftpd.conf				#这个就是vsftpd服务的核心配置文件
		#如果userlist_deny= YES(默认),绝不允许在这个文件中的用户登录ftp,甚至不提示输入密码
#还有两个文件需要了解
[root@vsftpd-server ~]# cat /etc/vsftpd/vsftpd_conf_migrate.sh 	#这个是vsftpd操作的一些变量和设置脚本
#!/bin/bash
#move old config files and symlink them
#shipped with vsftpd-2.0.1-6
PREFIX="vsftpd"
for file in $( ls /etc/${PREFIX}.* ); do
    if [ ! -L $file ]; then
        new=`echo $file | sed s/${PREFIX}\./${PREFIX}\\\\//g | sed s/\.rpmsave//g`
        mv -f ${file} ${new}
	ln -s ${new} ${file}
	echo $file moved to $new
    fi
done

[root@vsftpd-server ~]# ll -d /var/ftp/		#这个目录是默认情况下匿名用户的根目录
drwxr-xr-x 3 root root 17 3月   8 00:24 /var/ftp/

安装好了vsftpd服务器之后启动

#启动vsftpd
[root@vsftpd-server ~]# systemctl start vsftpd

#然后查看端口
[root@vsftpd-server ~]# netstat -ntlup |grep  vsftpd
tcp6       0      0 :::21                   :::*                    LISTEN      9594/vsftpd 
	#我们并没有看到20端口-->理由就是并没有产生数据通信

#使用客户端使用匿名用户登录vsftpd
[root@Node5 ~]# yum -y install lftp

[root@Node5 ~]# lftp 192.168.75.134
lftp 192.168.75.134:~> pwd               
ftp://192.168.75.134

如果需要在windows访问–>打开浏览器、或者是文件夹输入:\ftp:192.168.75.134

3、vsftp的案例讲解配置文件

案例一:准备搭建一台简单的ftp服务器,允许所有员工上传和下载文件,并且可以创建自己的目录

分析:

  • 允许所有员工上传和下载文件–>可以理解为循序匿名用户登入并且允许匿名用户上传功能
    • anon_mkdir_write_enable:这个可以控制匿名用户是否能够创建目录
#修改配置文件->一般操作前都是需要复制一份备份文件的,以免改挂了可以恢复到原来的
[root@vsftpd-server ~]# cp -a /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
[root@vsftpd-server ~]# vim /etc/vsftpd//vsftpd.conf
	#并不是所有的选项都要修改-->只修改以下注明的选项
anonymous_enable=YES			#这个代表能够允许匿名用户访问
anon_upload_enable=YES			#允许匿名用户上传文件
anon_mkdir_write_enable=YES		#允许匿名用户可以创建目录

#修改好了之后重启
[root@vsftpd-server ~]# systemctl restart vsftpd

#然后使用另外一台客户机测试
windows-->打开ftp的软件-->尝试创建文件-->失败

#这里明显发现没法创建目录,于是报错了个550的报错-->回到服务器端去操作
	#这里我们得考虑一下是否是权限导致了-->是否开放777权限呢还是给到特殊权限等等的问题
[root@vsftpd-server ~]# ll -d /var/ftp/pub/
drwxr-xr-x 2 root root 6 6月  10 2021 /var/ftp/pub/

#尝试修改一下ftp用户
[root@vsftpd-server ~]# chown ftp. /var/ftp/pub/

#再次回到客户端尝试创建成功了-->但是你会发现没法重命名这个目录

[root@vsftpd-server ~]# ls /var/ftp/pub/
?½??ļ???  ?½??ļ??? (1)


#回到服务器端去操作-->
[root@vsftpd-server ~]# vim /etc/vsftpd/vsftpd.conf
.............
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES			#添加这一行,允许ftp服务器重命名功能

#重启服务
[root@vsftpd-server ~]# systemctl restart vsftpd


#再次回到客户端去验证重命名即可

匿名用户用于浏览就比较好,权限太大是不会建议的;

甚至工作中,匿名用户只能有只读访问的功能,连写权限都没有

案例二:公司有个服务器分别是有ftp和web;ftp主要用户维护公司的网站内容;

然而包括文件、创建目录、更新网页等等;

公司只让两个部门使用user1和luser2来管理;

首先允许user1和user2允许登入vsftp,但是不能邓金本地系统,并将两个账户的活动范围只能在/var/www/html,除了这个目录就不能去到其他目录;

分析:

  • 这里涉及了两个服务–>vsftpd和www服务
  • 这里明显也发现只允许user1和user2来对/var/www/html的目录来进行管理,其他都不行
  • 这里也明确了需要本地用户访问、禁止匿名用户访问,如果删除文件则还需要本地权限
#首先模拟一下网站的默认页面以及user1和user2的本地账户
[root@vsftpd-server ~]# systemctl restart vsftpd
[root@vsftpd-server ~]# chmod a-w /var/ftp/ -R
[root@vsftpd-server ~]# mkdir /var/www/html -p
[root@vsftpd-server ~]# useradd -s /sbin/nologin user1
[root@vsftpd-server ~]# echo  "123456" | passwd --stdin user1
更改用户 user1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@vsftpd-server ~]# useradd -s /sbin/nologin user2
[root@vsftpd-server ~]# echo  "123456" | passwd --stdin user2
更改用户 user2 的密码 。
passwd:所有的身份验证令牌已经成功更新。

#然后去到vsftpd的配置文件修改配置文件
[root@vsftpd-server ~]# vim /etc/vsftpd/vsftpd.conf
.........
anonymous_enable=NO			#禁止匿名用户登入
local_enable=YES			#允许本地用户登录
local_root=/var/www/html		#这里设备本地用户的根目录就是/var/www/html
chroot_list_enable=YES			#激活chroot功能
chroot_list_file=YES		#设置锁定用户在根目录中的列表文件。此文件存放要锁定的用户名
allow_writeable_chroot=YES		#允许锁定的用户有写的权限

#然后创建所动用户的文件
[root@vsftpd-server ~]# vim /etc/vsftpd/chroot.list
user1
user2

#添加/var/www/html的权限
[root@vsftpd-server ~]# chmod -R o+w /var/www/html
[root@vsftpd-server ~]# ll /var/www/html/ -d
drwxr-xrwx 2 root root 6 3月   8 22:52 /var/www/html/

#重启vsftpd
[root@vsftpd-server ~]# systemctl restart vsftpd

#然后去到客户端查看
[root@Node5 ~]# lftp 192.168.75.134 -u user1,123456
lftp user1@192.168.75.134:~> ls
-rw-r--r--    1 0        0            1172 Mar 08 15:19 passwd
lftp user1@192.168.75.134:/> 

#最后尝试添加数据看看
lftp user1@192.168.75.134:~> ls
-rw-r--r--    1 0        0            1172 Mar 08 15:19 passwd
lftp user1@192.168.75.134:/> mkdir lala
mkdir 成功, 建立 `lala'
lftp user1@192.168.75.134:/> mv lala haha
重命名成功
lftp user1@192.168.75.134:/> echo aaa > haha

4、vsftpd使用ssl证书加密数据传输

ftp和http是一样缺省的状态都是基于明文传输的,如果想要ftp服务器端与客户端传输保证安全,需要为ftp设置一个ssl证书;

直接到实验

#使用openssl生成之前证书-->先敲上命令,后续在给命令解释
[root@vsftpd-server ~]# openssl  req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3560
Generating a 2048 bit RSA private key
............................+++
.................+++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:ZG				#指定国家名字
State or Province Name (full name) []:GZNS			#算是省份 
Locality Name (eg, city) [Default City]:WQS			#算是城市
Organization Name (eg, company) [Default Company Ltd]:LIANGJIAWEI	#公司名
Organizational Unit Name (eg, section) []:LIANGJIAWEI				#组织名
Common Name (eg, your name or your server's hostname) []:LIANGJIAWEI.COM		#服务器名字
Email Address []:LIANGJIAWEI.QQ.COM			#邮箱


#因为是证书文件,涉及安全性-->因此创建一个专门存放证书的 文件夹
[root@vsftpd-server ~]# mkdir .sslkey
	#把权限设置成400
[root@vsftpd-server ~]# cp vsftpd.pem .sslkey/
[root@vsftpd-server ~]# chmod 400 .sslkey/vsftpd.pem 

#然后需要修改一下vsftpd的配置文件,使得配置文件支持ssl的功能
[root@vsftpd-server ~]# vim /etc/vsftpd/vsftpd.conf
	#空白处添加如下几行
# config ssl				#配置ssl
ssl_enable=YES				#启用SSL支持
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES			#上面四行force表示强制匿名用户使用加密登陆和数据传输
ssl_tlsv1=YES					#指定vsftpd支持TLS v1
require_ssl_reuse=NO			#不重用SSL会话,安全配置项
ssl_ciphers=HIGH				#允许用于加密 SSL 连接的 SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem		#定义SSL证书和密钥文件的位置


#注意:上面的配置项不要添加到vsftpd.conf 文件最后,否则启动报错

#重启服务
[root@vsftpd-server ~]# systemctl restart vsftpd
[root@vsftpd-server ~]# 

验证:

  • 知道看到这个页面就能够确定可以TLS加密传输了;
  • 在工作中,内网的FTP传输可以不用证书加密传输
  • 如果FTP服务器在贡丸,为了数据的安全性就一定要配置证书加密传输

这里简单介绍一下openssl命令

openssl命令

作用:生成签证证书

语法:openssl+选项

选项:

  • req: 是指定x.509 Cetificate Signing Request 简称是CSR证书签名请求;管理的一个命令
  • x509 是证书数据管理
  • days:指定证书的有效日期
  • newkey:指定证书密钥处理器
  • keyout:设置密钥存储文件
  • out:设置证书存储文件,注意证书和密钥都要保存在相同的一个文件

5、NFS服务讲解

NFS简介

NFS,是Network File System的简写,即网络文件系统。网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4n2KCgWI-1646758331041)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1646756747122.png)]

NFS特点:

  • 模式:典型的C/S模式
  • 端口:7版本的rhel默认是NFSv4版本协议,使用TCP协议
    • 端口号是2049和NFS建立连接

安装NFS

#一如既往的简单,还是yum安装
	#不过这里需要注意两个点-->安装是两个服务
[root@vsftpd-server ~]# yum -y install nfs-utils rpcbind

#众所周知的nfs的共享指定规则的路径是/etc/exports文件
[root@vsftpd-server ~]# ll /etc/exports
-rw-r--r--. 1 root root 0 6月   7 2013 /etc/exports

#我们只有安装了,再看看服务端口
[root@vsftpd-server ~]# netstat -ntlup | grep 2049
		#没看到
#启动nfs服务
[root@vsftpd-server ~]# systemctl start rpcbind
[root@vsftpd-server ~]# systemctl start nfs
#再查看一下端口
[root@vsftpd-server ~]# netstat -ntlup | grep 2049
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::2049                 :::*                    LISTEN      -                   
udp        0      0 0.0.0.0:2049            0.0.0.0:*                           -                   
udp6       0      0 :::2049                 :::*                                -    

客户端检查nfs服务器的开放情况

#客户端也需要安装一下nfs的命令
[root@Node5 ~]# yum -y install nfs-utils
[root@Node5 ~]# showmount -e 192.168.75.134
Export list for 192.168.75.134:

配置文件中的实际应用

首先去到服务器端配置nfs的共享规则

[root@vsftpd-server ~]# vim /etc/exports
/data   *(rw)

	#这里指定了共享的目录是/data/目录
	#然后*代表是对所有的网段都开放,192.168.75.0/24-->这样子及代表能够开放75.0这个网段

#创建数据
[root@vsftpd-server ~]# mkdir -p /data/{aa,bb}

#重启nfs-->这里是重新读取配置文件,不会终端nfs服务
[root@vsftpd-server ~]# exportfs -rv
exporting *:/data

然后去到客户端验证

[root@Node5 ~]# showmount -e 192.168.75.134
Export list for 192.168.75.134:
/data *

#给到共享的目录挂载到本地
[root@Node5 ~]# mdkir /nfs
	#这里是mount 命令  + -t 指定文件类型  然后是远程ip:目录   本地目录
[root@Node5 ~]# mount -t nfs 192.168.75.134:/data/ /nfs

#查看一下是否能够挂载上
[root@Node5 ~]# df -h | grep nfs
192.168.75.134:/data   18G  1.9G   16G   11% /nfs
#进入查看一下数据
[root@Node5 ~]# cd /nfs/
[root@Node5 nfs]# ls
aa  a.txt  bb  b.txt  haha  ko.txt  lala.txt  log.txt  ok.txt

#如果想要开机自动挂载nfs的目录-->需要写入到/etc/fstab文件当中
[root@Node5 nfs]# echo "192.168.75.134:/data/  /nfs nfs defaults 0 0 ">> /etc/fstab



#挂载过后我们可以查看到文件内容
[root@Node5 nfs]# cat a.txt 
#!/bin/bash
cat <<EOF
==========================
1.NGINX
2.MYSQL
3.PHP
==========================
EOF
#如果想要修改文件的内容-->发现权限不够
[root@Node5 nfs]# echo 11 > a.txt 
-bash: a.txt: 权限不够
[root@Node5 nfs]# touch lalala		#创建文件也不行
touch: 无法创建"lalala": 权限不够

如何解决权限不够的问题?

去到服务器端配置;

  • nfs默认是使用的是nfsnobody用户
  • /data/目录的权限不够导致没法操作
#解决办法:
[root@Node5 nfs]# chomd 777 -R /data/


#第二个:
[root@Node5 nfs]# chown nfsnobody. /data/ -R


#再次回到客户端测试就成功了
[root@Node5 nfs]# mv aa cc
[root@Node5 nfs]# ll cc
总用量 0
[root@Node5 nfs]# ll cc -d
drwxr-xr-x 2 nfsnobody nfsnobody 6 3月   9 00:36 cc

nfs的配置文件中权限的常见设置

注意:在发布共享目录的格式中除了共享目录是必跟参数外,其他参数都是可选的。并且共享目录与客户端之间及客户端与客户端之间需要使用空格符号,但是客户端与参数之间是不能有空格的;

 ro                    	只读访问 
 rw                   	读写访问 
 sync               	资料同步写入到内存与硬盘当中
 async             		资料会先暂存于内存当中,而非直接写入硬盘 
 secure             	NFS通过1024以下的安全TCP/IP端口发送 
 insecure          		NFS通过1024以上的端口发送 
 wdelay            		如果多个用户要写入NFS目录,则归组写入(默认) 
 no_wdelay      		如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。 
 Hide                	在NFS共享目录中不共享其子目录 
 no_hide           		共享NFS目录的子目录 
 subtree_check   		如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) 
 no_subtree_check   	和上面相对,不检查父目录权限 
 all_squash             共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 
 no_all_squash         	保留共享文件的UID和GID(默认) 
 root_squash            root用户的所有请求映射成如anonymous用户一样的权限(默认) 
 no_root_squash        	root用户具有根目录的完全管理访问权限 

NFS客户端挂载参数的优化

nfs高并发环境下的服务端重要优化–>可以使用mount -o 指定参数

async 异步同步,此参数会提高I/O性能,但会降低数据安全(除非对性能要求很高,对数据可靠性不要求的场合。一般生产环境,不推荐使用)

noatime 取消更新文件系统上的inode访问时间,提升I/O性能,优化I/O目的,推荐使用。

nodiratime 取消更新文件系统上的directory inode访问时间,高并发环境,推荐显式应用该选项,提高系统性能

intr:可以中断不成功的挂载

rsize/wsize 读取(rsize)/写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务端传输数据的缓冲存储量。一般来说,如果在局域网内,并且客户端与服务端都具有足够的内存,这个
值可以设置大一点,比如说32768(bytes),提升缓冲区块将可提升NFS文件系统的传输能力。但设置的值也不要太大,最好是实现网络能够传输的最大值为限。

内核优化

net.core.wmem_default = 8388608     	#内核默认读缓存
net.core.rmem_default = 8388608      	#内核默认写缓存
net.core.rmem_max = 16777216        	#内核最大读缓存
net.core.wmem_max = 16777216	   		#内核最大写缓存

问题报错汇总

1)当匿名用户登入的时候出现如下报错

lftp 192.168.75.134:~> ls
ls: 登录失败: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

分析过程

据说这个是一个vsftpd的加强选项

  • 有两个办法可以解决
    • 第一个去除/var/ftp/pub的可写权限–>就是chmod a-w
    • 第二个就是添加allow_writeable_chroot=YES
[root@vsftpd-server ~]# chmod a-w /var/ftp/ -R
[root@vsftpd-server ~]# systemctl restart vsftpd
	#这个办法可以
#但是导致了匿名用户是没法创建文件的
lftp 192.168.75.134:/> cd pub/
lftp 192.168.75.134:/pub> ls
dr-xr--r--    2 14       50              6 Mar 08 14:11 ?½??ļ???
dr-xr--r--    2 14       50              6 Mar 08 14:14 ?½??ļ??? (1)
lftp 192.168.75.134:/pub> mkdir aa
mkdir: Access failed: 550 Create directory operation failed. (aa)

这里注意:因为vsftpd的安全机制,不知道应该怎么才能让匿名用户允许上传和下载文件

2)问题二:当本地用户配置vsftpd的时候出现如下报错

500 OOPS: unrecognised variable in config file: chroot_list_file_

分析:

  • 明显是chroot_list_file这个词平措了–>纠正即可解决问题

3)问题三:如果lftp登入vsftpd的时候出现如下报错

ls: 登录失败: 530 Login incorrect. 

分析

这里530的登入失败是可能是user1的是/sbin/nologin的shell–>然而/etc/shells这个文件没有,因此需要写入进去即可解决问题–>服了

[root@vsftpd-server ~]# vim /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/sbin/nologin				#添加这一行


#客户端测试
[root@Node5 ~]# lftp 192.168.75.134 -u user1,123456
lftp user1@192.168.75.134:~> ls
-rw-r--r--    1 0        0            1172 Mar 08 15:19 passwd
lftp user1@192.168.75.134:/> 
         
 类似资料: