第四章 搭建FTP服务器实现文件共享和NFS服务器配置
(上课时间2021-08-05,笔记整理时间2021-08-08)
本节所讲内容:
4.1 VSFTP 服务器概述
4.2 安装配置 VSFTP
4.3 实战:匿名访问 VSFTP
4.4 实战:用户名密码方式访问 VSFTP
4.5 NFS 概述 配置 NFS 服务器并实现开机自动挂载
服务器信息:
FTP服务端:CentOS 80 IP:10.170.80.80
FTP客户端:CentOS 81 IP:10.170.80.81
4.1 VSFTP
服务器概述
4.1.1 FTP 服务概述
FTP服务器( File Transfer Protocol Server )是在互联网上提供文件 存储 和访问服务的计算机,它们依照 FTP 协议提供服务。
FTP File Transfer Protocol: 文件传输协议)作用: Internet 上用来传送文件的协议。
常见FTP 服务器:
Windows:Serv U 、 FTP Server 、 filezilla _server
Linux:ProFTPD: Professional FTP daemon 一个 Unix 平台上或是类 Unix 平台上(如Linux, FreeBSD 等)的 FTP 服务器程序。
4.1.2 本节主讲: VSFTP
VSFTP 是一个基于 GPL 发布的类 Unix 系统上使用的 FTP 服务器 软件,它的全称是 Very Secure
FTP 从此名称可以看出来,编制者的初衷是代码的安全。
特点:它是一个安全、高速、稳定的 FTP 服务器 。
VSFTP 模式: C/S 模式
监听端口:20 、 21 [root@centos80 ~]# vim /etc/services #查看 services 文件
如图 4 1 所示
FTP 监听的端口有两个:
端口 20:用于传输数据
端口 21:用于传输指令
4.1.3 工作流程(原理)分为两种模式:
主动和被动模式:
FTP 会话包含了两个通道,控制通道和数据传输通道,FTP 的工作有两种模式,一种是主动模式,一种是被动模式,以 FTP Server 为参照,主动模式,服务器主动连接客户端传输,被动模式,等待客户的连接。
主动模式(PORT)的工作原理:
FTP 客户端连接到 FTP 服务器的 21 号端口,发送用户名和密码,客户端随机开放一个端口(1024以上),发送 PORT 命令到 FTP 服务器,告知服务器客户端采用主动模式并开放端口,FTP 服务器收到PORT 主动模式命令和端口后,通过服务器的 20 号端口和客户端开放的端口连接,发送数据,原理如图4-2 所示,(无论是主动还是被动模式,首先的控制通道都是先建立起来,只是在数据传输模式上的区别)
被动模式的工作原理:
PASV 是 Passive 的缩写,中文成为被动模式,工作原理:FTP 客户端连接到 FTP 服务器所监听的21 号端口,发送用户名和密码,发送 PASV 命令到 FTP 服务器,服务器在本地随机开放一个端口(1024 以上),然后把开放的端口告知客户端,而后客户端再连接到服务器开放的端口进行数据传输,原理如图 4-3 所示。
图 4-3 FTP 被动模式工作原理图
主 21 20
被 21 1024 以上
4.2 安装 vsftp 服务器端、客户端
使用 rpm 安装本地光盘中的 vsftp 程序包:[root@centos80 ~]# rpm -ivh /media/Packages/vsftpd-3.0.2-25.el7.x86_64.rpm
或:
使用 yum 直接安装(两种安装方法,选取其中一种即可):[root@centos80 ~]# yum -y install vsftpd
4.2.1 安装客户端: [root@CentOS81 ~]# yum install -y lftp #使用 yum 安装 ftp 客户端
lftp Linux 客户端:
lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp、ftps、http、https、hftp(其中ftps 和 https 需要在编译的时候包含 openssl 库),lftp 的界面非常类似一个 Shell,有命令补全、历史记录、允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载、等功能。
4.2.2 配置文件位置:
vsftpd 相关文档:
/etc/vsftpd/vsftpd.conf #vsftpd 的核心配置文件。
/etc/vsftpd/ftpusers #用于指定哪些用户不能访问 FTP 服务器,即黑名单。
/etc/vsftpd/user_list #指定允许使用 VSFTP 的用户列表文件,即白名单。 [root@centos80 ~]# vim /etc/vsftpd/user_list #查看 user_list 文件,如图 4-4 所示
图 4-4 VSFTP 的用户列表文件
图 4-4 中的说明:如果 userlist_deny= YES(默认),绝不允许在这个文件中的用户登录 ftp,甚至不提示输入密码。
/etc/vsftpd/vsftpd_conf_migrate.sh #是 vsftpd 操作的一些变量和设置脚本/var/ftp/ #默认情况下匿名用户的根目录
4.2.3 启动服务 [root@centos80 ~]# systemctl start vsftpd #启动 FTP 服务
[root@centos80 ~]# systemctl enable vsftpd #设置开启自动启动 FTP 服务
[root@centos80 ~]# netstat -anput | grep ftp
tcp 0 0 :::21 :::* LISTEN 4190/vsftpd
#注意关闭 iptables 和 SElinux
以上内容中说明 FTP 监听两个端口,但目前 FTP 已经启动了,但经过查看,只查看到 21 号端口,还有 20 号端口没有查看到?
是因为没有数据传输,20 号端口是用于传输数据的,所以 20 号端口是尚未开启,如有数据传输时,20 号端口则会开启。
4.2.4 FTP 服务的使用方法
Linux 系统:以 CentOS80 主机示例(即服务端、客户端为一台主机)[root@centos80 ~]# rpm -ivh /media/Packages/lftp-4.4.8-11.el7.x86_64.rpm #安装 FTP 客户端
[root@centos80 ~]# lftp 10.170.80.80 #连接 FTP 客户端
ctrl+d 或 exit 退出 ? 帮助
Windows 系统:
通过浏览器访问或 打开文件夹,在地址栏输入地址:ftp://10.170.80.80/,如图 4-5 所示。
图 4-5 Windows 系统 FTP 客户端连接服务器
4.2.5 修改配置文件,实战举例匿名访问
实例1
公司技术部准备搭建一台功能简单的 FTP 服务器,允许所有员工上传和下载文件,并允许创建用户自己的目录。
允许所有员工上传和下载文件需要设置成允许匿名用户登录并且需要将允许匿名用户上传功能开启。
4.3 允许匿名用户访问
anon_mkdir_write_enable 字段可以控制是否允许匿名用户创建目录。[root@centos80 ~]# cd /etc/vsftpd/
[root@centos80 vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@centos80 vsftpd]# cp vsftpd.conf{,.bak} #使用命令展开式FTP 配置文件备份,便于后期恢复还原
[root@centos80 vsftpd]# vim vsftpd.conf #编辑 FTP 配置文件,修改以下内容
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
允许匿名用户上传文件并可以创建目录,如图 4-6、4-7 所示。
图 4-6 允许匿名用户上传文件并可以创建目录
图 4-7 允许匿名用户上传文件并可以创建目录[root@centos80 vsftpd]# systemctl restart vsftpd #重启 FTP 服务,使配置文件生效
测试:创建目录提示不能写,如图 4-8 所示。
[root@centos80 vsftpd]# chown ftp.ftp /var/ftp/pub/ #修改 FTP 共享目录属主、属组为 ftp 用户
再次测试,结果:可以新建文件夹,但是不能重命名,不能删除![root@centos80 vsftpd]# vim vsftpd.conf #编辑 FTP 配置文件,修改以下内容
anon_other_write_enable=YES #手动添加下这行(匿名帐号可以有写的权限)
[root@centos80 vsftpd]# systemctl restart vsftpd #重启 FTP 服务,使配置文件生效
可以删除文件夹了,这个参数对匿名用户来说权限太大,不安全,使用这个参数需要考虑安全性。[root@centos80 vsftpd]# ll /var/ftp #默认匿名用户家目录的权限是 755
总用量 0
drwxr-xr-x 2 ftp ftp 6 10月 31 2018 pub
注意,默认匿名用户家目录的权限是 755,这个权限是不能改变的。切记!
4.4 用户名密码方式访问 VSFTP
实例2
公司内部现在有一台 FTP 和 WEB 服务器,FTP 的功能主要用于维护公司的网站内容,包括上传文件、创建目录、更新网页等等。公司现有两个部门负责维护任务,他们分别使用 team1 和 team2帐号进行管理。先要求仅允许 team1 和 team2 帐号登录 FTP 服务器,但不能登录本地系统,并将两个帐号的根目录限制为/var/www/html,不能进入该目录以外的任何目录。
ftp 和 www web 服务器相结合。
www web 服务器根目录:/var/www/html
只允许:team1 和 team2 两用户 可以上传,vsftp 禁止匿名。
分析:
将 FTP 和 WEB 服务器做在一起是企业经常采用的方法,这样方便实现对网站的维护,为了增强安全性,首先需要使用仅允许本地用户访问,并禁止匿名用户登录。其次使用 chroot 功能将 team1 和team2 锁定/var/www/html 目录下。如果需要删除文件则还需要注意本地权限。
建立维护网站内容的 ftp 帐号 team1 和 team2 并禁止本地登录,然后设置其密码。[root@centos80 vsftpd]# useradd -s /sbin/nologin teame1 #创建 team1 用户,并禁止登录系统
[root@centos80 vsftpd]# useradd -s /sbin/nologin teame2 #创建 team2 用户,并禁止登录系统
[root@centos80 vsftpd]# echo "123456" | passwd --stdin teame1 #设置 team1 用户密码
[root@centos80 vsftpd]# echo "123456" | passwd --stdin teame2 #设置 team2 用户密码
vsftp 判定是否是有效用户还要判定是否为系统用户。所以要在此文件中添加创建用户的 shell 类型。
配置 vsftpd.conf 主配置文件并作相应修改[root@centos80 vsftpd]# cp vsftpd.conf.bak vsftpd.conf #恢复此前备份的 FTP 配置文件覆盖当前的 FTP 配置文件
cp:是否覆盖"vsftpd.conf"? y #输入 y 确认覆盖当前配置文件
[root@centos80 vsftpd]# vim vsftpd.conf #编辑 FTP 配置文件,修改以下内容
anonymous_enable=NO #禁止匿名用户登录
local_enable=YES #允许本地用户登录chroot)chroot_local_user=YES
local_root=/var/www/html #设置本地用户的根目录为/var/www/html
chroot_list_enable=YES #开启 chroot 功能(default follows)
chroot_list_file=/etc/vsftpd/chroot_list #设置锁定用户在根目录中的列表文件,此文件存放要锁定的用户名
allow_writeable_chroot=YESchroot_list_file=/etc/vsftpd/chroot_list #允许锁定的用户有写的权限,修改完成后保存并退出
图 4-11 禁止匿名用户、允许本地用户登录
修改如图 4-12 所示的内容为如图 4-13 所示内容:
图 4-12
图 4-13
建立/etc/vsftpd/chroot_list 文件,添加 team1 和 team2 帐号[root@centos80 vsftpd]# vim /etc/vsftpd/chroot_list #创建chroot_list文件写入用户名一行一个
teame1
teame2
[root@centos80 vsftpd]# ll -d /var/www/html/ #以长格式查看/var/www/html/目录,-d 选项用于查看目录本身,不包含目录下的文件。
drwxr-xr-x+ 4 root root 4096 8月 1 12:24 /var/www/html/
[root@centos80 vsftpd]# chmod -R o+w /var/www/html/
[root@centos80 vsftpd]# ll -d /var/www/html/ #赋予/var/www/html/目录和该目录下所有文件的写权限。
drwxr-xrwx+ 4 root root 4096 8月 1 12:24 /var/www/html/
重启 vsftpd 服务使配置生效[root@centos80 vsftpd]# systemctl restart vsftpd #重启 FTP 服务,使配置文件生效
[root@centos80 vsftpd]# cp /etc/passwd /var/www/html/ #拷贝测试文件
客户端LFTP登陆测试[root@CentOS81 ~]# lftp 10.170.80.80 -u teame1,123456
lftp teame1@10.170.80.80:~> ls
-rw-r--r-- 1 0 0 2372 Aug 08 08:10 passwd
扩展: 配置 vsftpd,使用 SSL 证书加密数据传输
FTP 与 HTTP 一样缺省状态都是基于明文传输,希望 FTP 服务器端与客户端传输保证安全,可以为 FTP 配置 SSL
4.4.1 使用 OpenSSL 生成自签证书 [root@centos80 vsftpd]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3650
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]:ZH
State or Province Name (full name) []:NX
Locality Name (eg, city) [Default City]:YC
Organization Name (eg, company) [Default Company Ltd]:JLH
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:JLH.COM
Email Address []:JLH@126.com
OpenSSL 简单参数解释:
req #是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。
x509 #X.509 证书数据管理。
days #定义证书的有效日期。
newkey #指定证书密钥处理器。
keyout #设置密钥存储文件。
out #设置证书存储文件,注意证书和密钥都保存在一个相同的文件
4.4.2 创建证书文件存放目录 [root@centos80 ~]# cd /etc/vsftpd
[root@centos80 vsftpd]# mkdir .sslkey #创建隐藏目录存放证书文件
[root@centos80 vsftpd]# mv vsftpd.pem .sslkey/ #移动证书文件到.sslkey 目录下
[root@centos80 vsftpd]# chmod 400 .sslkey/vsftpd.pem #赋予证书文件 400 权限
4.4.3 修改配置文件,支持 SSL [root@centos80 vsftpd]# vim vsftpd.conf #编辑配置文件在120行添加如下内容config
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem
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。
ssl_sslv2=YES #指定 vsftpd 支持 SSL v2。
ssl_sslv3=YES #指定 vsftpd 支持 SSL v3。
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
图 4-14 添加支持 ssl 配置
上面的配置项不要添加到 vsftpd.conf 文件最后也不要加注释 ,否则启动报错。而且配置后不能有多余的空格 。
修改完配置文件后,重启服务生效。
4.4.4 配置 FileZilla 客户端验证
图 4-15 配置 FileZilla 客户端验证
提示证书认证,点击“在以后的会话中始终信任该证书”---》点击“确定”如图 4-16 所示。
图 4-16 未知证书
连接成功,可以使用 TLS 加密传输了,如图 4-17 所示。
如图 4-17 使用 TLS 加密传输
4.5 NFS 概述-配置 NFS 服务器并实现开机自动挂载
4.5.1 NFS 服务端概述:
NFS,是 Network File System 的简写,即网络文件系统。网络文件系统是 FreeBSD 支持的文件系统中的一种,也被称为 NFS.NFS 允许一个系统在网络上与他人共享目录和文件。通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,如图 4-18 所示。
NFS 的模式: C/S 模式
NFS 监听的端口: 2049
CentOS7 是以 NFSv4 作为默认版本,NFSv4 使用 TCP 协议(端口号是 2049)和 NFS 服务器建立连接。
NFS 是通过网络进行数据传输的,传输数据的端口为 2049。但是由于文件系统非常复杂,因此NFS 还有其他程序去启动额外的端口。NFS 默认使用传输的端口是随机选择的小于 1024 的端口。将端口告知客户端是需要依赖于 RPC(remote procedure call,RPC)协议。
当 NFS 服务启动时,会随机选取数个端口,并向 RPC 注册,因此 RPC 就可以知道每个端口对应的NFS 功能。
RPC 最主要的功能就是指定每个 NFS 功能所对应的端口号,并告知客户端。以便客户端连接至正确的端口号。[root@centos80 vsftpd]# vim /etc/services #查看 services 文件,如图 4-19 所示
图 4-19 NFS 监听端口号
4.5.2 安装 NFS: [root@centos80 vsftpd]# yum -y install rpcbind nfs-utils #使用 yum 方式安装 NFS
1.NFS配置文件位置: [root@centos80 ~]# ls /etc/exports #NFS 的共享主目录
/etc/exports
2. 启动 NFS 服务 [root@centos80 ~]# netstat -antup | grep 2049 #先查看 2049 端口是否被占用
[root@centos80 ~]# systemctl start rpcbind #启动 rpcbind 服务
[root@centos80 ~]# systemctl start nfs-server.service #启动 NFS 服务
[root@centos80 ~]# systemctl enable nfs-server.service #设备 NFS 服务开机启动
[root@centos80 ~]# netstat -antup | 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 之前要先启动 RPC,否则 NFS 就无法向 RPC 进行注册。另外如果 RPC 重新启动,原来的注册数据就会消失。所以,在重启 RPC 之后,它所管理的服务都要重启以重新向 RPC 注册。
3.服务的使用方法
showmount -e NFS 服务器 IP [root@centos80 ~]# showmount -e 10.170.80.80
Export list for 10.170.80.80:
4.客户端尝试挂载: [root@CentOS81 ~]# mount 10.170.80.80:/tmp /opt
mount.nfs: access denied by server while mounting 10.170.80.80:/tmp
5.修改配置文件 [root@centos80 ~]# vim /etc/exports
[root@centos80 ~]# cat /etc/exports
/mountnfs (rw)
[root@centos80 ~]# exportfs -rv
exporting *:/mountnfs
[root@centos80 ~]# showmount -e 10.170.80.80
Export list for 10.170.80.80:
/mountnfs
备注:
/media 表示共享的目录。
表示对所有网段开放权限,也可以设置指定特定的网段。
(rw) 表示访问权限。
6.客户端挂载 NFS 服务的共享设备: [root@CentOS81 ~]# mount -t nfs 10.170.80.80:/mountnfs/ /opt/
[root@CentOS81 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_centos-root 50G 3.9G 47G 8% /
devtmpfs 470M 0 470M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.0M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 1014M 166M 849M 17% /boot
tmpfs 98M 0 98M 0% /run/user/0
10.170.80.80:/media 4.3G 4.3G 0 100% /opt
7.实现开机自动挂载 NFS 服务共享设备: [root@CentOS81 ~]# vim /etc/fstab #编辑/etc/fstab 文件,在文件最后添加自动挂载的信息
图 4-20 开机自动挂载[root@CentOS81 ~]# mount -a #将/etc/fstab的所有内容重新加载
[root@CentOS81 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_centos-root 50G 3.9G 47G 8% /
devtmpfs 470M 0 470M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.0M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 1014M 166M 849M 17% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /media
10.170.80.80:/mountnfs 4.3G 4.3G 0 100% /opt
8.验证写入权限: [root@CentOS81 ~]# touch /opt/nfstest.txt #在 NFS 共享设备上创建文件
touch: 无法创建"/opt/nfstest.txt": 只读文件系统
9.解决方法:
设置访问权限一般包含 2 部分
(1) 服务本身权限
(2) 目录访问权限
nfs 默认使用 nfsnobody 用户 [root@centos80 ~]# grep nfs /etc/passwd
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
10.修改权限 [root@centos80 ~]# chown nfsnobody.nfsnobody -R /mountnfs
或者
[root@centos80 ~]# chmod 777 -R /mountnfs/ #不建议用这种方式
11.再次验证写入权限: [root@CentOS81 ~]# touch /opt/testnfs.txt
[root@CentOS81 ~]# ll !$
ll /opt/testnfs.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 8月 8 17:46 /opt/testnfs.txt
以下是一些 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 用户具有根目录的完全管理访问权限。
选项使用方法示例:[root@CentOS80 ~]# vim /etc/exports
/mountnfs/mounfs/no_root_squash *(rw,no_root_squash)
/mountnfs/mounfs/sync 10.170.80.0/24(rw,sync)
/mountnfs/mounfs/ro 10.170.80.80(ro)
/mountnfs/mounfs/all_squash 10.170.80.0/24(rw,all_squash,anonuid=500,anongid=500)
/mountnfs/mounfs/async 10.170.80.0/255.255.255.0(async)
/mountnfs/mounfs/rw 10.170.80.0/255.255.255.0(rw) 10.170.81.0/255.255.255.0(rw)
/mountnfs/mounfs/root_squash *(rw,root_squash)
[root@centos80 ~]# exportfs -rv
总结:
4.1 VSFTP 服务器概述
4.2 安装配置 VSFTP
4.3 实战:匿名访问 VSFTP
4.4 实战:用户名密码方式访问 VSFTP
4.5 NFS 概述-配置 NFS 服务器并实现开机自动挂载