NFS、FTP介绍

时间:2023-03-09 16:38:32
NFS、FTP介绍

第二十五课 NFS、FTP介绍

目录

一、 NFS介绍

二、NFS服务端安装配置

三、NFS配置选项

四、exportfs命令

五、NFS客户端问题

六、FTP介绍

七、使用vsftpd搭建ftp

八、xshell使用xftp传输文件

九、使用pure-ftpd搭建ftp服务

十、扩展

一、 NFS介绍

NFS是Network File System的缩写,中文意思是网络文件系统。

NFS的主要功能是通过网络(一般是局域网)让不同的主机系统之间共享文件或目录。

NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版本

NFS数据传输基于RPC协议,RPC为Remote Procedure Call的简写。

NFS应用场景是:A,B,C三台机器上需要保证被访问到的文件是一样的,A共享数据出来,B和C分别去挂载A共享的数据目录,从而B和C访问到的数据和A上的一致

NFS工作原理流程

NFS、FTP介绍

当访问程序通过NFS客户端向NFS服务器端存取文件时,其请求数据流程大致如下:

1)首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端的RPC服务就会通过网络向NFS服务器端的RPC服务端的111端口发起NFS文件存取功能的请求。

2)NFS服务器端的RPC服务找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务。

  1. NFS客户端获取到正确的端口,并与NFS服务器联机读取数据

4)NFS客户端数据存取成功后,返回给前端访问程序,告知用户存取结果,作为网站用户,就完成了一次存取操作。

二、NFS服务端安装配置

NFS服务器的安装

//nfs-utils是NFS服务的主程序,包括rpc.nfsd、rpc.mounted
yum -y install nfs-utils rpcbind

安装完成后,修改配置文件

[root@localhost ~]# vim /etc/exports
//增加如下内容
/home/nfstestdir 192.168.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) //创建/home/nfstestdir目录
[root@localhost ~]# mkdir /home/nfstestdir //为简化实验环境,将/home/nfstestdir目录权限设为777
[root@localhost ~]# chmod 777 /home/nfstestdir/ //启动rpcbind.service(必须先于nfs主程序启动)
[root@localhost ~]# systemctl start rpcbind.service
[root@localhost ~]# systemctl enable rpcbind.service //查看rpcbind是否正常启动
[root@localhost ~]# netstat -nltup | grep :111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2016/rpcbind
tcp6 0 0 :::111 :::* LISTEN 2016/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 2016/rpcbind
udp6 0 0 :::111 :::* 2016/rpcbind //启动nfs主程序
[root@localhost ~]# systemctl start nfs.service
[root@localhost ~]# systemctl enable nfs.service //查看nfs是否正常启动
[root@localhost ~]# ps aux | grep nfs
root 2098 0.0 0.0 0 0 ? S< 22:53 0:00 [nfsd4_callbacks]
root 2104 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2105 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2106 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2107 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2108 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2109 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2110 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2111 0.0 0.0 0 0 ? S 22:53 0:00 [nfsd]
root 2115 0.0 0.0 112660 968 pts/0 R+ 22:54 0:00 grep --color=auto nfs

三、NFS配置选项

NFS选项

rw 读写

ro 只读

sync 同步模式,内存数据实时写入磁盘

async 非同步模式

no_root_squash 客户端挂载NFS共享目录后,root用户不受约束,权限很大

root_squash 与上面选项相对,客户端上的root用户收到约束,被限定成某个普通用户

all_squash 客户端上所有用户在使用NFS共享目录时都被限定为一个普通用户

anonuid/anongid 和上面几个选项搭配使用,定义被限定用户的uid和gid

NFS客户端安装及共享挂载

[root@localhost ~]# yum -y install rpcbind nfs-utils

[root@localhost ~]# systemctl start rpcbind.service
[root@localhost ~]# systemctl enable rpcbind.service
[root@localhost ~]# showmount -e 192.168.1.22
Export list for 192.168.1.22:
/home/nfstestdir 192.168.1.0/24
[root@localhost ~]# mount -t nfs 192.168.1.22:/home/nfstestdir /mnt
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 19G 1.5G 18G 8% /
devtmpfs 479M 0 479M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.7M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 197M 98M 100M 50% /boot
tmpfs 98M 0 98M 0% /run/user/0
192.168.1.22:/home/nfstestdir 19G 1.5G 18G 8% /mnt //NFS客户端
[root@localhost ~]# touch /mnt/testfile.txt
[root@localhost ~]# ls -l /mnt/testfile.txt
-rw-r--r-- 1 1000 1000 0 Jul 12 23:28 /mnt/testfile.txt
//服务器端
[root@localhost ~]# ls -l /home/nfstestdir/testfile.txt
-rw-r--r-- 1 1000 1000 0 Jul 12 23:28 /home/nfstestdir/testfile.txt

