注:以下文字内 [your ip] 为你当前的本机 ip,[your gateway ip] 为你当前本机的网关 ip,[link nfs ip] 为需要连接本机 nfs 的目标 ip。

1. 安装 NFS

1.1. 安装 NFS 与 rpcbind

1
yum install nfs-utils rpcbind

1.2. 创建共享目录并设置权限

1
2
mkdir /data/share/
chmod 755 -R /data/share

1.3. 配置 NFS

/data/share/ [your gateway ip]/24(rw,no_root_squash,no_all_squash,sync,insecure)

rw表示设置目录可读写。

sync表示数据会同步写入到内存和硬盘中,相反rsync表示数据会先暂存于内存中,而非直接写入到硬盘中。

no_root_squashNFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。

no_all_squash不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都不会拥有匿名用户权限。

insecure使用非安全模式(即允许更高的端口号),Windows NFS客户端使用大端口号,需要设置此项,否则出现网络错误-53

加载配置:

1
exportfs -r

配置的 IP 中应包含本机的 IP,否则在加载配置时会出现:

exportfs: Function not implemented

故若要指定单个 IP 能够访问,应写为:

/data/share/ [your ip](rw,no_root_squash,no_all_squash,sync,insecure) [link nfs ip](rw,no_root_squash,no_all_squash,sync,insecure)

1.3.2. 配置 /etc/sysconfig/nfs

/etc/sysconfig/nfs中添加:

RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004

1.4. 配置防火墙

1.4.1. 一般配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# NFS 服务
firewall-cmd --permanent --add-port=111/tdp
firewall-cmd --permanent --add-port=111/udp
firewall-cmd --permanent --add-port=2049/tdp
firewall-cmd --permanent --add-port=2049/udp
# NFS 的其他服务
firewall-cmd --permanent --add-port=30001/tcp
firewall-cmd --permanent --add-port=30001/udp
firewall-cmd --permanent --add-port=30002/tcp
firewall-cmd --permanent --add-port=30002/udp
firewall-cmd --permanent --add-port=30003/tcp
firewall-cmd --permanent --add-port=30003/udp
# 重新加载防火墙配置
firewall-cmd –reload

1.4.2. 需要拦截流出流量

若需要拦截流出流量(禁止本机访问外网),则还需要在direct规则中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ssh
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --dport 22 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport 22 -d [your gateway ip]/24 -j ACCEPT
# NFS 服务
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport 111 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp --sport 111 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport 2049 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp --sport 2049 -d [your gateway ip]/24 -j ACCEPT
# NFS 的其他服务
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport 30001 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport 30002 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport 30003 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport 30004 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp --sport 30001 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp --sport 30002 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp --sport 30003 -d [your gateway ip]/24 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p udp --sport 30004 -d [your gateway ip]/24 -j ACCEPT
# 拦截所有流出流量
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 2 -j DROP

其中,direct命令构成为:

firewall-cmd [--permanent] --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>

如:

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 2 -j DROP

意为:永久(--permanent,需reload生效,不添加则即时生效,但重启后失效)添加direct规则,过滤ipv4的流出流量,全部丢弃包(DROP),优先级为2

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --dport 22 -d [your gateway ip]/24 -j ACCEPT

意为:永久添加direct规则,过滤下述类型的ipv4的流出流量,包类型为tcp、目标端口号为22、目的主机为[your gateway ip]/24,全部放行(ACCEPT),优先级为1

通过优先级的不同(1>2),实现限制外网访问的同时放行ssh流量。

其中,需要注意的是,-dport-sport分别意为目标端口与源端口,对于INPUT流量和OUTPUT流量,有以下不同的理解:

对于INPUT流量,-dport 22指其他主机访问本主机的22端口;-sport 22指其他主机通过22端口访问本机。

对于OUTPUT流量,-dport 22指本机访问其他主机的22端口;-sport 22指本机通过22端口访问其他主机。

1.5 启动 NFS

按顺序启动rpcbindnfs服务:

1
2
systemctl start rpcbind
systemctl start nfs

加入开机启动:

1
2
systemctl enable rpcbind 
systemctl enable nfs

服务启动后,我们可以使用showmount命令来查看服务端(本机)是否可连接:

1
showmount -e localhost

2. 挂载NFS

2.1. 在windows挂载

在 Windows 的控制面板中的“打开或关闭 Windows 功能”中,勾选“NFS 客户端”与“管理工具”(图 2-1),点击确定,等待其安装完成。

图 2-1 启用NFS功能

打开cmd界面,挂载NFS:

# 指令构成为 mount \\IP\共享路径 盘符
mount \\[your ip]\data\share X:

上述指令意为:挂载[your ip]\data\share,指定盘符为X

回车后成功连接,NFS 文件夹出现在资源管理器中(图 2-2):

图 2-2 Windows挂载NFS

断开连接则输入:

umount X:

开机自动挂载步骤见:Windows系统挂载NFS文件系统 - 阿里云

若在 Windows 进入 NFS 目录后无写权限,编辑注册表 NFS 默认用户,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default下添加两个QWORDAnonymousUidAnonymousGid,值为0。重启计算机,再次连接。

2.2. 在linux挂载

安装rpcbind服务:

1
yum -y install rpcbind

查看服务端的共享目录:

1
showmount -e [your ip]

挂载:

1
2
mkdir -p /nfs/share
mount -t nfs [your ip]:/data/share /nfs/share/ -o nolock,nfsvers=3,vers=3

解除挂载:

1
umount /nfs/share

若要开机自动挂载:

1
2
3
vim /etc/rc.d/rc.local
# 在文件最后添加一行
mount -t nfs [your ip]:/data/share /nfs/share/ -o nolock,nfsvers=3,vers=3