This chapter focuses on fundamental NFS concepts and supplemental
information. For specific instructions regarding the configuration and
operation of NFS server and client software, refer to the chapter titled
Network File System (NFS) in the
Red Hat Enterprise Linux System Administration Guide.
Currently, there are three versions of NFS. NFS version 2 (NFSv2) is
older and is widely supported. NFS version 3 (NFSv3) has more features,
including variable size file handling and better error reporting, but is
not fully compatible with NFSv2 clients. NFS version 4 (NFSv4) includes
Kerberos security, works through firewalls and on the Internet, no
longer requires portmapper, supports ACLs, and utilizes stateful
operations. Red Hat Enterprise Linux supports NFSv2, NFSv3, and NFSv4 clients, and
when mounting a file system via NFS, Red Hat Enterprise Linux uses NFSv4 by default, if
the server supports it.
All versions of NFS can use Transmission Control
Protocol (TCP) running over an IP
network, with NFSv4 requiring it. NFSv2 and NFSv3 can use the
User Datagram Protocol
(UDP) running over an IP network to provide a
stateless network connection between the client and server.
When using NFSv2 or NFSv3 with UDP, the stateless UDP connection under
normal conditions minimizes network traffic, as the NFS server sends the
client a cookie after the client is authorized to access the shared
volume. This cookie is a random value stored on the server's side and is
passed along with RPC requests from the client. The NFS server can be
restarted without affecting the clients and the cookie remains
intact. However, because UDP is stateless, if the server goes down
unexpectedly, UDP clients continue to saturate the network with requests
for the server. For this reason, TCP is the preferred protocol when
connecting to an NFS server.
When using NFSv4, a stateful connection is made, and Kerberos user and
group authentication with various security levels is optionally
available. NFSv4 has no interaction with portmapper,
rpc.mountd, rpc.lockd, and
rpc.statd, since they have been rolled
into the kernel. NFSv4 listens on the well known TCP port 2049.
| Note |
---|
| TCP is the default transport protocol for NFS under Red Hat Enterprise Linux. Refer to
the chapter titled Network File System (NFS) in
the Red Hat Enterprise Linux System Administration Guide for more information about
connecting to NFS servers using TCP. UDP can be used for compatibility
purposes as needed, but is not recommended for wide usage.
|
The only time NFS performs authentication is when a client system
attempts to mount the shared NFS resource. To limit access to the NFS
service, TCP wrappers are used. TCP wrappers read the
/etc/hosts.allow and
/etc/hosts.deny files to determine if a particular
client or network is permitted or denied access to the NFS service. For
more information on configuring access controls with TCP wrappers, refer
to Chapter 17 TCP Wrappers and xinetd.
After the client is granted access by TCP wrappers, the NFS server
refers to its configuration file, /etc/exports, to
determine whether the client is allowed to access any of the exported
file systems. Once access is granted, all file and directory operations
are available to the user.
| Warning |
---|
| If using NFSv2 or NFSv3, which do not support Kerberos
authentication, NFS mount privileges are granted to the client host,
not the user. Therefore, exported file systems can be accessed by any
user on a client host with access permissions. When configuring the
NFS shares, be very careful which hosts get read/write permissions
(rw).
|
| Important |
---|
| In order for NFS to work with a default installation of Red Hat Enterprise Linux with a
firewall enabled, IPTables with the default TCP port 2049 must be
configured. Without an IPTables configuration, NFS does not function
properly.
The NFS initialization script and rpc.nfsd process
now allow binding to any specified port during system start
up. However, this can be error prone if the port is unavailable or
conflicts with another daemon.
|
Red Hat Enterprise Linux uses a combination of kernel-level support and daemon processes
to provide NFS file sharing. NFSv2 and NFSv3 rely on Remote
Procedure Calls (RPC) to encode and decode
requests between clients and servers. RPC services under Linux are
controlled by the portmap service. To share or
mount NFS file systems, the following services work together,
depending on which version of NFS is implemented:
nfs — Starts the appropriate RPC
processes to service requests for shared NFS file systems.
nfslock — An optional service that
starts the appropriate RPC processes to allow NFS clients to lock
files on the server.
portmap — The RPC service for Linux;
it responds to requests for RPC services and sets up connections
to the requested RPC service. This is not used with NFSv4.
The following RPC processes facilitate NFS services:
rpc.mountd — This process receives
mount requests from NFS clients and verifies the requested file
system is currently exported. This process is started automatically
by the nfs service
and does not require user configuration. This is not used with NFSv4.
rpc.nfsd — This process is the NFS
server. It works with the Linux kernel to meet the dynamic demands
of NFS clients, such as providing server threads each time an NFS
client connects. This process corresponds to the
nfs service.
rpc.lockd — An optional process that
allows NFS clients to lock files on the server. This process
corresponds to the nfslock service. This is not
used with NFSv4.
rpc.statd — This process implements the
Network Status Monitor (NSM) RPC protocol
which notifies NFS clients when an NFS server is restarted without
being gracefully brought down. This process is started automatically
by the nfslock service and does not require user
configuration. This is not used with NFSv4.
rpc.rquotad — This process provides
user quota information for remote users. This process is started
automatically by the nfs service and does not
require user configuration.
rpc.idmapd — This process provides
NFSv4 client and server upcalls which map between on-the-wire
NFSv4 names (which are strings in the form of user@domain) and
local UIDs and GIDs. For idmapd to function
with NFSv4, the /etc/idmapd.conf must be
configured. This service is required for use with NFSv4.
rpc.svcgssd — This process provides
the server transport mechanism for the authentication process
(Kerberos Version 5) with NFSv4. This service is required for use
with NFSv4.
rpc.gssd — This process provides the
client transport mechanism for the authentication process
(Kerberos Version 5) with NFSv4. This service is required for use
with NFSv4.
| Note |
---|
| The following section only applies to NFSv2 or NFSv3 implementations
that require the portmap service for backward
compatibility.
|
The portmap service under Linux maps RPC requests
to the correct services. RPC processes notify
portmap when they start, revealing the port number
they are monitoring and the RPC program numbers they expect to
serve. The client system then contacts portmap on
the server with a particular RPC program number. The
portmap service redirects the client to the proper
port number so it can communicate with the requested service.
Because RPC-based services rely on portmap to make
all connections with incoming client requests,
portmap must be available before any of these
services start.
The portmap service uses TCP wrappers for access
control, and access control rules for portmap
affect all RPC-based services. Alternatively, it
is possible to specify access control rules for each of the NFS RPC
daemons. The man pages for rpc.mountd and
rpc.statd contain information regarding the precise
syntax for these rules.
Because portmap provides coordination between RPC
services and the port numbers used to communicate with them, it is
useful to view the status of current RPC services using
portmap when troubleshooting. The
rpcinfo command shows each RPC-based service with
port numbers, an RPC program number, a version number, and an IP
protocol type (TCP or UDP).
To make sure the proper NFS RPC-based services are enabled for
portmap, issue the following command as root:
The following is sample output from this command:
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100021 1 udp 32774 nlockmgr
100021 3 udp 32774 nlockmgr
100021 4 udp 32774 nlockmgr
100021 1 tcp 34437 nlockmgr
100021 3 tcp 34437 nlockmgr
100021 4 tcp 34437 nlockmgr
100011 1 udp 819 rquotad
100011 2 udp 819 rquotad
100011 1 tcp 822 rquotad
100011 2 tcp 822 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100005 1 udp 836 mountd
100005 1 tcp 839 mountd
100005 2 udp 836 mountd
100005 2 tcp 839 mountd
100005 3 udp 836 mountd
100005 3 tcp 839 mountd |
The output from this command reveals that the correct NFS services
are running. If one of the NFS services does not start up correctly,
portmap is unable to map RPC requests from
clients for that service to the correct port. In many cases, if NFS
is not present in rpcinfo output, restarting NFS
causes the service to correctly register with
portmap and begin working. For instructions on
starting NFS, refer to Section 9.2 Starting and Stopping NFS.
Other useful options are available for the
rpcinfo command. Refer to the
rpcinfo man page for more information.