CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
리눅스마스터 1급 · 1급리눅스마스터 1급
  • Week 1
    • 1.운영체제와 리눅스: 커널이 하는 일
    • 2.자유 소프트웨어와 배포판: 라이선스가 만든 생태계
    • 3.설치와 부팅: 전원을 켜는 순간부터
    • 4.파일시스템 구조와 파일의 종류: 모든 것은 파일이다
    • 5.Week 1 종합 복습: 개념을 꿰뚫는 시간
  • Week 2
  • Week 3
  • Week 4
  • Week 5
  • Week 6
  • Week 7
  • Week 8
  • Week 9
  • Week 10
  • Week 11
    • 1.Samba: 윈도와 리눅스를 잇는 파일·프린터 공유
    • 2.NFS: 유닉스 세계의 표준 파일 공유
    • 3.방화벽: iptables와 firewalld
    • 4.접근 제어와 보안: TCP Wrapper, SELinux, 로그 관리
    • 5.Week 11 종합 복습: 공유, 방화벽, 보안의 큰 그림
  • Week 12
  • Week 13
  • Week 14
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 1급/Week 11/Day 2

기준: 리눅스마스터 1급 출제 기준·오류 제보

리눅스마스터 1급· AssociateWeek 11 · Day 2읽기 약 10분
핵심 정리
  • NFS(Network File System)는 1984년 썬 마이크로시스템즈가 만든 유닉스/리눅스 표준 파일 공유. 원격 디렉터리를 로컬 디스크처럼 마운트한다.
  • NFS는 RPC 위에서 동작한다 → rpcbind(포트 111)가 살아 있지 않으면 NFS 자체가 안 된다.
  • 서버 설정은 /etc/exports 한 파일. 형식은 디렉터리 클라이언트(옵션)이고 클라이언트와 괄호 사이에 공백이 있으면 안 된다.
  • 수정 후 적용은 exportfs -ra, 확인은 exportfs -v. 클라이언트는 showmount -e로 조회하고 mount -t nfs로 붙는다.
  • 리눅스끼리면 NFS(IP·UID 신뢰), 윈도가 섞이면 Samba(계정 인증).

Day 2 - NFS: 유닉스 세계의 표준 파일 공유

NFS의 구조: RPC와 포트 매퍼

  • 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-server
systemctl enable rpcbind nfs-server

/etc/exports: 무엇을 누구에게 내보낼 것인가

  • 서버 쪽 NFS 설정의 핵심은 /etc/exports 파일 하나다.
  • "어떤 디렉터리를, 어떤 클라이언트에게, 어떤 권한으로 내보낼지"를 한 줄에 하나씩 정의한다.
  • 문법은 다음과 같다.
공유할_디렉터리    클라이언트(옵션,옵션,...)   클라이언트2(옵션,...)
# /etc/exports 예시
/srv/share      192.168.1.0/24(rw,sync,no_subtree_check)
/data/public    *(ro,sync)
/home/team      192.168.1.10(rw,sync)  192.168.1.20(ro)
/secret         server.example.com(rw,sync,root_squash)
  • 여기서 공백의 위치가 결정적이다. 클라이언트 이름과 괄호 사이에 공백이 있으면 안 된다.
  • NFS exports 문법에서 가장 악명 높은 함정이다.

⚠️ 치명적 함정: 192.168.1.10(rw)와 192.168.1.10 (rw)는 전혀 다르다. 공백이 없으면 "10번 호스트에 rw 권한", 공백이 있으면 "10번 호스트에 기본 권한(ro), 그리고 모든 호스트(*)에 rw 권한"으로 해석된다. 보안 사고로 직결되는 차이다.

클라이언트 지정 방식

표기의미
192.168.1.10특정 IP 호스트 하나
192.168.1.0/24서브넷 전체
*.example.com도메인 내 모든 호스트 (와일드카드)
*모든 호스트
server1호스트 이름

주요 export 옵션

옵션의미
ro읽기 전용 (read only)
rw읽기·쓰기
sync데이터를 디스크에 쓴 뒤 응답 (안전, 기본·권장)
async디스크 기록 전에 응답 (빠르지만 위험)
root_squash클라이언트의 root를 익명 사용자(nfsnobody)로 강등 (기본·보안)
no_root_squash클라이언트의 root를 서버에서도 root로 인정 (위험)
all_squash모든 사용자를 익명으로 강등
no_subtree_check하위 트리 검사 생략 (성능·권장)
secure1024 미만의 특권 포트에서 온 요청만 허용 (기본)

