12月10日任务

14.4 exportfs命令

14.5 NFS客户端问题

15.1 FTP介绍

15.2/15.3 使用vsftpd搭建ftp

exportfs命令

在nfs运行后的一段时间内,如果需要添加共享目录,这时需要修改exports文件,并重启服务使之生效。然而此时可能有客户端已经挂载了共享目录,并且正在执行读写操作。这时我们就不能直接关闭服务器上的nfs服务,这样极易导致客户端上的读写nfs共享目录内文件的进程挂起,导致进程状态不正常,既无法删除也无法重启,严重时将导致客户端宕机。直接重启nfs服务的前提是将挂载了共享目录的客户机卸载目录,在客户端很多的情况下,这种方法就变得十分繁琐。

nfs-utils包内自带了一个exportfs命令,可以在不关闭nfs服务的情况下生效修改后的exports文件。

常用参数

  • -a 全部挂载或卸载
  • -r 重新挂载
  • -u 卸载某一个目录
  • -v 显示共享目录

例如在服务器进行如下修改

[root@server ~]# vim /etc/exports
/home/nfstestdir 192.168.65.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
# 添加如下代码
/tmp 192.168.65.134(rw,sync,no_root_squash)

此时客户端上查看的共享目录信息未变

[root@client ~]# showmount -e 192.168.65.133
Export list for 192.168.65.133:
/home/nfstestdir 192.168.65.0/24

执行exportfs目录后重新查看

[root@server ~]# exportfs -arv
exporting 192.168.65.134:/tmp
exporting 192.168.65.0/24:/home/nfstestdir

# 客户端信息更新
[root@client ~]# showmount -e 192.168.65.133
Export list for 192.168.65.133:
/home/nfstestdir 192.168.65.0/24
/tmp             192.168.65.134

测试配置是否生效

[root@client ~]# mount -t nfs 192.168.65.133:/tmp /mnt
[root@client ~]# vim /mnt/11.txt
# no_root_squash参数生效
[root@client ~]# ls -l /mnt/11.txt
-rw-r--r--. 1 root root 11 1月  10 20:00 /mnt/11.txt

[root@server ~]# ls -l /tmp/11.txt
-rw-r--r--. 1 root root 11 1月  10 20:00 /tmp/11.txt

NFS客户端问题

在centos6版本中,NFSv4偶尔会出现一个问题:客户端在挂载共享目录后,即便是在服务端设定好no_root_squash参数后,无论是root用户还普通用户,在创建新文件时,文件的属主和属组都为nobody。

解决上述问题的方法:

  1. 在客户端挂载时加上-o nfsvers=3,即指定nfs版本为3,不去使用v4版本。
# 方法1:先umount,后mount
[root@client ~]# umount /mnt
[root@client ~]# mount -t nfs -o nfsvers=3 192.168.65.133:/tmp /mnt

# 使用-o remount命令(前提已经挂载)
[root@client~]# mount -t nfs -oremount,nfsvers=3 192.168.65.133:/tmp /mnt
  1. 编辑/etc/idmapd.conf
# 客户端、服务器都需要进行配置
[root@localhost ~]# vim /etc/idmapd.conf
/Domain定义到该行
在下一行添加
Domain = xxx.com //域名可以随意,客户端、服务器对应即可

# 完成后在服务器上重启rpcbind服务
[root@localhost ~]# systemctl restart rpcbind

FTP介绍

FTP是File Transfer Protocol文件传输协议)的英文简称,用于在Internet上控制文件的双向传输。

ftp的主要作用就是让用户连接一个远程计算机(运行ftp访问的服务器),并查看远程计算机中的文件,然后把文件从远程计算机复制到本地计算机,或把本机计算机的文件传输到远程计算机。

出于安全性的考虑,ftp在小公司用的比较多。大企业几乎不怎么使用,而是使用专门的自动化发布平台,相对而言更加安全。

搭建FTP服务

vsftpd可以由系统级别的用户去登录ftp,登录后用户会进入其家目录下。由于这些ftp用户(系统级别用户)设置密码后,可以登录到系统,极易产生一些安全问题。我们可以通过给FTP服务设置一个虚拟的用户,并映射为系统内的普通用户,这些虚拟用户就无法直接登录服务器,安全性就比较好。

  • 安装vsftpd
[root@localhost ~]# yum install -y vsftpd
  • 创建用户
# 创建用户指定shell为/sbin/nologin,不让用户登录系统
[root@localhost ~]# useradd -s /sbin/nologin virftp
  • 编辑虚拟用户的密码文件
# 密码文件格式:奇数行为用户名,偶数行为密码
[root@localhost ~]# vim /etc/vsftpd/vsftpd_login
test
1

# 修改权限,只有属主有读写权限
[root@localhost ~]# chmod 600 /etc/vsftpd/vsftpd_login
  • 将密码文件转换为二进制文件
# 文本型的密码文件不被识别,需要转换为计算机可识别的二进制文件
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db

[root@localhost ~]# ls -l /etc/vsftpd/vsftpd_login*
-rw-r--r--. 1 root root     7 1月  11 18:31 /etc/vsftpd/vsftpd_login
-rw-r--r--. 1 root root 12288 1月  11 18:37 /etc/vsftpd/vsftpd_login.db
  • 创建虚拟用户的配置文件