四、exportfs命令

exportfs 命令用来管理当前NFS共享的文件系统列表。

常用选项

-a 全部挂载或者全部卸载

-r 重新挂载

-u 卸载某一个目录

-v 显示共享目录

exportfs实现nfs服务的平滑重启

[root@nfs-server ~]# vim /etc/exports
//增加
/tmp/test 10.0.1.0/24(rw,sync,all_squash) //未重启前
[root@lnmp01 ~]# vim /etc/exports
[root@lnmp01 ~]# showmount -e 10.0.1.80
Export list for 10.0.1.80:
/data 10.0.1.0/24
[root@lnmp01 ~]# ifconfig | awk 'NR==2{print $2}'
10.0.1.81
//重启
[root@nfs-server ~]# ifconfig | awk 'NR==2{print $2}'
10.0.1.80
[root@nfs-server ~]# exportfs -arv
exporting 10.0.1.0/24:/tmp/test
exporting 10.0.1.0/24:/data [root@lnmp01 ~]# showmount -e 10.0.1.80
Export list for 10.0.1.80:
/tmp/test 10.0.1.0/24
/data 10.0.1.0/24 [root@lnmp01 ~]# mkdir /tmp/demo
[root@lnmp01 ~]# mount -t nfs 10.0.1.80:/tmp/test /tmp/demo
[root@lnmp01 ~]# touch /tmp/demo/lnmp01.txt
[root@lnmp01 ~]# ls -l /tmp/demo/lnmp01.txt
-rw-r--r--. 1 nfsnobody nfsnobody 0 Jul 15 05:35 /tmp/demo/lnmp01.txt
[root@nfs-server ~]# ls -l /tmp/test/lnmp01.txt
-rw-r--r--. 1 nfsnobody nfsnobody 0 Jul 15 05:35 /tmp/test/lnmp01.txt //修改参数all_squash为no_root_squash
[root@nfs-server ~]# vim /etc/exports
/tmp/test 10.0.1.0/24(rw,sync,no_root_squash)
[root@nfs-server ~]# exportfs -arv
exporting 10.0.1.0/24:/tmp/test
exporting 10.0.1.0/24:/data //客户端
[root@lnmp01 demo]# touch user01.txt
[root@lnmp01 demo]# ll user01.txt
-rw-r--r--. 1 root root 0 Jul 15 05:43 user01.txt
//服务器端
[root@nfs-server ~]# ls -l /tmp/test/user01.txt
-rw-r--r--. 1 root root 0 Jul 15 05:43 /tmp/test/user01.txt

五、NFS客户端问题

客户端挂载共享目录后,不管是root用户还是普通用户,创建新文件时属主、属组为nobody

NFS 4版本会有该问题

解决办法:客户端挂载时加上 -o nfsvers=3

如:[root@lnmp01 demo]# mount -t nfs -o remount,nfsvers=3 10.0.1.80:/tmp/test/ /tmp/demo/

或者

vim /etc/idmapd.conf //

把"#Domain = local.domain.edu" 改为 "Domain = xxx.com" (这里的xxx.com,自己定义),然后再重启

rpcbind服务

六、FTP介绍

文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供。

FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)察看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。

ftp小公司用的多,大企业不用FTP,因为不安全.

七、使用vsftpd搭建ftp

Centos本身自带和ftp软件是vsftp。

vsftp的安装

[root@localhost ~]# yum -y install vsftpd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* extras: mirrors.njupt.edu.cn
* updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package vsftpd.x86_64 0:3.0.2-22.el7 will be installed
--> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================
Package Arch Version Repository Size
================================================================================================================================
Installing:
vsftpd x86_64 3.0.2-22.el7 base 169 k Transaction Summary
================================================================================================================================
Install 1 Package Total download size: 169 k
Installed size: 348 k
Downloading packages:
vsftpd-3.0.2-22.el7.x86_64.rpm | 169 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : vsftpd-3.0.2-22.el7.x86_64 1/1
Verifying : vsftpd-3.0.2-22.el7.x86_64 1/1 Installed:
vsftpd.x86_64 0:3.0.2-22.el7 Complete!

