转载自:http://andystar.net/2008/07/nfs%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE/
NFS服务器配置
1. 首先安装对应的安装包,在debian里需要安装一下的packages:
nfs-common portmap nfs-kernel-server
可以使用命令:
#dpkg -l nfs-kernel-server nfs-common portmap
来查询是否已经安装好了,如果没有安装,那么使用apt:
#apt-get update && apt-get upgrade
#apt-get install nfs-kernel-server nfs-common portmap
安装好相应的包
2.然后在Server端(IP 192.168.1.103)配置
#mkdir -p /var/nfs
#vi /etc/exports
加入
/home 192.168.1.104(rw,sync,no_root_squash)
/home/share 192.168.102.15(rw,sync) *(ro)
/var/nfs 192.168.1.104(rw,sync)
表示把/home 这个目录共享给192.168.1.104,rw表示可以读写,sync,表示client端的操作立即在服务器上写入硬 盘,no_root_squash表示如果client用户是root那么他在Server上也有root权限,squash是压扁的意思
第二行表示IP192.168.102.15的客户机有修改权限,其他机器只有只读权限
关于/etc/exports这个nfs核心配置文件更为详细的配置方法,可参考man 5 exports
常用的一些参数:
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
3.在Client端(192.168.1.104)上
#mkdir -p /mnt/nfs/home
#mkdir -p /mnt/nfs/var/nfs
#mount 192.168.1.103:/home /mnt/nfs/home
#mount 192.168.1.103:/var/nfs /mnt/nfs/home
然后
#mount
应该如有如下显示:
192.168.1.103:/home/ on /mnt/nfs/home type nfs (rw,addr=192.168.1.103)
192.168.1.103:/var/nfs on /mnt/nfs/var/nfs type nfs (rw,addr=192.168.1.103)
然后在Client 端:
#touch /mnt/nfs/home/test.txt
#touch /mnt/nfs/var/nfs/test.txt
#cd /mnt/nfs/home
#ls -lh
drwxr-xr-x 2 proftpd nogroup 4.0K 05-28 18:10 ftp
drwxr-xr-x 3 20001 20001 4.0K 06-18 15:39 jaeson
-rw-r–r– 1 root root 0 07-18 10:42 test.txt
drwxrwxrwx 3 1001 1001 4.0K 06-06 18:10 virtual
drwxr-xr-x 37 yexing yexing 4.0K 07-18 11:18 yexing
看到了吗?建立出来的test.txt 拥有者是root!也就是说,如果用no_root_squash方式共享给Client,那么在client上的root就可以在远程Server的文 件系统上也具有root的权限,让我们看看默认的情况是什么:
#cd /mnt/nfs/var/nfs
#ls -lh
-rw-r–r– 1 nobody nogroup 0 07-18 10:50 test.txt
默认情况下是nobody.nogroup的权限,即使你在Client 上有root权限,默认你在Server上也只有nobody.nogroup的权限,这事一个容易搞混的地方
如果想在开机的时候自动挂载,那么就必须知道fstab这个文件了
#vi /etc/fstab
加入:
192.168.1.103:/home /mnt/nfs/home nfs rw,sync,hard,intr 0 0
192.168.1.103:/var/nfs /mnt/nfs/var/nfs nfs rw,sync,hard,intr 0 0
想知道为什么使用nfs,rw,sync,hard,intr的options吗?那么看看
#man nfs
是必须的了!
这里你会知道怎么用这些选项的!
rw,sync不说了,hard是指Client超时后会自动无线次重试连接NFS Server ,intr是说允许信号中断文件传输
=============
当完成资源共享, 我们如何知道发布了哪些权限呢?这时我们可以查看 /var/lib/nfs/etab 文件,它是有 exportfs 命令根据 /etc/exports 生成的。
# cat /var/lib/nfs/etab
在客户机上查看NFS的资源共享情况
# showmount -e 192.168.102.47
Export list for 192.168.102.47:
/home/share (everyone)
最后是一些基本但必要的安全方面的措施:
如果我们的NFS服务器在防火墙后边,则需要在防火强策略中加入如下策略:
-A INPUT -p tcp -m state –state NEW -m multiport –dport 111,2049,4001,32764:32767 -j ACCEPT
-A INPUT -p udp -m state –state NEW -m multiport –dport 111,2049,4001,32764:32767 -j ACCEPT
/etc/hosts.allow和/etc/hosts.deny这两个文件是tcpd服务器的配置文件,tcpd服务器可以控制外部IP对本机 服务的访问。这两个配置文件的格式如下:
#服务进程名:主机列表:当规则匹配时可选的命令操作
server_name:hosts-list[:command]
/etc/hosts.allow控制可以访问本机的IP地址,/etc/hosts.deny控制禁止访问本机的IP。如果两个文件的配置有冲 突,以 /etc/hosts.deny为准。下面是一个/etc/hosts.allow的示例:
ALL:127.0.0.1 #允许本机访问本机所有服务进程
smbd:192.168.0.0/255.255.255.0 #允许192.168.0.网段的IP访问smbd服务
ALL关键字匹配所有情况,EXCEPT匹配除了某些项之外的情况,PARANOID匹配你想控制的IP地址和它的域名不匹配时(域名伪装)的情 况。
比如,在服务器的 /etc/hosts.deny 文件作如下设置:
# cat /etc/hosts.deny
portmap:192.168.102.15
然后在客户机192.168.102.15上加载共享目录
# mount 192.168.102.47:/home/share /mnt
mount to NFS server ‘192.168.102.47′ failed.
我们发现现在已经无法加载共享目录的。