FTP服务

ftp协议:文件传输协议(file transfer protocol)

协议定义了一个在远程计算机与本地计算机之间传输文件的一个标准
ftp运行在OSI模型的应用,并利用传输协议TCP在不同的主机之间提供可靠的数据传输
ftp在文件传输中支持断点续传功能,可以大幅减少cpu网络开宽的开销

ftp模型

用户接口:提供给用户一个接口并使用客户端协议解释器的服务
客户端解释器:向服务端发送命令,并建立客户端数据传输过程
服务端解释器:接受用户命令并驱动服务端数据传输过程
客户端传输协议:负责完成和服务端数据传输以及客户端本地文件系统的通信
服务端传输协议:负责完成和客户端数据传输以及服务端本地文件系统的通信

连接方式:不同的连接方式需要适合不同的服务质量

控制连接(需要更小的延迟时间)
数据连接(需要更大的数据吞吐量)

控制连接

主要是用来传送在实际通信过程中需要执行的FTP命令及命令的响应
只需要很少的网络带宽
ftp服务端监听21端口来等待控制连接的建立
建立控制连接之后,还需要验证客户端身份,决定是否建立数据连接
当需要目录列表传输文件时,才去建立数据连接, 客户端每次都是用不同的端口号来建立数据连接,数据连接传输数据结束后断开此连接
在ftp连接的期间,控制连接始终保持连接状态,在数据存在期间,控制连接必须存在,一旦控制连接断开,数据连接也会自动关闭

数据连接

ftp服务端监听20端口来等待数据连接
数据连接依赖于控制连接
总结:
控制连接主要作用:用来传输ftp客户端命令和服务端命令响应(服务端监听在21端口)
数据连接主要作用:用来真正传输ftp客户端和服务端之间的数据(20端口);数据连接是依赖控制连接

数据连接的2种方式:

主动模式
被动模式

主动模式的过程

1.通过三次握手,建立控制连接:客户端的源端口号高位随机端口,目标端口是21
2.控制连接建立完成之后(客户端身份验证),协商数据连接采用主动模式,随后客户端向ftp服务端发送port报文,表明自己监听的IP+PORT,等待ftp服务端(20端口)向自己监听的IP+PORT发送数据连接请求
3.服务端发起数据连接的请求,建立数据连接

被动模式的过程

1.通过三次握手,建立控制连接:客户端的源端口号高位随机端口,目标端口是21
2.控制连接建立完成之后(客户端身份验证),协商数据连接采用被动模式(客户端发送pasv报文)
3.服务端接收到pasv报文,于是向客户端发送port报文,表明自己监听的IP+PORT
4.客户端发起连接的请求,建立数据连接
总结:主动和被动模式主要看服务端
服务端主动发起数据连接请求:主动模式
服务端被动发起数据连接请求:被动模式

身份验证:FTP服务的使用者有三类

本地用户

既可以登录本地shell,又可以登录ftp
本地用户可以通过输入自己的账号的口令来进行授权登录
当授权访问的本地用户登录系统之后,其登录为用户自己的家目录
本地用户既可以下载也可以上传

虚拟用户

该用户只能在远程ftp服务器上拥有账户,且此账号只能够用于文件传输服务
虚拟用户可以通过输入自己的账户和口令进行授权登录
当授权访问的时虚拟用户登陆系统后,其登录目录为服务器指定的目录
通常情况下,虚拟用户既可以下载也可以上传

匿名用户

该用户在远程ftp服务器没有拥有用户,此用户称之为“匿名用户”
若ftp服务器提供匿名用户访问功能,输入自己的账户(anonymous)和口令(用户的Email或者不输入)来进行登录
当匿名用户登录系统后,其登录目录为匿名ftp服务器的根目录/var/ftp/pub目录
一般情况下匿名ftp服务器只提供下载功能,不提供上传功能

VSFTP服务部署