默认配置文件

[root@localhost ~]# grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

启动vsftp

[root@localhost ~]# systemctl start vsftpd.service
udp6 0 0 ::1:323 :::* 684/chronyd
[root@localhost ~]# netstat -nltup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1070/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1162/master
tcp6 0 0 :::21 :::* LISTEN 1463/vsftpd
tcp6 0 0 :::22 :::* LISTEN 1070/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1162/master
udp 0 0 127.0.0.1:323 0.0.0.0:* 684/chronyd
udp6 0 0 ::1:323 :::* 684/chronyd

默认匿名用户可以登录

//默认ftp没有安装,用yum安装一下
[root@localhost ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

配置虚拟用户访问ftp

1.添加虚拟用户映射的本地用户

[root@localhost ~]# useradd -s /sbin/nologin vftp
[root@localhost ~]# tail -1 /etc/passwd
vftp:x:5001:5001::/home/vftp:/sbin/nologin

2.创建虚拟用户密码文件

[root@localhost ~]# vim /etc/vsftpd/vftp_user
[root@localhost ~]# cat /etc/vsftpd/vftp_user
//内容如下,奇数行为用户名,偶数行为密码,多个用户就写多行
frank
123456
nicole
123456
[root@localhost ~]#db_load -T -t hash -f /etc/vsftpd/vftp_user /etc/vsftpd/vftp_user.db
[root@localhost vsftpd_user_conf]# ls -l /etc/vsftpd/vftp_user.db
-rw-r--r-- 1 root root 12288 Jul 15 21:43 /etc/vsftpd/vftp_user.db
[root@localhost ~]# chmod 600 /etc/vsftpd/vftp_user.db
[root@localhost ~]# ls -l /etc/vsftpd/vftp_user.db
-rw------- 1 root root 12288 Jul 15 21:43 /etc/vsftpd/vftp_user.db

3.创建虚拟用户配置文件

[root@localhost ~]# mkdir /etc/vsftpd/vsftpd_user_conf
[root@localhost ~]# vim /etc/vsftpd/vsftpd_user_conf/frank
//内容如下
local_root=/home/vftp/frank
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10

4.创建虚拟用户家目录

[root@localhost ~]# mkdir -p /home/vftp/frank
//创建测试文件
[root@localhost ~]# vim /home/vftp/frank/test.txt
//修改虚拟用户家目录权限
[root@localhost ~]# chown -R vftp:vftp /home/vftp

5.修改登录认证文件

[root@localhost ~]# vim /etc/pam.d/vsftpd
#%PAM-1.0
//增加如下两行内容
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vftp_user
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vftp_user session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth

6.修改配置文件

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
//修改内容如下
anonymous_enable=YES---->anonymous_enable=NO
anonymous_enable=YES---->anonymous_enable=NO
anon_mkdir_write_enable=YES---->anon_mkdir_write_enable=NO
//增加如下内容
chroot_local_user=YES
guest_enable=YES
guest_username=vftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
allow_writeable_chroot=YES

7.重启vsftpd服务

[root@localhost ~]# systemctl restart vsftpd.service

8.测试

本地测试

lftp 127.0.0.1:~> quit
[root@localhost ~]# lftp frank@127.0.0.1
Password:
lftp frank@127.0.0.1:~> ls
-rw-r--r-- 1 5001 5001 0 Jul 16 01:46 test.txt
lftp frank@127.0.0.1:/> quit
[root@localhost ~]#

windows下测试

C:\Users\kennminn>ftp 10.0.1.242
连接到 10.0.1.242。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(10.0.1.242:(none)): frank
331 Please specify the password.
密码:
230 Login successful.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 5001 5001 0 Jul 16 01:46 test.txt
226 Directory send OK.
ftp: 收到 69 字节,用时 0.00秒 17.25千字节/秒。
ftp> get test.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for test.txt (0 bytes).
226 Transfer complete.
ftp> quit
221 Goodbye.

八、xshell使用xftp传输文件

在xshell窗口按ctrl+alt+F,调出xftp安装下载提示界面,根据提示下载安装好xftp软件

NFS、FTP介绍

xftp的使用界面,与winscp类似

NFS、FTP介绍

九、使用pure-ftpd搭建ftp服务

pure-ftpd的安装需要用到epel-release源,如果未安装,可以用yum安装

[root@localhost ~]# yum install -y epel-release

安装pure-ftp

[root@localhost ~]# yum install -y pure-ftpd
Loaded plugins: fastestmirror
...中间略...
Installed:
pure-ftpd.x86_64 0:1.0.42-3.el7 Dependency Installed:
postgresql-libs.x86_64 0:9.2.23-3.el7_4 usermode.x86_64 0:1.111-5.el7 Complete!

2.编辑配置文件

[root@localhost ~]# vim /etc/pure-ftpd/pure-ftpd.conf
# PureDB user database (see README.Virtual-Users)
//取消下行注释
PureDB /etc/pure-ftpd/pureftpd.pdb

3.重启pure-ftp服务

[root@localhost ~]# systemctl start pure-ftpd.service
[root@localhost ~]# netstat -nltup | grep :21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1223/pure-ftpd (SER
tcp6 0 0 :::21 :::* LISTEN 1223/pure-ftpd (SER
[root@localhost ~]#

4.创建ftp目录及虚拟用户映射的本地用户

//创建目录
[root@localhost ~]# mkdir -p /data/ftp
[root@localhost ~]# ls -ld !$
ls -ld /data/ftp
drwxr-xr-x 2 root root 6 Jul 15 22:46 /data/ftp
//创建用户
[root@localhost ~]# useradd -u 5001 pure-ftp
[root@localhost ~]# chown -R pure-ftp.pure-ftp /data/ftp
[root@localhost ~]# ls -ld !$
ls -ld /data/ftp
drwxr-xr-x 2 pure-ftp pure-ftp 6 Jul 15 22:46 /data/ftp

5.创建虚拟用户

[root@localhost ~]# pure-pw useradd ftp_usera -u pure-ftp  -d /data/ftp
Password:
Enter it again:
[root@localhost ~]# pure-pw mkdb
[root@localhost ~]# pure-pw list
ftp_usera /data/ftp/./ //pure-pw用法参照帮助
[root@localhost ~]# pure-pw --help Usage : pure-pw useradd <login> [-f <passwd file>] -u <uid> [-g <gid>]
-D/-d <home directory> [-c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m] pure-pw usermod <login> -f <passwd file> -u <uid> [-g <gid>]
-D/-d <home directory> -[c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m] pure-pw userdel <login> [-f <passwd file>] [-m] pure-pw passwd <login> [-f <passwd file>] [-m] pure-pw show <login> [-f <passwd file>] pure-pw mkdb [<puredb database file> [-f <passwd file>]]
[-F <puredb file>] pure-pw list [-f <passwd file>] -d <home directory> : chroot user (recommended)
-D <home directory> : don't chroot user
-<option> '' : set this option to unlimited
-m : also update the /etc/pure-ftpd/pureftpd.pdb database
For a 1:10 ratio, use -q 1 -Q 10
To allow access only between 9 am and 6 pm, use -z 0900-1800

6.测试

本地测试

[root@localhost ~]# lftp ftp_usera@127.0.0.1
Password:
lftp ftp_usera@127.0.0.1:~> ls
drwxr-xr-x 2 5001 pure-ftp 6 Jul 15 22:46 .
drwxr-xr-x 2 5001 pure-ftp 6 Jul 15 22:46 ..
lftp ftp_usera@127.0.0.1:/>

windows下测试

C:\Users\kennminn>ftp 10.0.1.242
连接到 10.0.1.242。
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 2 of 50 allowed.
220-Local time is now 22:55. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
200 OK, UTF-8 enabled
用户(10.0.1.242:(none)): ftp_usera
331 User ftp_usera OK. Password required
密码:
230 OK. Current directory is /
ftp> ls
200 PORT command successful
150 Connecting to port 4919
.
..
226-Options: -a
226 2 matches total
ftp: 收到 10 字节,用时 0.00秒 10000.00千字节/秒。
ftp> quit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.

十、扩展

vsftp使用mysql存放虚拟用户并验证

http://www.aminglinux.com/bbs/thread-342-1-1.html

ftp的主动和被动模式

http://www.aminglinux.com/bbs/thread-961-1-1.html