Linux之FTP服务器,NFS服务器,SAMBA服务器详解


本文介绍Linux中的三个网络文件共享服务:ftp,nfs,samba

FTP服务

File Transfer Protocol 早期的三个应用级协议之一

  • 基于C/S结构 双通道协议:数据和命令连接
  • 数据传输格式:二进制(默认)和文本
  • 两种模式:(服务器角度)
    主动(PORT style):服务器主动连接
        命令(控制):客户端:随机port —> 服务器:tcp 21
        数据:客户端:随机port <—服务器:tcp 20
    被动(PASV style):客户端主动连接
        命令(控制):客户端:随机port —> 服务器:tcp 21
        数据:客户端:随机port —>服务器:随机port
    接下来我来用一个实验演示FTP:基于MySQL验证的vsftpd虚拟用户

    实验准备:

  • centos 7 作为FTP服务器
  • centos 7test 作为安装了MySQL的客户端
  1. 在ftp服务器上安装pam_mysql
    [root@centos7 ~]# tar xvf pam_mysql-0.7RC1.tar.gz 
    [root@centos7 ~]# yum -y groupinstall "Development tools"#依赖工具包
    [root@centos7 ~]# yum -y install mariadb-devel pam-devel openssl-devel#依赖
    [root@centos7 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/securit
    [root@centos7 pam_mysql-0.7RC1]#  make && make install
  2. 在ftp服务器上安装vsftpd
    [root@centos7 ~]# yum -y install vsftpd
  3. 在数据库服务器上安装数据库
    [root@centostest7 ~]# yum -y install mariadb#详情看我前面的博客,有详细介绍
  4. 在数据库服务器上创建数据库
    [root@centos7test ~]# mysql
    MariaDB [(none)]> create database ftpdb;
    MariaDB [(none)]> grant all on ftpdb.* to ftpuser@'%' identified by 'centos';
  5. 在数据库服务器上使用创建的mysql帐户登录数据库,并且创建数据表
    [root@centos7test ~]# mysql -uftpuser -h 172.18.252.106 -pcentos
    MariaDB [(none)]> use ftpdb;
    MariaDB [ftpdb]> create table ftpvusers (
        -> id int unsigned auto_increment primary key,
        -> username char(30),
        -> password char(48));
    MariaDB [ftpdb]> insert into ftpvusers (username,password) values ('lishuyang',password('centos')),('wangyapeng',password('centos'));
  6. 在FTP服务器上安装vsftpd并且配置连接MySQL的pam_mysql模块
    [root@centos7 ~]# yum -y install vsftpd
    [root@centos7 ~]# vim /etc/pam.d/vsftpd.mysql
    auth required pam_mysql.so user=ftpuser passwd=centos host=172.18.252.106 db=ftpdb table=ftpusers usercolumn=username passwdcolumn=password crypt=2
    account required pam_mysql.so user=ftpuser passwd=centos host=172.18.252.106 db=ftpdb table=ftpusers usercolumn=username passwdcolumn=password crypt=2

    配置字段说明
    • auth 表示认证
    • account 验证账号密码正常使用
    • required 表示认证要通过
    • pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
    • user=vsftpd为登录mysql的用户
    • passwd=magedu 登录mysql的的密码
    • host=mysqlserver mysql服务器的主机名或ip地址
    • db=vsftpd 指定连接msyql的数据库名称
    • table=users 指定连接数据库中的表名
    • usercolumn=name 当做用户名的字段
    • passwdcolumn=password 当做用户名字段的密码
    • crypt=2 密码的加密方式为mysql password()函数加密

  7. 修改vsftpd配置文件,使其适应mysql认证
    [root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    userlist_enable=YES
    tcp_wrappers=YES
    guest_enable=YES
    pam_service_name=vsftpd.mysql  #使其原系统用户无法登陆
    guest_username=ftpvuser
    user_config_dir=/etc/vsftpd/configdir                                    

    配置字段说明及常用的配置汇总
    • 在centos7当中ftp用户的根目录不能有w权限
    • listen_port (Default: 21) FTP命令通道的监
    • connect_from_port_20 (Default: YES) 是否允许主动传输
    • ftp_data_port (Default: 20) 主动模式使用的端口
    • pasv_min_port=9527 (Default: 0) 被动模式,服务端开启的随机端口的最小值
    • pasv_max_port=9529 (Default: 0) 被动模式,服务端开启的随机端口的最大值
    • anonymous_enable=YES (Default: YES) 是否开启匿名用户
    • local_enable=NO (Default: NO) 是否开启Linux本地用户登录
    • local_root=(Default: (none)) 非匿名用户登录时所在的目录,默认是各自的家目录
    • write_enable=NO (Default: NO) 是否允许Linux本地用户上传文件
    • local_umask=022 (Default: 077) 本地用户上传文件的默认权限
    • anon_upload_enable=YES (Default: NO) 是否允许匿名用户上传,如启动,还需让ftp用户对/var/ftp/pub及其他需要上传的目录设置wx权限
    • anon_mkdir_write_enable=YES (Default: NO) 是否允许匿名用户创建目录,如启动,还需让ftp用户对/var/ftp/pub及其他需要上传的目录设置wx权限
    • no_anon_password=YES (Default: NO) 使用ftp客户端登录匿名时,是否密码,如为NO,即默认,则需要输入任意密码,如为YES,直接登录,不用输入。
    • anon_world_readable_only (Default: YES) 匿名用户下载文件时,文件一定要other上也有r权限。
    • anon_other_write_enable=YES (Default: NO) 匿名用户是否可以删除及重命名
    • anon_umask (Default: 077) 匿名用户上传时的默认权限。
    • chown_uploads=YES (Default: NO) 匿名用户上传文件的所属人是否要更改。如YES,则更改为chown_username所指定的
    • chown_username (Default: root)
    • chown_upload_mode=0755 (Default: 0600)在chown_uploads生效的前提下,设置匿名用户的上传权限,一旦设置anon_umask失效。且权限一定要权限4位
    • guest_enuable (Defalt: NO) 所有的非匿名用户都映射为了guest用户
    • guest_username (Default: ftp) guest用户是谁,默认ftp
    • chroot_local_user=YES 将linux系统用户的根目录设置为家目录,注意在Centos7中该目录对用户不能有w权限,当为YES时,所有人都不能越狱,当为NO时,所有人都能越狱。
    • chroot_list_enable=YES 越狱例外,下一行一定要有。当上一行为YES是,为白名单,当为NO时,为黑名单
    • chroot_list_file=/etc/vsftpd/chroot_list
    • xferlog_enable=YES (Default: no) 是否开启上传、下载日志
    • xferlog_std_format (Default: no) 是否使用wuftp格式
    • xferlog_file (Default: /var/log/xferlog) xferlog的存放路径
    • dual_log_enable (Default: NO) 是否同时开启vsftpd格式的日志,该格式记录信息更多,不只upload/downloads
    • vsftpd_log_file (Default: /var/log/vsftpd.log) vsftpd格式日志的存放路径
    • ftpd_banner (Default: none) 登录时的欢迎信息。不是所有客户端都可见
    • banner_file Default: (none) 登录时的欢迎信息。不是所有客户端都可见,当该行存在时,则优先于ftpd_banner
    • dirmessage_enable (Default: NO) 每进入一个目录时,如果该目录下有.message文件,则将其内容展现出来,不是所有客户端都可见
    • message_file (Default: .message)
    • userlist_enable=YES (Default: NO) 是否启用用户过滤功能。如YES,则开启,过滤文件由userlist_file决定
    • userlist_file (Default: /etc/vsftpd/user_list) 过滤文件路径
    • userlist_deny (Default: YES) 当该值为YES时userlist为黑名单,反之为白名单
    /etc/vsftpd/ftpuser 固定是黑名单,写入其中的用户一定不能登录ftp
    • max_clients (Default: 2000) 允许同时登录的客户端请求数
    • nopriv_user (Default: nobody) 客户端建立命令通道时,服务端与之连接的进程的所属用户
    • anon_max_rate (Default: 0) 匿名用户上传和下载的最大速度,单位字节。
    • local_max_rate (Default: 0) Linux本地用户上传和下载的最大速度,单位字节。
    • connect_timeout (Default: 60) 主动模式数据连接超时时长
    • accept_timeout (Default: 60) 被动模式数据连接超时时长
    • data_connection_timeout (Default: 300) 数据连接无数据传输时的超时时长
    • idle_session_timeout (Default: 300) 无命令操作超时时长
    • ascii_upload_enable=NO ASCII模式上传
    • ascii_download_enable=NO ASCII模式下载

  8. 重启服务并且测试

    [root@centos7 ~]# systemctl restart vsftpd
    [root@centos7test ~]# systemctl restart mariadb.service 
    [root@centos7 ~]# lftp 172.18.252.106
    lftp 172.18.252.106:~> user wangyapeng
    Password: 
    lftp wangyapeng@172.18.252.106:~> #成功登陆到ftp服务器

    这样我们利用MySQL的用户成功登陆到FTP服务器上

    NFS服务

     NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器,这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样,使用上面相当的便利。

    NFS工具

    ###rpcinfo
    [root@centos7 ~]# rpcinfo -p 172.18.252.106   # 查看RPC注册程序 
    [root@centos7 ~]# rpcinfo -s 172.18.252.106
    ###exportfs
    [root@centos7 ~]# exportfs -v  #查看本机所有NFS共享 
    [root@centos7 ~]# exportfs -r   #重读配置文件,并共享目录 
    [root@centos7 ~]# exportfs -a  #输出本机所有共享 
    [root@centos7 ~]# exportfs -au #停止本机所有共享 
    ###展示远程的共享的目录
    [root@centos7 ~]# showmount -e 172.18.252.106

    实验演示nfs自动挂载

    我们有时候需要使用远程的共享目录,我们可以手动挂载远程目录,那么需要好多台主机上的目录的话我们是不是也需要一个一个手动挂载?不知道大家有没有注意到我们光盘目录,当我们用的时候它会自动挂载,不用的他不挂载,现在我来以一个实验模拟自动挂载目录

    1. 安装nfs

      [root@centos7 ~]# yum -y install nfs-utils
      [root@centos7 ~]# vim /etc/exports.d/mage.exports #编辑配置文件
      /app/homedir *(rw,sync) # 要共享的目录
      [root@centos7 ~]# exportfs -r  #重新读取文件
      [root@centos7 ~]# systemctl restart nfs  #重新启动服务

      配置文件说明
      • 默认选项:(ro,sync,root_squash,no_all_squash)
      • ro,rw 只读和读写
      • async 异步,数据变化后不立即写磁盘,性能高
      • sync(1.0.0后为默认)同步,数据在请求时立即写入共享 • no_all_squash (默认)保留共享文件的UID和GID
      • all_squash 所有远程用户(包括root)都变成nfsnobody
      • root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本 是4294967294 (nfsnobody)
      • no_root_squash 远程root映射成root用户
      • anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非 nfsnobody,可配合all_squash使用

    2. 安装autofs
      [root@centos7 ~]# yum -y install autofs
    3. 配置主配置文件
      [root@centos7 ~]# vim /etc/auto.master
      /app/homedir    /etc/auto.mage   #挂载目录的目录名
      [root@centos7test ~]# vim /etc/auto.mage 
      * -fstype=nfs   172.18.252.106:/app/homedir/& #基名与远程目录匹配,后向引用
    4. 重启autofs服务
      [root@centos7 ~]# service autofs restart
    5. 测试,客户端和服务器创建一个用户mage
      
      [root@centos7 ~]# su - mage
      [mage@centos7 ~]#ls -a
      .  ..  .bash_logout  .bash_profile  .bashrc  .mozilla
      [mage@centos7 ~]$ df
      172.18.252.106:/app/homedir
                    186532       8    186524   1% /app/homedir
    至此用户家目录切换成功,且自动挂载,一段时间后会自动取消挂载
    ## samba服务
    SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文 件共享协议 
    SAMBA的功能: 
    • 共享文件和打印,实现在线编辑 
    • 实现登录SAMBA用户的身份认证 
    • 可以进行NetBIOS名称解析 
    • 外围设备共享 
    ### 实验演示samba多用户挂载(仅支持centos7)
    1. 在服务器上创建用户

    [root@centos7 ~]# useradd -s /sbin/nologin xiaofan
    [root@centos7 ~]# useradd -s /sbin/nologin xiaochen

    2. 设置登陆samba服务的密码

    [root@centos7 ~]# smbpasswd -a xiaofan #设置登陆密码
    [root@centos7 ~]# smbpasswd -a xiaochen

    3. 创建共享目录 

    [root@centos7 ~]# mkdir /app/smbshared
    [root@centos7 ~]# chcon -t samba_share_t /app/smbshared #不用关闭selinux直接给目录设置期望值
    [root@centos7 ~]# setfacl -m u:xiaofan:rwx /app/smbshared #给用户设置读写权限
    [root@centos7 ~]# setfacl -m u:xiaochen /app/smbshared

    4. 配置共享目录

    [root@centos7 ~]# vim /etc/samba/smb.conf
    [gongxiang]
    comment = Gongxiang
    path = /app/smbshare #设置的访问目录
    browseable = yes #可以浏览
    writeable = no #可写
    write list = xiaofan,xiaochen #可以写的用户
    public = yes #是否可见
    allow list = 172.18. 192.168. #表示可以访问的网段

    5. 重新启动服务

    [root@centos7 ~]# systemctl restart smb

    6. 客户端安装工具

    [root@centos7 ~]# yum -y install cifs-utils

    7. 配置自动挂载目录

    [root@centos7 ~]# vim /etc/fstab
    //172.18.254.96/gongxiang /mnt/ cifs credentials=/etc/multiuser,multiuser,sec=ntlmssp 0 0

    8. 配置登陆用户

    [root@centos7 ~]# vim /etc/multiuser
    username=xuxian
    password=centos

    9. 挂载

    [root@centos7 ~]# mount -a
    [root@centos7 ~]# df
    172.18.252.106:/gongxiang
    3667968 33024 3634944 1% /mnt/#
    [root@centos7 ~]# smbclient -L //172.18.252.106 -U xuxian

  9. 以低权限xuxian的身份获取服务器上的高权限的xiaofan.xianchen 的权限
    [root@centos7 ~]# useradd xiaofan
    [root@centos7 ~]# useradd xiaochen
    [root@centos7 ~]# su - xiaofan #切换用户
    [root@centos7 ~]# cifscreds add 172.18.252.106#随便输入服务端xiaofan.xiaochen的samba密码

    至此完成samba多用户挂载

使用NFS,NIS,AUTOFS实现用户帐号及家目录的漫游

本实验的场景:生活中一台服务器提供账号和目录共享,然后其他主机可以实现这台服务器的账号共享及目录的漫游,使用对方目录的时候自动挂载,不使用的时候自动取消挂载

  1. 服务端安装软件包
    [root@localhost ~]# yum -y install ypserv ypbind yp-tools
  2. 配置NIS域,并且使之生效
    [root@localhost ~]# vim /etc/sysconfig/network
    # Created by anacondoa
    NISDOMAIN=cyn
    [root@localhost ~]# nisdomainname cyn
  3. 编写NIS主配置文件
    [root@centos7(nanyibo) ~]# vim /etc/ypserv.conf#最后添加内容
    127.0.0.1:*:*:none
    172.18.254.0/255.255.255.0:*:*:none #允许这个网段内的主机连接
    *:*:*:deny #其他网段拒绝
  4. 启动NIS服务,并且设置为开机启动
    [root@localhost ~]# systemctl restart ypserv
    [root@localhost ~]# systemctl enable ypserv
  5. 创建几个用户并指定家目录
    [root@localhost ~]# mkdir /app/homedir#用户的家目录在这个目录下
    [root@localhost ~]# for n in {1..5};do useradd -d /app/homedir/nisuser$n nisuser$n;echo centos |passwd --stdin nisuser$n;done
  6. nis生成数据库
    [root@centos7test app]# /usr/lib64/yp/ypinit -m
    #先按CTRL+D,然后按Y。即可生成
  7. 配置NFS
    [root@centos7test ~]# yum -y install nfs-utils
    [root@localhost ~]# vim /etc/exports.d/cynports
    /app/homedir *(rw,sync)
    [root@localhost ~]# systemctl restart nfs
  8. 配置autofs
    [root@localhost ~]# yum -y install autofs
    [root@localhost ~]# vim /etc/auto.master
    /app/homedir    /etc/auto.cyn  timeout=10
    [root@localhost ~]# vim /etc/auto.cyn
    *      -fstype=nfs             172.18.254.234:/app/homedir/&
  9. 重新启动autofs
    [root@localhost ~]# service autofs restart
  10. 客户端配置

    [root@centos6 ~]# yum install -y ypbind
    [root@centos6 ~]# setup

    这个时候会出现图形化界面,选择use nis ,空格确定,选择next,
    Linux之FTP服务器,NFS服务器,SAMBA服务器详解
    填入你自己设置的域名和服务器IP

  11. 检查账号是否共享成功
    [root@localhost ~]# getent passwd
  12. 测试autofs
    [root@localhost ~]# su - nisuser2
    [nisuser2@localhost ~]$ ls -a
    .  ..  .bash_logout  .bash_profile  .bashrc  .mozilla
    [nisuser2@localhost ~]$ df
    172.18.254.136:/app/homedir/nisuser2
                      52403200 4518272  47884928   5% /app/homedir/nisuser2

    发现切换用户以后成功挂载,实验完成,完成了服务器的账号共享和家目录的漫游,而且对于要需要的目录实现自动挂载。