vsftp服务简介

  1. 是一个安全,高速,稳定的FTP服务器
    2. 可设定多个基于IP的虚拟FTP服务器
    3. 匿名ftp服务器部署十分容器
    4. 执行任何外部程序,能够减少安全隐患
    5. 支持虚拟用户、且支持每个虚拟用户具有独立的配置
    6. 可以设定从xinted启动,或者是独立fpt服务器两种运行方式
    7. 支持带宽限制等

    vsftp服务概述:

    安装vsftp服务:

    yum install vsftpd -y


    [root@node1 ~]# rpm -ql vsftpd-3.0.2-25.el7.x86_64
    服务包:vsftpd-3.0.2-25.el7.x86_64
    服务类型:由Systemd启动的守护进程(/usr/lib/systemd/system/)
    配置单元:/usr/lib/systemd/system/vsftpd.service
    守护进程:/usr/sbin/vsftpd
    端口: 21(controller) 20(data)
    主配置文件:/etc/vsftpd/vsftpd.conf
    用户访问控制配置文件:
    /etc/vsftpd/ftpusers
    /etc/vsftpd/user_list
    日志文件:/etc/logrotate.d/vsftpd

    主配置文件:[root@node1 ~]# cat /etc/vsftpd/vsftpd.conf | grep -Ev “^$|^#”

    anonymous_enable=YES # 是否允许匿名用户进行登录
    local_enable=YES # 是否允许本地用户进行登录
    write_enable=YES # 是否对登录用户拥有可写权限
    local_umask=022 # 本地用户上传文件默认权限修改
    dirmessage_enable=YES # 是否激活目录欢迎功能
    xferlog_enable=YES # 是否让系统自动维护上传和下载功能
    connect_from_port_20=YES # 是否设定ftp服务器将启用ftp数据端口的连接请求
    xferlog_std_format=YES # 是否以标准的xferlog的格式书写传输日志文件
    listen=NO # 是否运行监听,以独立模式运行
    listen_ipv6=YES # 是否监听ipv6地址
    pam_service_name=vsftpd # 设置PAM模式提供的认证服务所使用的配置文件名
    userlist_enable=YES # 是否允许ftpuser文件中的用户登录ftp服务器
    tcp_wrappers=YES # 是否使用tcp_wrappers作为主机访问控制方式
    注意:关闭防火墙或者使防火墙放行VSFTPD服务
    [root@rac1 etc]# vsftpd /etc/vsftpd/vsftpd.conf &

    示例1: 使用匿名用户进行登录

  2. 修改配置文件
    添加如下配置参数:
    anonymous_enable=YES
    anon_umask=022
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES

    2. 修改/var/ftp/pub权限
    chown -Rf ftp /var/ftp/pub/
    3. 使用anonymous用户登录测试
    [root@node1 ~]# ftp 192.168.10.10
    Connected to 192.168.10.10 (192.168.10.10).
    220 (vsFTPd 3.0.2)
    Name (192.168.10.10:root): anonymous
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls
    ftp> pwd —-> /var/ftp/ == “/“ 根目录
    ftp> cd pub
    ftp> mkdir test
    ftp> mget 下载文件
    ftp> quit 退出

    示例2:本地用户登录

  3. 检查配置文件
    local_enable=YES # 是否允许本地用户进行登录
    userlist_enable=YES # 是否允许ftpuser文件中的用户登录ftp服务器
    pam_service_name=vsftpd # 设置PAM模式提供的认证服务所使用的配置文件名
    2. 检查/etc/pam.d/vsftpd文件:
    # 本地用户PAM模式的身份验证配置
    auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    3. 检查user_list文件和ftpuser文件
    [root@node1 ~]# cat /etc/vsftpd/user_list
    # If userlist_deny=NO, only allow users in this file
    # If userlist_deny=YES (default), never allow users in this file, and
    # do not even prompt for a password.
    # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
    # for users that are denied.

    /etc/vsftpd/user_list :
    # If userlist_deny=NO, only allow users in this file
    # If userlist_deny=YES (default), never allow users in this file, and
    注释需要登录的用户

    /etc/vsftpd/ftpusers
    # Users that are not allowed to login via ftp
    注释需要登录的用户

    下载命令: get [remote-path-file] [local-path-file]
    上传命令: put [local-path-file] [remote-path-file]

    示例3:虚拟用户进行登录

  4. 创建用户ftp认证的用户数据库文件
    mkdir /etc/vsftpd/vconf
    cd /etc/vsftpd/vconf/
    xiaoming
    xiaoming
    xiaohong
    xiaohong

    1.1 将明文信息转换成数据库文件
    [root@node1 vconf]# db_load -T -t hash -f /etc/vsftpd/vconf/vftpuser.txt /etc/vsftpd/vconf/vftpuser.db

    2. 创建vsftpd服务程序用户存储文件的根目录以及虚拟用户映射的系统本地用户
    useradd -d /var/ftproot/ -s /sbin/nologin vuser
    chmod -Rf 755 /var/ftproot/

    3. 建立用户支持虚拟用户的PAM文件
    注意:将源文件备份,修改源文件为如下内容
    auth required pam_userdb.so db=/etc/vsftpd/vconf/vftpuser
    account required pam_userdb.so db=/etc/vsftpd/vconf/vftpuser

    4. 修改配置文件:
    添加如下参数(把匿名用户相关配注释掉):
    # basic
    guest_enable=YES
    guest_username=vuser
    allow_writeable_chroot=YES
    user_config_dir=/etc/vsftpd/vconf/

    5. 为不同的虚拟用户设置不同的权限
    [root@node1 ~]# cat /etc/vsftpd/vconf/xiaohong
    local_root=/var/ftproot/
    write_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES

    6. 分别使用xiaohong和xiaoming用户进行登录测试(上传文件功能)
    ftp 192.168.10.10 xiaoming
    ftp> put /root/1.txt xiaoming.txt
    local: /root/1.txt remote: xiaoming2.txt
    227 Entering Passive Mode (192,168,10,10,33,61).
    550 Permission denied.
    ftp 192.168.10.10 xiaohong
    ftp> put /root/1.txt ./xiaohong.txt
    local: /root/1.txt remote: ./xiaohong.txt
    227 Entering Passive Mode (192,168,10,10,162,10).
    150 Ok to send data.
    226 Transfer complete.

    ps:虚拟用户登录失败查看后台是否有多个vsftp进程

    samba服务:目前称为Linux系统与Windows系统之间共享文件的最佳选择

    协议

    1.服务信息模块协议是一个高层协议,提供了在网络上的不同计算机之间共享文件
    2.使用netBIOS api实现面向连接的协议,该协议为window客户端程序和服务提供了一个通过虚拟链路按照请求—按照响应方式进行通信的机制
    3.工作原理:让NetBIOS于SMB协议运行在TCP/IP协议上,使用NetBIOS的名字解析器让Linux机器可以在window的网络邻居中被发现

