📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 74편
이전 글: 73. SMB와 445 포트 — 내부 확산의 통로 · 다음 글: 75. SNMP 버전별 보안 차이
NFS(Network File System)는 원격 서버의 디렉터리를 로컬 디렉터리처럼 마운트해서 쓰는 파일 공유 프로토콜입니다. 주로 Linux·Unix 서버 사이에서 쓰이며, Windows 중심 환경의 73. SMB와 445 포트 — 내부 확산의 통로와 역할이 비슷합니다.
NFS는 RPC(Remote Procedure Call) 위에서 동작합니다. 그래서 버전에 따라 필요한 포트 수가 크게 다릅니다. NFSv3는 여러 보조 RPC 서비스가 필요하고, NFSv4는 2049번 하나로 동작합니다.
| 항목 | NFSv3 | NFSv4 |
|---|---|---|
| 핵심 포트 | 2049 (TCP/UDP) | 2049 (TCP) |
| rpcbind 111 | 필요 | 필요 없음 |
| 마운트 절차 | mountd(별도 RPC 서비스) | NFS 프로토콜 안에서 처리 |
| 잠금·상태 | nlockmgr, statd (별도 서비스) | 프로토콜에 통합 |
| 방화벽 설정 | 여러 포트, 일부는 동적 | 2049만 허용하면 됨 |
NFSv3에서 클라이언트가 마운트하는 과정은 "어느 포트에 있는지 묻고 → 찾아가는" 2단계입니다.
클라이언트 192.168.10.60 NFS 서버 192.168.10.40
│ ① rpcbind(111)에 질문: "mountd는 몇 번 포트?" ──→ │ rpcbind 111
│ ←───────────────── "mountd = 20048" ──────────── │
│ ② mountd(20048)에 마운트 요청 + 경로 ─────────────→ │ /etc/exports 확인
│ ←──── 허용 여부 + 파일 핸들(루트 디렉터리 식별자) ─── │
│ ③ nfs(2049)로 파일 읽기·쓰기 (파일 핸들 사용) ────→ │ nfsd 2049
│ ④ 잠금이 필요하면 nlockmgr·statd 포트로 추가 통신 │
↓ ↓
NFSv4: 클라이언트 ─────── 2049/TCP 하나로 전부 ───────→ 서버
NFS와 관련해 서버에서 볼 수 있는 포트입니다.
| 포트 | RPC 프로그램 | 버전 | 비고 |
|---|---|---|---|
| 111 TCP/UDP | portmapper (rpcbind) | v3 필요 | 서비스·포트 목록을 알려 줌 |
| 2049 TCP(UDP) | nfs | v3, v4 | 실제 파일 입출력 |
| 20048 TCP/UDP | mountd | v3 | Rocky firewalld의 mountd 서비스 기준 값. 배포판·설정에 따라 다름 |
| 동적 또는 고정 | nlockmgr, status(statd) | v3 | /etc/nfs.conf 등에서 고정 가능 |
노출 범위를 정하는 것은 /etc/exports입니다. 포트가 열려 있어도 exports가 허용한 클라이언트만 마운트할 수 있습니다.
| 옵션 | 의미 | 보안 관점 |
|---|---|---|
192.168.10.0/24(...) | 허용 클라이언트 범위 | *(전체)는 노출 위험 |
ro / rw | 읽기 전용 / 읽기·쓰기 | 필요 없으면 ro |
root_squash (기본값) | 클라이언트 root를 익명 사용자로 매핑 | 유지 권장 |
no_root_squash | 클라이언트 root를 서버 root로 인정 | 위험 설정 |
all_squash | 모든 사용자를 익명으로 매핑 | 공용 공유에 적합 |
sec=sys / sec=krb5p | UID 신뢰 / Kerberos 인증+암호화 | sys는 클라이언트가 보낸 UID를 그대로 믿음 |
실습 예시 — 본인 소유 VM 두 대(서버 192.168.10.40, 클라이언트 192.168.10.60).
| 항목 | Rocky Linux | Ubuntu |
|---|---|---|
| 서버 패키지 | nfs-utils | nfs-kernel-server |
| 클라이언트 패키지 | nfs-utils | nfs-common |
| 서버 서비스 | nfs-server | nfs-kernel-server |
| 방화벽 | firewall-cmd --add-service={nfs,rpc-bind,mountd} | ufw allow from 192.168.10.0/24 to any port 2049 등 |
# 서버: exports 예시 (/etc/exports 한 줄)
# /srv/share 192.168.10.0/24(ro,sync,root_squash)
sudo exportfs -ra # exports 다시 읽기
sudo exportfs -v # 적용된 옵션 확인
# 서버: 포트와 RPC 서비스 확인
sudo ss -tulnp | grep -E ':(111|2049|20048) '
rpcinfo -p localhost
# 클라이언트: 공유 목록 조회(v3 mountd 이용)와 마운트
showmount -e 192.168.10.40
sudo mount -t nfs 192.168.10.40:/srv/share /mnt
nfsstat -m # 마운트된 NFS 버전·옵션 확인
rpcinfo -p 출력 형식 예시(값은 환경마다 다름, 일부 생략):
program vers proto port service
100000 4 tcp 111 portmapper
100005 3 tcp 20048 mountd
100003 4 tcp 2049 nfs
100021 4 tcp 39511 nlockmgr
100024 1 tcp 47213 status
nlockmgr·status처럼 큰 번호의 포트는 고정하지 않으면 재시작 때 바뀔 수 있습니다. NFSv4만 쓰는 환경에서는 showmount -e가 동작하지 않을 수 있는데, v4는 mountd를 쓰지 않기 때문입니다.
📷 [실습 화면 삽입 위치]
rpcinfo -p결과와nfsstat -m에서 vers=4.x로 마운트된 화면
sec=krb5p가 아니면 파일 내용이 네트워크에 평문으로 오갑니다.| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 방화벽 로그 | 111/2049/mountd 포트 접근 출발지, 허용·차단 |
| IDS/NSM | RPC 프로그램 번호 조회, mount 요청, NFS 파일 연산 |
| NFS 서버 | exportfs -v 설정, 마운트 요청 기록(시스템 로그, 배포판별 상이) |
| 클라이언트 | mount, /etc/fstab, 마운트 시각 |
관제자가 확인할 질문
오탐 주의: 백업 서버, 가상화·컨테이너 플랫폼의 공유 스토리지는 2049로 대용량·상시 트래픽을 만듭니다. 스토리지 구성도와 자산 목록을 먼저 확인합니다.
/etc/exports가 정하며, sec=sys의 UID 신뢰와 no_root_squash가 주요 위험입니다.