版本:红帽企业Linux 4
现象:
NFS依赖portmap分配它监听的端口。这些端口是动态分配的,所以每次NFS重启后,端口都会改变。这使得在只允许访问系统指定端口的防火墙后运行一个NFS服务器变得困难。
解决:
第一步是分配一个永久端口号给每个NFS服务(rquotad, mountd, statd, and lockd)。因为它们能使用任何高于1024的没有被使用的端口,建议你首先查看/etc/services文件来找到一个有效的没有使用的端口范围。下面的例子使用10000-10005。
这些端口大部分在/etc/sysconfig/nfs文件里被配置。如果它不存在就创建它。它看起来像这样:
# NFS port numbers STATD_PORT=10002 STATD_OUTGOING_PORT=10003 MOUNTD_PORT=10004 RQUOTAD_PORT=10005
lockd服务和其他服务配置不同,因为它是一个核心模块。要设置lockd使用的端口,在/etc/sysconfig/nfs文件里添加这些选项:
LOCKD_UDPPORT=30001 LOCKD_TCPPORT=30001
这里"30001"可以被替换成任何可用并且可以被分配使用的端口。
做完这些配置改变后,你可以用命令 rpcinfo -p
<hostname>
来查看端口分配情况:
# rpcinfo -p localhost program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100021 1 udp 10001 nlockmgr 100021 3 udp 10001 nlockmgr 100021 4 udp 10001 nlockmgr 100021 1 tcp 10000 nlockmgr 100021 3 tcp 10000 nlockmgr 100021 4 tcp 10000 nlockmgr 100024 1 udp 10002 status 100024 1 tcp 10002 status 100011 1 udp 10005 rquotad 100011 2 udp 10005 rquotad 100011 1 tcp 10005 rquotad 100011 2 tcp 10005 rquotad 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100005 1 udp 10004 mountd 100005 1 tcp 10004 mountd 100005 2 udp 10004 mountd 100005 2 tcp 10004 mountd 100005 3 udp 10004 mountd 100005 3 tcp 10004 mountd
这样,当NFS重启后端口将会保留。下面是在防火墙上需要被打开的端口列表:
* 111: portmap (tcp/udp) * 2049: nfs (tcp/udp) * 10000: example lockd (tcp) * 10001: example lockd (udp) * 10002: example statd/status (tcp/udp) * 10003: example statd/status outgoing (tcp/udp) * 10004: example mountd (tcp/udp) * 10005: example rquotad (tcp/udp)
你现在可以在防火墙上打开这些端口,来允许远方的客户端挂载服务器上的共享输出了。如果你使用iptables,可以用下面的命令来增加输入/输出规则,来允许访问这些端口。注意这只是一个例子,你的防火墙规则可能不一样:
# iptables -A INPUT -p tcp -m tcp --dport 111 -j ACCEPT # iptables -A INPUT -p udp -m udp --dport 111 -j ACCEPT # iptables -A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT # iptables -A INPUT -p udp -m udp --dport 2049 -j ACCEPT # iptables -A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT # iptables -A INPUT -p udp -m udp --dport 10001 -j ACCEPT # iptables -A INPUT -p tcp -m tcp --dport 10002:10005 -j ACCEPT # iptables -A INPUT -p udp -m udp --dport 10002:10005 -j ACCEPT # iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable # iptables -A OUTPUT -p tcp -m tcp --dport 111 -j ACCEPT # iptables -A OUTPUT -p udp -m udp --dport 111 -j ACCEPT # iptables -A OUTPUT -p tcp -m tcp --dport 2049 -j ACCEPT # iptables -A OUTPUT -p udp -m udp --dport 2049 -j ACCEPT # iptables -A OUTPUT -p tcp -m tcp --dport 10000 -j ACCEPT # iptables -A OUTPUT -p udp -m udp --dport 10001 -j ACCEPT # iptables -A OUTPUT -p tcp -m tcp --dport 10002:10005 -j ACCEPT # iptables -A OUTPUT -p udp -m udp --dport 10002:10005 -j ACCEPT # iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -j REJECT --reject-with icmp-port-unreachable
注意:没有指明用tcp选项的挂载请求会缺省使用udp。