FTP简要概述
概念
- FTP是在互联网上提供文件存储和服务访问的计算机服务
- 其可以在互联网上进行文件传输下载
VSFTP
- VSFTP是一个基于GPL类unix系统上使用的FTP服务
- 其是一个安全高速稳定的FTP服务器
FTP监听端口
- 端口20:用来传输数据
- 端口21:用来传输信道指令
FTP模式
主动模式
- FTP的客户端主动向服务端的21号端口发起请求,客户端随机开启一个端口(1024以上)发送port命令到服务端,告知服务端采用主动模式并且开放端口
- 当FTP服务端收到客户端的请求时候进行校验(用户名+密码之类的)校验通过则控制通道建立成功
- 服务度通过20号端口向客户端的空闲端口发起请求进行数据传输
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701104131994-839269989.png)
被动模式
- FTP客户端主动向FTP服务端21号端口发起请求连接
- 客户端通过pasv发送用户名+密码到服务端
- 服务端收到客户端发送来的用户信息进行校验 校验通过随机开启一个端口(大于1024)告知客户端
- 客户端向服务端开放端口进行数据传输
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701104958162-1433421978.png)
VSFTP搭建
安装VSFTP
[root@SR~]# rpm -ivh /mnt/cd/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm # 使用 rpm 安装本地光盘中的 vsftp 程序包
[root@SR~]# yum -y install vsftpd # 使用 yum 直接安装(两种安装方法,选取其中一种即可)
[root@SR~]# yum install -y lftp # 安装VSFTP客户端
配置文件位置
[root@server ~]# /etc/vsftpd/vsftpd.conf # 核心配置文件
[root@server ~]# /etc/vsftpd/ftpusers # 指定那些用户不能访问FTP服务端 即黑名单
[root@server ~]# /etc/vsftpd/ user_list # 指定那些用户不能访问FTP服务端 即白名单
[root@server ~]# /etc/vsftpd/vsftpd_conf_migrate.sh # VSFTP操作的一些变量和脚本
[root@server ~]# /var/ftp # 默认情况下匿名用户的根目录
服务搭建
[root@server ~]# systemctl start vsftpdt # 启动服务
[root@server ~]# netstat -aunpt | grep 21 # 查看监听的端口
[root@client ~]# lftp 1.1.1.1 # 客户端进行连接到服务器
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701140640846-1909956078.png)
配置文件修改
匿名用户访问
[root@server ~]# cd /etc/vsftpd/ # 进入ftp目录下
[root@server vsftpd]# cp vsftpd.conf vsftpd.conf.bak # 备份ftp的配置文件
[root@server vsftpd]# vim vsftpd.conf # 进入配置文件并且修改如下配置
anonymous_enable=YES # 允许匿名用户访问FTP
anon_upload_enable=YES # 允许匿名用户上传文件
anon_mkdir_write_enable=YES # 允许匿名用户创建文件夹
[root@server vsftpd]# systemctl restart vsftpd # 重启配置文件
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701142907148-468151726.png)
[root@server vsftpd]# ll -d /var/ftp/pub/ # 查看共享文件目录的属主/属组
[root@server vsftpd]# chown ftp:ftp /var/ftp/pub/ -R # 修改共享目录的属组/属组
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701143554370-1538723609.png)
[root@server vsftpd]# vim vsftpd.conf
anon_other_write_enable=YES # 匿名用户拥有写的权限
[root@server vsftpd]# systemctl restart vsftpd # 重启服务
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701144538635-948763508.png)
# 上述匿名用户可以随意删除文件权限过大
# 默认匿名用户家目录的权限是755且权限不能改变
[root@server vsftpd]# mkdir /var/ftp/test # 创建测试文件夹 专门用来共享数据
[root@server vsftpd]# ll -d /var/ftp/test/ # 查看文件的属主/属组
[root@server vsftpd]# chown ftp:ftp /var/ftp/test/ -R # 修改文件属主/属组
[root@server vsftpd]# vim vsftpd.conf
# anon_other_write_enable=YES # 关闭匿名用户拥有写的权限
[root@server vsftpd]# systemctl restart vsftpd # 重启服务
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701150444020-2142047649.png)
用户名+密码
'''
1:公司内部现在有一台 FTP 和 WEB 服务器, FTP 的功能主要用于维护公司的网站内容,包括上传文件、创建目录、更新网页等等
2:司现有两个部门负责维护任务,他们分别使用 ftpteam 和 webteam帐号进行管理。
3:先要求仅允许 ftpteam 和 webteam帐号登录 FTP 服务器,但不能登录本地系统,并将这两个帐号的根目录限制为/var/www/html,不能进入该目录以外的任何目录。
4:只允许ftpteam 和 webteam两用户 可以上传, vsftp 禁止匿名。
'''
[root@server vsftpd]# useradd -s /sbin/nologin webteam && echo 123456 | passwd --stdin webteam
[root@server vsftpd]# useradd -s /sbin/nologin ftpteam && echo 123456 | passwd --stdin ftpteam
[root@server vsftpd]# vim /etc/vsftpd/vsftpd.conf #编辑 FTP 配置文件,修改如下
anonymous_enable=NO #禁止匿名用户登录
local_enable=YES #允许本地用户登录
local_root=/var/www/html #设置本地用户的根目录为 /var/www/html。
chroot_list_enable=YES #开启 chroot 功能。
chroot_list_file=/etc/vsftpd/chroot_list #设置锁定用户在根目录中的列表文件。此文件存放要锁定的用户名。
allow_writeable_chroot=YES #允许锁定的用户有写的权限
[root@server vsftpd]# touch /etc/vsftpd/chroot_list #创建 chroot_list 文件 允许登录的用户存放位置
[root@server vsftpd]# vim /etc/vsftpd/chroot_list #写入用户
webteam # 允许的用户
ftpteam
[root@server vsftpd]# ll -d /var/www/html/ # 查看权限
[root@server vsftpd]# chmod -R o+w /var/www/html/ #赋予/var/www/html/目录和该目录下所有文件的写权限。
[root@server vsftpd]# systemctl restart vsftpd # 重启服务
[root@server vsftpd]# cp /etc/passwd /var/www/html/ # 添加测试数据
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701195718596-1491419490.png)
# 上述显示登陆失败
[root@server ~]# vim /etc/pam.d/vsftpd
# auth required pam_shells.so # 注释改行
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200701195958046-1877750665.png)
SSL+FTP
# 1:上述进行数据传输的时候都是基于明文传送
# 2:使用SSL+FTP可以基于密文进行网络传输
[root@server ~]# openssl req -new -x509 -nodes vsftpd.pem -keyout vsftpd.pem -days 3650 # 生成ssl证书与秘钥 保存到vsftpd.pem 设置过期时间3650
[root@server vsftpd]# mkdir .sslkey # 创建隐藏文件夹用来存放秘钥和证书
[root@server vsftpd]# mv vsftpd.pem .sslkey # 将生成的证书秘钥移动到隐藏文件夹
[root@server vsftpd]# chmod 400 .sslkey/vsftpd.pem # 修改权限
[root@server vsftpd]# vim vsftpd.conf # 修改配置文件
# 所有的配置不能添加在文件末尾 会报错
ssl_enbale=YES # 开启ssl功能
allow_anon_ssl=NO # 关闭匿名用户ssl
force_anon_data_ssl=YES # 强制传输数据以及登录使用ssl
force_anon_logins_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlvs1=YES
ssl_sslv2=YES # 设置ssl版本
ssl_sslv3=YES
require_ssl_reuse=NO # 紧张重复使用ssl会话
ssl_ciphers=HIGH # 允许用于加密 SSL 连接的 SSL 算法
# 定义ssl证书和秘钥
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
res_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem
[root@servervsftpd]# systemctl restart vsftpd # 重启客户端
OpenSSL 简单参数解释:
req #是 X.509 Certificate Signing Request ( CSR,证书签名请求)管理的一个命令。
x509 #X.509 证书数据管理。
days #定义证书的有效日期。
newkey #指定证书密钥处理器。
keyout #设置密钥存储文件。
out #设置证书存储文件,注意证书和密钥都保存在一个相同的文件
nodes # 产生的秘钥是否以明文的形式报错到文件中 加入-nodes以明文显示
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200702161604562-1437801561.png)
NFS
作用
- NFS即网络文件系统,网络问卷系统是FreeBSD支持的文件系统,也被称之为NFS
- NFS允许一个系统在一个网络内进行文件共享
- 通过NFS用户可以像访问本地文件一样访问远程文件系统
- 其基于C/S模式监听2049端口
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200702193812194-783290792.png)
RPC
- NFS通过网络进行文件传输,默认使用端口2049,但是由于文件系统及其复杂还需要有额外的程序启动额外的端口
- NFS 默认使用传输的端口是随机选择的小于 1024 的端口。将端口告知客户端是需要依赖于 RPC( remote procedure call, RPC)协议。
- 当 NFS 服务启动时,会随机选取数个端口,并向 RPC 注册,因此 RPC 就可以知道每个端口对应的NFS功能。
- RPC 最主要的功能就是指定每个 NFS 功能所对应的端口号,并告知客户端。以便客户端连接至正确的端口号。
安装启动NFS
[root@server ~]# yum install -y rpcbind nfs-utils # nfs以来rpc因此需要安装rpc
[root@server ~]# systemctl start rpcbind # 由于nfs需要想rpc进行端口注册 因此需要先开启rpc
[root@server ~]# systemctl start nfs-service.service
[root@server ~]# netstat -aunpt | grep 2049 # 查看shif 启动
[root@server ~]# systemctl enable nfs-server.service # 开机启动
配置使用
[root@client ~]# showmount -e 1.1.1.1 # 客户端查看是否正常使用
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200702201529721-998067822.png)
文件挂载
[root@server ~]# vim /etc/exports
/media *(rw) # media 共享的目录 *表示对所有网段开放读写权限
[root@server ~]# exportfs -rv # 重新读取配置文件服务不会中断
[root@client ~]# mount -t nfs 1.1.1.1:/media /mnt/ # 客户端进行文件挂载
[root@client ~]# df -h # 查看挂载目录
[root@server ~]# vim /etc/fstab
1.1.1.1:/media /mnt nfs defaults 0 0
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200702221630316-1835514061.png)
验证效果
[root@client ~]# touch /mnt/a.txt # 客户端在挂载点创建文件
touch: 无法创建"/mnt/a.txt": 权限不够 # 报错
[root@server ~]# ll -d /media/ # 服务端查看文件权限
drwxr-xr-x. 8 root root 2048 9月 12 2019 /media/
[root@server ~]# chmod 777 /media/ -R # 方法一:修改权限
[root@server ~]# chown nfsnobody:nfsnobody /media/ # 方法二:修改文件属主:属组
[root@client ~]# touch /mnt/a.txt # 客户端创建文件
[root@server ~]# cp /etc/passwd /media/ # 服务端添加测试数据
[root@client ~]# ll /mnt/ # 查看恭享目录下的文件
![](https://img2020.cnblogs.com/blog/1725357/202007/1725357-20200702223059279-1193007160.png)
NFS共享参数
NFS共享的常用参数
'''
以下是一些 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@SR ~]# cat /etc/exports
/tmp/a/no_root_squash *(rw,no_root_squash)
/tmp/a/sync 192.168.0.0/24(rw,sync)
/tmp/a/ro 192.168.1.64(ro)
/tmp/a/all_squash 192.168.0.0/24(rw,all_squash,anonuid=500,anongid=500)
/tmp/a/async 192.168.3.0/255.255.255.0(async)
/tmp/a/rw 192.168.3.0/255.255.255.0(rw) 192.168.4.0/255.255.255.0(rw)
/tmp/a/root_squash *(rw,root_squash)
'''
客户端挂载参数优化
客户端挂载参数的优化
'''
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 文件系统的传输能
力。但设置的值也不要太大,最好是实现网络能够传输的最大值为限。
'''
内核优化
内核优化
'''
root@server ~]# vim /etc/sysctl.conf #修改/etc/sysctl.conf,在文件最后添加如
下。
net.core.wmem_default = 8388608 #内核默认读缓存
net.core.rmem_default = 8388608 #内核默认写缓存
net.core.rmem_max = 16777216 #内核最大读缓存
net.core.wmem_max = 16777216 #内核最大写缓存
[root@xuegod63 ~]# sysctl -p #使用 sysctl.conf 文件内的参数生效,执行命令输出
的结果中的参数代表生效。
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
'''