root_squash의 의미: NFS는 기본적으로 클라이언트의 root를 믿지 않는다. 클라이언트에서 root로 공유 파일을 만져도 서버에서는 nfsnobody(익명 사용자)로 취급된다. 이것이 root_squash이며 기본값이다. no_root_squash는 신뢰하는 환경에서만 쓰는 위험한 옵션이다 — 클라이언트 root가 서버 파일을 root 권한으로 마음대로 다룰 수 있게 된다.

exportfs: exports를 적용하고 관리하기

  • /etc/exports를 수정한 뒤에는 그 내용을 NFS 서버에 적용해야 한다.
  • 서비스를 통째로 재시작하지 않고 export 테이블만 갱신하는 도구가 exportfs다.
명령의미
exportfs -a/etc/exports의 모든 항목을 export (all)
exportfs -rexport 테이블을 다시 읽어 갱신 (re-export, 수정 후 가장 많이 씀)
exportfs -u특정 export를 해제 (unexport)
exportfs -v현재 export 목록을 상세히 출력 (verbose)
exportfs -ra전체 재적용 (자주 쓰는 조합)
# /etc/exports 수정 후 변경사항 적용
exportfs -ra
 
# 현재 내보내고 있는 목록 확인
exportfs -v
 
# 특정 공유 해제
exportfs -u 192.168.1.0/24:/srv/share

vi /etc/exports → exportfs -ra → exportfs -v로 확인. NFS 서버를 재시작(systemctl restart nfs-server)해도 적용되지만, 운영 중에는 exportfs -ra로 무중단 갱신하는 것이 정석이다.

클라이언트: showmount와 mount -t nfs

  • 클라이언트는 먼저 서버가 무엇을 내보내는지 확인하고, 그다음 마운트한다.
  • 서버의 export 목록을 조회하는 도구가 showmount다.
# 서버가 내보내는 공유 목록 보기 (-e = exports)
showmount -e 192.168.1.100
 
# 서버에 현재 마운트한 클라이언트 보기
showmount -a 192.168.1.100
  • 실제 마운트는 mount -t nfs로 한다.
# 원격 NFS 공유를 로컬 디렉터리에 마운트
mount -t nfs 192.168.1.100:/srv/share /mnt/share
 
# 마운트 옵션 지정
mount -t nfs -o rw,soft,timeo=30 192.168.1.100:/srv/share /mnt/share
  • 부팅 시 자동 마운트하려면 /etc/fstab에 등록한다.
# /etc/fstab 항목 예시
# 서버:원격경로            마운트지점    타입   옵션               덤프 검사
192.168.1.100:/srv/share  /mnt/share   nfs   defaults,_netdev   0    0

⚠️ _netdev 옵션: /etc/fstab에 NFS를 등록할 때 _netdev를 붙이면 "네트워크가 올라온 뒤에 마운트하라"는 뜻이다. 이를 빠뜨리면 부팅 중 네트워크가 준비되기 전에 마운트를 시도해 부팅이 멈출 수 있다.

hard vs soft 마운트

옵션동작
hard서버 응답이 없으면 무한 재시도 (기본, 데이터 안전)
soft일정 시간(timeo) 후 오류 반환하고 포기 (응답성 우선)

hard가 기본인 이유: NFS는 데이터 무결성을 위해 기본적으로 hard 마운트를 쓴다. 서버가 잠시 멈춰도 복구되면 작업이 이어진다. 단, 서버가 영영 죽으면 프로세스가 무한 대기에 빠질 수 있어 intr(인터럽트 허용)나 soft로 보완하기도 한다.

NFS vs Samba: 언제 무엇을 쓰는가

  • 두 공유 방식을 나란히 비교하면 시험 출제 포인트가 선명해진다.
항목NFSSamba(SMB/CIFS)
주 용도유닉스/리눅스 간 공유윈도 ↔ 리눅스 공유
프로토콜NFS (RPC 기반)SMB/CIFS
핵심 설정 파일/etc/exports/etc/samba/smb.conf
적용/관리 명령exportfstestparm, smbpasswd
의존 서비스rpcbind(포트 111)smbd, nmbd
마운트 타입mount -t nfsmount -t cifs
주요 포트111(rpcbind), 2049(nfs)139/445(smbd), 137/138(nmbd)
인증 방식호스트(IP) 기반 + 사용자 UID 매핑사용자 계정/암호 기반
권한 모델리눅스 UID/GID 그대로Samba 계정 + 리눅스 권한