CIFS协议
1. 通用网际文件系统是微软服务器消息块协议的增强版
2. 提供计算机用户在企业内部网络上共享文件的标准方法
3. CIFS协议运行在TCP/IP协议上,利用英特网上的DNS服务增强其扩展性
CIFS协议特点
1. 文件访问的完整性
2. 为文件或目录的访问提供安全性
3. 使用统一编码(unicode)文件名
4. 使用全局文件名
5. 为慢连接优化
samba简介
1. 一组软件包,让Linux系统支持SMB/CIFS协议
2. Samba可以运行在任何Unix操作系统之上
3. Samba基于GPL发行,更新速度很快
samba功能
1.让Linux主机成为window网络中的一份子,于window系统互相分享资源
2.让Linux主机使用window系统的共享的文件和打印机
3.为Linux/window客户端提供文件共享服务和远程打印服务
4.让Linux主机担任win名字服务器,提供NetBIOS名字解析服务器
5.提供用户身份验证功能
6.支持SSL安全套接层协议
samba提供的服务
1.文件和打印机共享
2.用户验证和授权
3.名字解析
4.浏览(服务通告)
samba的守护进程
1.smbd:实现共享和验证授权服务
2.nmbd:实现名字解析和浏览服务
samba的RPM包
1. samba-common: 包括Smab服务器和客户机所需要的文件
2. samba: Samba服务端软件
3. samba-winbind: 可选服务
4. smaba-client: samba客户端软件
5. samba-swat: samba的web配置工具
总结:samba服务让我们的Linux机器能够和window共享资源(利用SMB协议或者CIFS协议)

samba服务

