Linux之文件传输服务

FTP简要概述

概念

  • FTP是在互联网上提供文件存储和服务访问的计算机服务
  • 其可以在互联网上进行文件传输下载

VSFTP

  • VSFTP是一个基于GPL类unix系统上使用的FTP服务
  • 其是一个安全高速稳定的FTP服务器

FTP监听端口

  • 端口20:用来传输数据
  • 端口21:用来传输信道指令

FTP模式

主动模式

  • FTP的客户端主动向服务端的21号端口发起请求,客户端随机开启一个端口(1024以上)发送port命令到服务端,告知服务端采用主动模式并且开放端口
  • 当FTP服务端收到客户端的请求时候进行校验(用户名+密码之类的)校验通过则控制通道建立成功
  • 服务度通过20号端口向客户端的空闲端口发起请求进行数据传输

被动模式

  • FTP客户端主动向FTP服务端21号端口发起请求连接
  • 客户端通过pasv发送用户名+密码到服务端
  • 服务端收到客户端发送来的用户信息进行校验 校验通过随机开启一个端口(大于1024)告知客户端
  • 客户端向服务端开放端口进行数据传输

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             # 客户端进行连接到服务器

配置文件修改

匿名用户访问

[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 # 重启配置文件

[root@server vsftpd]# ll -d /var/ftp/pub/   # 查看共享文件目录的属主/属组

[root@server vsftpd]# chown ftp:ftp /var/ftp/pub/ -R   # 修改共享目录的属组/属组

[root@server vsftpd]# vim vsftpd.conf
anon_other_write_enable=YES      # 匿名用户拥有写的权限

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

# 上述匿名用户可以随意删除文件权限过大
# 默认匿名用户家目录的权限是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  # 重启服务

用户名+密码


'''
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/  # 添加测试数据

# 上述显示登陆失败

[root@server ~]# vim /etc/pam.d/vsftpd

# auth       required   pam_shells.so   # 注释改行

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以明文显示

NFS

作用

  • NFS即网络文件系统,网络问卷系统是FreeBSD支持的文件系统,也被称之为NFS
  • NFS允许一个系统在一个网络内进行文件共享
  • 通过NFS用户可以像访问本地文件一样访问远程文件系统
  • 其基于C/S模式监听2049端口

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  # 客户端查看是否正常使用

文件挂载

[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

验证效果

[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/     # 查看恭享目录下的文件

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
'''
原文地址:https://www.cnblogs.com/SR-Program/p/13217815.html