선택 기준 한 줄: 공유 대상이 전부 리눅스/유닉스면 NFS, 윈도가 섞여 있으면 Samba. NFS는 IP(호스트) 단위 신뢰, Samba는 사용자 계정 단위 인증이라는 철학 차이가 핵심이다.

인증 모델의 차이: NFS는 클라이언트의 UID/GID를 그대로 신뢰한다. 클라이언트에서 UID 1000인 사용자는 서버에서도 UID 1000으로 취급된다. 그래서 NFS 환경에서는 서버와 클라이언트의 사용자 UID를 일치시켜야(또는 NIS/LDAP로 통합) 권한 혼란이 없다. Samba는 그와 무관하게 Samba 자체 계정으로 인증한다.

한눈에 보는 NFS 구축 흐름

# === 서버 측 ===
# ① 패키지 설치
yum install nfs-utils
 
# ② 공유 디렉터리 준비
mkdir -p /srv/share
chmod 755 /srv/share
 
# ③ /etc/exports 편집 (공백 주의!)
echo "/srv/share 192.168.1.0/24(rw,sync,no_subtree_check)" >> /etc/exports
 
# ④ 서비스 시작
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
 
# ⑤ export 적용
exportfs -ra
exportfs -v
 
# ⑥ 방화벽 개방
firewall-cmd --add-service=nfs --add-service=rpc-bind --add-service=mountd --permanent
firewall-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를 다룬다.

📖 용어

  • NFS : 원격 서버의 디렉터리를 로컬 디스크처럼 마운트해 쓰는 유닉스/리눅스 표준 파일 공유.
  • RPC : 원격 서버의 함수를 로컬 함수처럼 호출하게 해주는 메커니즘. NFS가 이 위에서 동작한다.
  • rpcbind : RPC 서비스가 몇 번 포트에 있는지 알려주는 포트 매퍼. 고정 포트 111. 과거 이름은 portmap.
  • /etc/exports : "어떤 디렉터리를 누구에게 어떤 권한으로 내보낼지" 정의하는 NFS 서버 설정 파일.
  • exportfs : /etc/exports 내용을 서버에 적용·해제·조회하는 명령. -ra 전체 재적용, -v 목록 확인.
  • root_squash : 클라이언트의 root를 서버에서 익명 사용자(nfsnobody)로 강등하는 기본 보안 옵션.
  • sync / async : 디스크에 쓴 뒤 응답할지(안전), 쓰기 전에 응답할지(빠르지만 위험) 정하는 옵션.
  • showmount : 서버가 내보내는 공유 목록(-e)이나 마운트 중인 클라이언트(-a)를 조회하는 명령.
  • hard / soft 마운트 : 서버 무응답 시 무한 재시도(기본, 안전)할지, 일정 시간 뒤 오류를 낼지 정하는 방식.
  • _netdev : /etc/fstab에서 "네트워크가 올라온 뒤 마운트하라"는 옵션. 빠뜨리면 부팅이 멈출 수 있다.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

NFS 서비스가 동작하기 위해 반드시 필요하며, RPC 서비스의 포트 정보를 중개하는 데몬은?

문제 2

다음 /etc/exports 항목에 대한 설명으로 옳은 것은? ``` /data 192.168.1.0/24(rw,sync) ```

문제 3

/etc/exports에서 클라이언트 지정과 옵션 괄호 사이에 공백을 넣었을 때 발생하는 결과로 옳은 것은?

문제 4

/etc/exports를 수정한 후 NFS 서버를 재시작하지 않고 export 테이블을 갱신하는 명령은?

문제 5

NFS export 옵션 중 클라이언트의 root 사용자를 서버에서 익명 사용자로 강등시켜 보안을 강화하는 기본 옵션은?

문제 6

클라이언트에서 NFS 서버가 내보내는 공유 디렉터리 목록을 확인하는 명령은?

문제 7

NFS와 Samba를 비교한 설명으로 옳지 않은 것은?

이전Samba: 윈도와 리눅스를 잇는 파일·프린터 공유Week 11 · Day 1다음 방화벽: iptables와 firewalldWeek 11 · Day 3

참고 공식 자료

  • 리눅스마스터 1급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • NFS의 구조: RPC와 포트 매퍼
  • etc/exports: 무엇을 누구에게 내보낼 것인가
  • 클라이언트 지정 방식
  • 주요 export 옵션
  • exportfs: exports를 적용하고 관리하기
  • 클라이언트: showmount와 mount -t nfs
  • hard vs soft 마운트
  • NFS vs Samba: 언제 무엇을 쓰는가
  • 한눈에 보는 NFS 구축 흐름
  • 용어
  • 연습 문제