1. 개요
- NFS(Network File System)를 설치하고,
rw/ro및root_squash옵션에 따른 접근 제어와 성능을 테스트하는 방법을 정리한 가이드입니다. - 서버와 클라이언트 간 파일 공유를 설정한 뒤, 쓰기/읽기 권한, root 권한 매핑, 그리고 I/O 성능 차이를 실제로 확인합니다.
2. 버전
- Rocky Linux 9.5
3. 설명
3-1. nobody란?
nobody는 리눅스 시스템에서 권한이 가장 낮은 익명 사용자를 의미합니다.- 주로 보안상 “특정 사용자의 권한을 제한”할 때 사용됩니다.
- root_squash 옵션이 활성화되면, 클라이언트의 root 사용자가 서버에서 파일을 수정하려고 할 때 nobody 권한으로 강등됩니다.
- 이렇게 하면 클라이언트가 root 권한을 이용해 서버의 중요한 파일을 변경하는 것을 방지할 수 있습니다.
3-2. NFS(Network File System) 란?
- 리눅스 및 유닉스 환경에서 네트워크를 통해 파일 시스템을 공유하는 프로토콜입니다.
- 한 서버의 디렉터리를 다른 클라이언트가 로컬 디렉터리처럼 마운트하여 사용할 수 있습니다.
- 주요 특징
- 네트워크를 통한 디렉터리 공유
- 사용자는 마치 로컬 디스크처럼 접근 가능
- 사용자 권한 및 UID/GID 매핑 기반 접근 제어
- 파일 잠금, 캐시, 동기화 기능 지원
- 사용 목적
- 중앙 서버에 데이터를 저장하고 여러 시스템에서 접근
- 클러스터(Cluster) 환경에서 공유 스토리지 구성
- 백업, 로그 수집, 공용 데이터 디렉터리 제공
- 주요 특징
3-3. 주요 용어 정리
| 용어 | 설명 |
|---|---|
| NFS 서버 | 파일을 공유하는 주체. /etc/exports 파일로 공유 디렉터리 정의 |
| NFS 클라이언트 | 공유된 디렉터리를 네트워크를 통해 마운트하여 사용하는 시스템 |
| root_squash | 클라이언트의 root 사용자를 서버의 nobody 사용자로 매핑 (보안 강화용) |
| no_root_squash | root 계정을 그대로 유지 (보안 위험 높음, 테스트 환경용) |
| sync / async | sync는 안정적이지만 느리고, async는 빠르지만 비정상 종료 시 데이터 유실 가능 |
| UID/GID 매핑 | 클라이언트와 서버의 사용자 ID가 일치해야 동일 권한으로 접근 가능 |
3-4. NFS 서버 옵션
| 옵션 | 설명 |
|---|---|
| rw | 읽기/쓰기 허용 |
| ro | 읽기 전용 |
| sync | 데이터가 디스크에 기록될 때까지 응답 지연 (안정적) |
| async | 메모리에 먼저 기록 후 응답 (빠르지만 위험) |
| root_squash | 클라이언트 root → 서버 nobody로 매핑 |
| no_root_squash | 클라이언트 root를 그대로 유지 |
| all_squash | 모든 사용자 → nobody로 매핑 |
| anonuid / anongid | 익명 사용자(nobody)의 UID/GID를 명시적으로 지정 |
| secure | 1024 이하 포트에서만 접근 허용 (기본값) |
| insecure | 높은 포트에서도 접근 허용 |
| wdelay | 여러 쓰기 요청을 모아 한 번에 기록 (성능 향상) |
| no_subtree_check | 서브 디렉터리 확인 비활성화 (성능 향상) |
3-5. NFS 클라이언트 마운트 옵션
| 옵션 | 설명 |
|---|---|
| vers=3 / vers=4 | NFS 버전 지정 |
| rw / ro | 읽기/쓰기 또는 읽기 전용 |
| sync / async | 서버와 동일 의미 |
| hard / soft | 서버 응답 지연 시 처리 방식 (hard는 계속 재시도, soft는 에러 반환) |
| timeo=n | 타임아웃 시간 설정 (기본 600 = 60초) |
| intr | 서버 응답이 없을 때 작업 중단 가능 |
| nolock | 파일 잠금(lock) 기능 비활성화 |
| noatime | 파일 접근 시 접근시간(atime) 갱신하지 않음 (성능 향상) |
4. NFS 서버
4-1. NFS 패키지 설치
# dnf -y install nfs-utils
4-2. NFS 서비스 활성화 및 실행
# systemctl enable --now nfs-server
4-3. 공유 디렉터리 생성
# mkdir -p /nfs/{rw_squash,ro_squash,rw_no_squash,ro_no_squash}
4-4. NFS 설정
# chmod 777 /nfs/{rw_squash,ro_squash}
# vim /etc/exports
설정 예시:
/nfs/rw_squash 192.168.204.0/24(rw,async,root_squash)
/nfs/ro_squash 192.168.204.0/24(ro,sync,root_squash)
/nfs/rw_no_squash 192.168.204.231(rw,sync,no_root_squash)
/nfs/ro_no_squash 192.168.204.231(ro,sync,no_root_squash)
4-5. NFS 설정 적용
# exportfs -ra
4-6. NFS 설정 확인
# exportfs -v
출력 예시:
/nfs/rw_no_squash 192.168.204.231(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/nfs/ro_no_squash 192.168.204.231(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,no_root_squash,no_all_squash)
/nfs/rw_squash 192.168.204.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/nfs/ro_squash 192.168.204.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
5. 방화벽
5-1. 기존 서비스 확인
# firewall-cmd --list-services
출력 예시:
cockpit dhcpv6-client ntp ssh
5-2. NFS 관련 포트 허용
# firewall-cmd --permanent --add-service=nfs --add-service=rpc-bind --add-service=mountd
# firewall-cmd --reload
5-3. 방화벽 설정 확인
# firewall-cmd --list-services
출력 예시:
cockpit dhcpv6-client mountd nfs ntp rpc-bind ssh
6. NFS 클라이언트
6-1. NFS 패키지 설치
# dnf -y install nfs-utils
6-2. 마운트 포인트 생성
# mkdir -p /nfs/{rw_squash,ro_squash,rw_no_squash,ro_no_squash}
6-3. 수동 마운트
# mount -t nfs -o vers=3,rw,async 192.168.204.230:/nfs/rw_squash /nfs/rw_squash
# mount -t nfs -o vers=3,ro,sync 192.168.204.230:/nfs/ro_squash /nfs/ro_squash
6-4. 자동 마운트
# vim /etc/fstab
설정 예시:
192.168.204.230:/nfs/rw_no_squash /nfs/rw_no_squash nfs rw,async,vers=3 0 0
192.168.204.230:/nfs/ro_no_squash /nfs/ro_no_squash nfs ro,async,vers=3 0 0
# systemctl daemon-reload
# mount -a
6-5. 마운트 확인
# df -Th | grep nfs
출력 예시:
192.168.204.230:/nfs/rw_squash nfs 252G 14G 239G 6% /nfs/rw_squash
192.168.204.230:/nfs/ro_squash nfs 252G 14G 239G 6% /nfs/ro_squash
192.168.204.230:/nfs/rw_no_squash nfs 252G 14G 239G 6% /nfs/rw_no_squash
192.168.204.230:/nfs/ro_no_squash nfs 252G 14G 239G 6% /nfs/ro_no_squash
7. 테스트
7-1. 권한 테스트
root_squash: root 사용자를nobody로 매핑 → 보안 강화no_root_squash: root 그대로 유지 → 테스트 환경 전용
# echo "rw,ro test" >> /nfs/rw_squash/rw_ro_test
# echo "rw,ro test" >> /nfs/rw_no_squash/rw_ro_test
# echo "rw,ro test" >> /nfs/ro_squash/rw_ro_test
출력 예시:
-bash: /nfs/ro_squash/rw_ro_test: Read-only file system
# echo "rw,ro test" >> /nfs/ro_no_squash/rw_ro_test
출력 예시:
-bash: /nfs/ro_no_squash/rw_ro_test: Read-only file system
# ls -al /nfs/rw_squash/rw_ro_test
출력 예시:
-rw-r--r-- 1 nobody nobody 11 Oct 18 16:52 /nfs/rw_squash/rw_ro_test
# ls -al /nfs/rw_no_squash/rw_ro_test
출력 예시:
-rw-r--r-- 1 root root 11 Oct 18 16:52 /nfs/rw_no_squash/rw_ro_test
7-2. 성능 테스트
async는 빠르지만 데이터 유실 가능성 존재sync는 안전하지만 I/O 속도는 느림
# time dd if=/dev/zero of=/nfs/rw_squash/file bs=1M count=100
출력 예시:
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.398387 s, 263 MB/s
real 0m0.426s
user 0m0.000s
sys 0m0.259s
# time dd if=/dev/zero of=/nfs/rw_no_squash/file bs=1M count=100
출력 예시:
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.975371 s, 108 MB/s
real 0m1.005s
user 0m0.000s
sys 0m0.432s