NFS는 단독으로 동작하지 않고 RPC(Remote Procedure Call, 원격 프로시저 호출) 위에서 동작한다.
RPC는 클라이언트가 원격 서버의 함수를 마치 로컬 함수처럼 호출하게 해주는 메커니즘이다.
RPC 기반 서비스는 고정 포트가 아니라 동적으로 포트를 할당받는다. 그 포트 정보를 중개하는 것이 rpcbind(과거 이름 portmap)다.
흐름: 클라이언트가 서버의 rpcbind(고정 포트 111)에 "NFS 서비스가 몇 번 포트인가"를 묻는다 → 응답받은 포트로 실제 NFS 통신을 한다.
그래서 rpcbind가 죽어 있으면 NFS 자체가 동작하지 않는다.
구성 요소
역할
rpcbind (포트 111)
RPC 서비스의 포트 정보를 중개하는 포트 매퍼
nfs-server (nfsd)
실제 파일 입출력 요청을 처리하는 NFS 데몬
mountd (rpc.mountd)
클라이언트의 mount 요청을 받아 권한을 검사
rpc.statd / lockd
파일 잠금과 상태 복구 관리
NFS 동작의 전제는 rpcbind(포트 111)가 살아 있어야 한다는 것. "NFS 마운트가 안 된다"의 1순위 원인은 서버나 클라이언트의 rpcbind 미실행, 또는 방화벽에서 111 포트가 막힌 것이다. rpcinfo -p 서버IP로 등록된 RPC 서비스를 확인할 수 있다.
# 서버에 등록된 RPC 서비스 목록 확인rpcinfo -p localhost# NFS 관련 서비스 시작 (RHEL 계열)systemctl start rpcbind nfs-serversystemctl enable rpcbind nfs-server
⚠️ 치명적 함정: 192.168.1.10(rw)와 192.168.1.10 (rw)는 전혀 다르다. 공백이 없으면 "10번 호스트에 rw 권한", 공백이 있으면 "10번 호스트에 기본 권한(ro), 그리고 모든 호스트(*)에 rw 권한"으로 해석된다. 보안 사고로 직결되는 차이다.
root_squash의 의미: NFS는 기본적으로 클라이언트의 root를 믿지 않는다. 클라이언트에서 root로 공유 파일을 만져도 서버에서는 nfsnobody(익명 사용자)로 취급된다. 이것이 root_squash이며 기본값이다. no_root_squash는 신뢰하는 환경에서만 쓰는 위험한 옵션이다 — 클라이언트 root가 서버 파일을 root 권한으로 마음대로 다룰 수 있게 된다.
선택 기준 한 줄: 공유 대상이 전부 리눅스/유닉스면 NFS, 윈도가 섞여 있으면 Samba. NFS는 IP(호스트) 단위 신뢰, Samba는 사용자 계정 단위 인증이라는 철학 차이가 핵심이다.
인증 모델의 차이: NFS는 클라이언트의 UID/GID를 그대로 신뢰한다. 클라이언트에서 UID 1000인 사용자는 서버에서도 UID 1000으로 취급된다. 그래서 NFS 환경에서는 서버와 클라이언트의 사용자 UID를 일치시켜야(또는 NIS/LDAP로 통합) 권한 혼란이 없다. Samba는 그와 무관하게 Samba 자체 계정으로 인증한다.
# === 서버 측 ===# ① 패키지 설치yum install nfs-utils# ② 공유 디렉터리 준비mkdir -p /srv/sharechmod 755 /srv/share# ③ /etc/exports 편집 (공백 주의!)echo "/srv/share 192.168.1.0/24(rw,sync,no_subtree_check)" >> /etc/exports# ④ 서비스 시작systemctl start rpcbind nfs-serversystemctl enable rpcbind nfs-server# ⑤ export 적용exportfs -raexportfs -v# ⑥ 방화벽 개방firewall-cmd --add-service=nfs --add-service=rpc-bind --add-service=mountd --permanentfirewall-cmd --reload# === 클라이언트 측 ===# ⑦ 서버 공유 확인showmount -e 192.168.1.100# ⑧ 마운트mount -t nfs 192.168.1.100:/srv/share /mnt/share
직접 쳐보기: /etc/exports에 일부러 192.168.1.10 (rw)처럼 공백을 넣어 보고 exportfs -v로 결과를 확인해 본다. 의도와 다르게 *에 rw가 부여되는 걸 눈으로 보면 공백 함정이 분명해진다. 또 rpcbind를 일부러 멈춘 뒤(systemctl stop rpcbind) 마운트가 어떻게 실패하는지도 관찰해 본다.
내일은 시스템을 외부로부터 지키는 방화벽 — iptables와 firewalld를 다룬다.