安装:
yum install samba -y
服务包: samba
服务类型:由Systemd启动的守护进程
配置单元:/usr/lib/system/{smb,nmb}.service
守护进程:/usr/sbin/nmbd | /usr/sbin/smbd
监听端口:
NetBIOS udp:137 udp:138 tcp:139
SMB: tcp:445
配置文件:/etc/samba/*
相关软件包:samba-swat samba-client testparm cifs-utils

samba相关工具

服务端:
/usr/bin/smbstatus #用户查找网络中的Samba服务器
/usr/bin/smbpasswd #用于设置Samba用户账号及口令
/usr/bin/testparm #用于检查配置文件的正确性
客户端:
/usr/bin/findsmb #用于查找网络中的Samba服务器
/usr/bin/smbclient #Linux下的Samba客户端软件
/usr/bin/smbget #基于SMB/CIFS的类似于wget的下载工具
/usr/bin/smbtar #类似于tar的归档工具,用于将SMB/CIFS的共享包备份到Linux主机上

samba的相关配置

/etc/sysconfig/smaba # 用于设置守护进程的启动参数
/etc/samba/smb.conf # 主配置文件
/etc/samba/smbusers # 用户映射Linux用户和window用户
/etc/samba/lmhosts # 用于设置NetBIOS名字与IP地址的对应关系表
/etc/pam.d/samba # Samba服务的PAM配置文件
/etc/rc.d/init.d/sm # Samba的INIT启动脚本

samba安全等级

user:有本地samba服务器负责账户验证(默认安全等级)
doamin:账户验证由window或者samba域验证有关
ads:账户验证由Kerberos验证的window活动目录服务器负责

samba账户及口令数据库

  1. 1. Samba使用的账户文件/数据库是与系统账户文件分割开来的<br /> 2. 当设置了user安全等级后,将由本地系统对Samba共享资源的用户进行认证<br /> 3. 用.tdb格式的口令数据库,初始情况下口令数据库文件并不存在<br /> 4. 为了创建smaba的口令数据库文件,管理员可以在添加samba账户的同时创它<br /> 5. 管理员可以使用smbpasswd命令配置Samba账户并设置口令

samba主配置文件

[root@node1 vsftpd]# cat /etc/samba/smb.conf | grep -Ev “^$|^#”
[global] # 全局参数
workgroup = SAMBA # 工作组名称
security = user # 安全等级
安全等级:user、share、ads、domain
passdb backend = tdbsam # 口数据库文件为tdb格式
后端口令数据库:ldapsam(基于LDAP服务进行账户验证)
[homes] # 共享参数
comment = Home Directories # 描述信息
valid users = %S, %D%w%S # 可用用户
browseable = No # 指定共享信息是否在“网络邻居”可见
read only = No # 是否只读
———————————————————— 以下是关于Samba共享打印机服务相关配置 ————————————————————————————————
[printers]
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775

文件系统权限和Samba共享权限
Samba服务器要将本地系统共享给Samba用户,涉及本地系统和Samba系统两种权限
本地系统权限:
chmod 和 chown命令配置
setfacl命令配置acl权限
Samba权限
在主配置文件中使用Samba的访问控制参数设置

文件系统权限和samba共享

samba服务器要将本地系统共享给samba用户,涉及本地系统和samba系统两种权限
本地系统权限:
chmod和chown命令配置
setfacl命令配置acl权限
samba权限
在主配置文件中使用samba的访问控制参数设置

samba服务的部署实验

  1. 创建用户访问共享资源的账户信息
    useradd xiaohu
    pdbedit -a -u # 创建samba用户

    pdbedit命令参数:
    -a: 建立smaba账户
    -x:删除samba账户
    -u:指定samba账户
    -L:列出用户列表
    -v:显示详细信息

    2. 创建用于共享资源的文件目录
    mkdir /var/database #创建共享资源的文件目录
    chown -Rf xiaohu:xiaohu /var/database # 修改文件目录的属主和属组为samba账户:xiaohu

    3. 修改主配置文件:
    添加以下参数:
    [database] # 配置标识
    comment = “this is my directory” # 描述信息
    path = /var/database # 定义路径
    public = no # 是否公开
    writeable = yes # 是否可写
    testparm —show-all-parments # 检查主配置文件的正确性
    4. 启动服务并检查:
    systemctl restart smb
    5. 测试
    Window挂载共享
    win+r : 输入: \192.168.10.10
    用户名:xiaohu
    密码:xiaohu


    Linux挂载共享:
    通过smaba提供了一个类似于ftp客户端程序smbclient
    使用方法:
    # 客户端工具登录到Samba服务所对应的共享文件资源中
    smbclient //NetBIOS名或者IP地址/共享名 -U samba用户名

    挂载:
    yum install cifs-utils -y # 安装cifs协议支持的软件包
    cat auth.smb # samba账户登录认证信息
    username=xiaohu
    password=xiaohu
    domain=MYGROUP
    mkdir /root/data # 挂载点;将samba服务器上的共享文件夹挂载到本地进行使用
    tail /etc/fstab # /etc/fstab开启自动挂载的配置文件
    //192.168.10.10/database /root/data cifs credentials=/root/auth.smb 0 0
    mount -a # 挂载所有配置
    验证:
    cd /root/data #共享的文件资源是否存在

    NFS服务基础知识

    NFS简介(network filesystem)

    1.网络文件系统,从用C/S工作模式
    2.分布式计算机系统的一个组成部分,可以实现不同网络上共享和装配远程文件系统
    3.提供了一种类Linux系统上文件共享的方法
    4.结合远程网络启动实现
    无盘工作站(所有数据均在服务器的磁盘上)
    瘦客户机工作站(本地启动系统,本地磁盘存储了常用的系统工具,而所有用户数据相关的被存放在NFS服务器上并在网络中处处可见)

    NFS协议模型

    VFS:虚拟文件系统,将数据以VFS重新组织交给NFS协议处理
    RPC:远程过程调用(网络中不同机器上的服务间通信)

    NFS协议:

    1.NFS协议本身没有网络传输功能,而是基于RPC协议实现的
    2.提供了一个面向过程的远程服务的调用接口
    3.可以通过网络从远程主机程序上

    RPC协议模型

    NFS和RPC协议协同工作

    1.NFS服务端向postmapper注册服务监听端口(2049)
    2.NFS客户端向postmapper(111端口号上)询问nfsd服务监听端口号为多少
    3.portmapper告知NFS客户端nfsd服务监听在2049端口上
    4.NFS客户端直接请求2049端口
    5.NFS服务端直接响应用户请求
    NFS服务端:会在Portmapper上注册的服务有两个
    1.nfsd服务(2049)
    2.mountd服务(20048)—>客户端想要挂在服务端nfs文件夹的时候
    portmapper服务(rpcbind监听在111端口)

    NFS相关的RPM包

    nfs-utils:NFS的主要组件,包含有rpc.nfsd及rpc.mountd这两个核心守护进程
    rpcbind:提供RPC的端口映射的守护进程

    与NFS相关的工具

    NFS服务实验部署

    安装yum install rpcbind nfs-utils -y
    软件包: nfs-utils
    服务类型:由Systemd启动的守护进程
    配置单元:/usr/lib/systemd/system/nfs.service
    守护进程: rpc.nfsd rpc.mountd
    端口: nfsd(2049) 其他端口是由rpcbind(111)进行分配
    相关配置:/etc/exports
    相关软件包: rpcbind(必须要有)

NFS服务端配置:
主配置文件:/etc/exports
共享文件 [主机表1(参数项)] [主机表2(参数项)]….
参数项:控制共享目录的访问权限,用户映射等
用于配置NFS服务程序文件的参数
ro 只读
rw 读写
root_squash 当nfs客户端以root用户访问时,映射为nfs服务器的匿名用户
no_root_squash 当nfs客户端以root用户访问时,映射为nfs服务器的root管理员
all_squash 当nfs客户端以任何用户访问时,都映射为nfs服务器的匿名用户
sync 同时将数据写入到内存和硬盘中,保证数据不丢失
async 优先将数据保存在内存中,然后再写入硬盘,这样效率更高,但可能会丢失数据
exportfs命令:用于去维护NFS共享的目录列表
当修改了/etc/exports文件之后,不需要重启nfs服务,就可以使用exportfs命令使改动立即生效
exportfs命令格式:
-a : 全部挂载或者全部卸载/etc/exports文件中的设置
-r : 重新挂载
-u : 卸载共享目录
-v : 在显示输出列表式,显示设定参数

NFS客户端
showmout命令:
参数项:
-e: 显示NFS服务器的共享列表
-a: 显示本地挂载的文件资源情况以及NFS资源的情况
-v: 显示版本号
-d: 查看哪些共享目录已经被客户端挂载
NFS文件系统挂载和卸载:
挂载:
mount -t nfs 服务器地址:/共享目录 /本地挂载点
卸载:
umount /本地挂载点
开机自动挂载: /etc/fstab
x.x.x.x:/nfsfile /nfsfile nfs default 0 0
NFS部署实验
注意防火墙和SELINUX关闭!
服务端配置:
[root@node1 ~]# yum install nfs-utils rpcbind -y
[root@node1 ~]# mkdir /nfsfile # 创建nfs共享文件夹
[root@node1 ~]# chmod -Rf 777 /nfsfile/
[root@node1 ~]# cat /etc/exports
/nfsfile 192.168.10.0/24(rw,sync,no_root_squash)
[root@node1 ~]# systemctl restart rpcbind
[root@node1 ~]# systemctl restart nfs-server
[root@node1 ~]# exportfs -r
客户端配置:
[root@node1 ~]# yum install nfs-utils rpcbind -y
[root@node1 ~]# mkdir /mnt/nfsfile # 创建挂载点
[root@node1 ~]# systemctl restart rpcbind
[root@node1 ~]# systemctl restart nfs-server
[root@node2 nfsfile]# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/root/nfsfile 192.168.10.0/24
[root@node1 ~]# mount -t nfs 192.168.10.10:/nfsfile /mnt/nfsfile
[root@node2 nfsfile]# ls
1.txt 2.txt 3.txt 4.txt 5.txt