# 存储配置文件的目录需要直接创建,目录名自定义
[root@localhost ~]# mkdir /etc/vsftpd/vsftpd_user_conf
[root@localhost ~]# cd /etc/vsftpd/vsftpd_user_conf

# 配置文件的文件名需要跟密码文件内的用户名对应
# 比如我在/etc/vsftpd/vsftpd_login下定义的用户时test,这里配置文件就是test
[root@localhost vsftpd_user_conf]# vim test
// 输入以下代码

// 定义虚拟用户的家目录,用户在该目录读写文件
local_root=/home/virftp/test
// 不允许匿名用户
anonymous_enable=NO
// 允许写
write_enable=YES
// 虚拟用户创建新文件、目录的umask值
local_umask=022
// 不允许匿名用户上传
anon_upload_enable=NO
// 不允许匿名用户创建目录并写文件
anon_mkdir_write_enable=NO
// 空闲用户时间,超过自动断开连接
idle_session_timeout=600
// 数据传输的超时时间
data_connection_timeout=120
// 最大连接的客户端数
max_clients=10
  • 创建虚拟用户家目录
[root@localhost vsftpd_user_conf]# mkdir /home/virftp/test
[root@localhost vsftpd_user_conf]# touch /home/virftp/test/1.txt
# 修改目录的权限,防止因权限导致的无法读写问题
[root@localhost vsftpd_user_conf]# chown -R virftp:virftp /home/virftp/
  • 定义用户密码文件路径
# /etc/pam.d/vsftpd 用来认证的文件,登录ftp时,通过该文件比对用户及密码十分准确
[root@localhost vsftpd_user_conf]# vim /etc/pam.d/vsftpd
#%PAM-1.0
# 在开头添加下面两行代码
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
  • 编辑vsftpd配置文件
[root@localhost vsftpd_user_conf]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO           //原为:anonymous_enable=YES
anon_upload_enable=NO         //原为:#anon_upload_enable=YES
anon_mkdir_write_enable=NO    //原为:#anon_mkdir_write_enable=YES

#再添加如下代码
chroot_local_user=YES
guest_enable=YES
guest_username=virftp           // 指定虚拟用户
virtual_use_local_privs=YES     //表示现在使用了虚拟用户
user_config_dir=/etc/vsftpd/vsftpd_user_conf  //定义虚拟配置文件所在目录
allow_writeable_chroot=YES
  • 重启服务
[root@localhost vsftpd_user_conf]# systemctl start vsftpd

# 服务已启动
[root@localhost vsftpd_user_conf]# ps aux| grep vsftp
root       2486  0.0  0.0  53216   580 ?        Ss   19:17   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       2488  0.0  0.0 112680   976 pts/0    S+   19:19   0:00 grep --color=auto vsftp

# 21端口已开
[root@localhost vsftpd_user_conf]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
...
tcp6       0      0 :::21                   :::*                    LISTEN      2486/vsftpd
...

服务测试

Windows上推荐使用filezilla,为了测试的方便,在测试机安装lftp软件即可。

  • 安装lftp
[root@localhost vsftpd_user_conf]# yum install -y lftp
  • 登录、操作
# 登录ftp服务器:用户名@127.0.0.1,输入密码
[root@localhost vsftpd_user_conf]# lftp test@127.0.0.1
口令:

# 成功登录
# ls查看当前目录下的文件
lftp test@127.0.0.1:~> ls
-rw-r--r--    1 1002     1002            0 Jan 11 10:47 1.txt
# ?查看可操作的命令
lftp test@127.0.0.1:/> ?
    !<shell-command>                     (commands)
    alias [<name> [<value>]]             attach [PID]
    bookmark [SUBCMD]                    cache [SUBCMD]
    cat [-b] <files>                     cd <rdir>
    chmod [OPTS] mode file...            close [-a]
    [re]cls [opts] [path/][pattern]
    debug [<level>|off] [-o <file>]      du [options] <dirs>
    exit [<code>|bg]
    get [OPTS] <rfile> [-o <lfile>]
    glob [OPTS] <cmd> <args>             help [<cmd>]
    history -w file|-r file|-c|-l [cnt]  jobs [-v] [<job_no...>]
    kill all|<job_no>                    lcd <ldir>
    lftp [OPTS] <site>                   ln [-s] <file1> <file2>
    ls [<args>]                          mget [OPTS] <files>
    mirror [OPTS] [remote [local]]       mkdir [-p] <dirs>
    module name [args]                   more <files>
    mput [OPTS] <files>                  mrm <files>
    mv <file1> <file2>                   [re]nlist [<args>]
    open [OPTS] <site>
    pget [OPTS] <rfile> [-o <lfile>]
    put [OPTS] <lfile> [-o <rfile>]      pwd [-p]
    queue [OPTS] [<cmd>]                 quote <cmd>
    repeat [OPTS] [delay] [command]      rm [-r] [-f] <files>
    rmdir [-f] <dirs>                    scache [<session_no>]
    set [OPT] [<var> [<val>]]            site <site-cmd>
    source <file>
    torrent [-O <dir>] <file|URL>...
    user <user|URL> [<pass>]             wait [<jobno>]
    zcat <files>                         zmore <files>

# get命令从ftp服务器上下载文件到本机
lftp test@127.0.0.1:/> get 1.txt

lftp test@127.0.0.1:/> quit
# get命令下载的文件默认在登录前的用户所在目录
[root@localhost vsftpd_user_conf]# ls
1.txt  test
12-10 15:41