📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 74편
이전 글: 73. SMB와 445 포트 — 내부 확산의 통로 · 다음 글: 75. SNMP 버전별 보안 차이

1. 개념

NFS(Network File System)는 원격 서버의 디렉터리를 로컬 디렉터리처럼 마운트해서 쓰는 파일 공유 프로토콜입니다. 주로 Linux·Unix 서버 사이에서 쓰이며, Windows 중심 환경의 73. SMB와 445 포트 — 내부 확산의 통로와 역할이 비슷합니다.

NFS는 RPC(Remote Procedure Call) 위에서 동작합니다. 그래서 버전에 따라 필요한 포트 수가 크게 다릅니다. NFSv3는 여러 보조 RPC 서비스가 필요하고, NFSv4는 2049번 하나로 동작합니다.

항목NFSv3NFSv4
핵심 포트2049 (TCP/UDP)2049 (TCP)
rpcbind 111필요필요 없음
마운트 절차mountd(별도 RPC 서비스)NFS 프로토콜 안에서 처리
잠금·상태nlockmgr, statd (별도 서비스)프로토콜에 통합
방화벽 설정여러 포트, 일부는 동적2049만 허용하면 됨

2. 동작 원리

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 하나로 전부 ───────→ 서버
  • rpcbind는 RPC 서비스의 포트 안내 창구입니다. 프로그램 번호(예: nfs 100003, mountd 100005)로 질의하면 현재 포트를 알려 줍니다.
  • mountd·nlockmgr·statd는 기본적으로 실행 때마다 포트가 바뀔 수 있어 방화벽 정책이 까다롭습니다. 그래서 설정 파일로 포트를 고정해 운영하는 경우가 많습니다.

3. 주요 특징

NFS와 관련해 서버에서 볼 수 있는 포트입니다.

포트RPC 프로그램버전비고
111 TCP/UDPportmapper (rpcbind)v3 필요서비스·포트 목록을 알려 줌
2049 TCP(UDP)nfsv3, v4실제 파일 입출력
20048 TCP/UDPmountdv3Rocky 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=krb5pUID 신뢰 / Kerberos 인증+암호화sys는 클라이언트가 보낸 UID를 그대로 믿음

4. 예시

실습 예시 — 본인 소유 VM 두 대(서버 192.168.10.40, 클라이언트 192.168.10.60).

항목Rocky LinuxUbuntu
서버 패키지nfs-utilsnfs-kernel-server
클라이언트 패키지nfs-utilsnfs-common
서버 서비스nfs-servernfs-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로 마운트된 화면


5. 보안 관점

  • UID 신뢰(sec=sys): 서버는 클라이언트가 주장하는 UID를 그대로 믿습니다. 허용 대역에 들어온 단말이 있으면 다른 사용자의 파일 권한을 흉내 낼 수 있어, 허용 범위를 좁히는 것이 기본 방어입니다.
  • no_root_squash: 클라이언트 root가 서버 파일을 root 권한으로 만들 수 있어 권한 상승 경로가 됩니다.
  • 정보 노출: 111(rpcbind)이 열려 있으면 어떤 RPC 서비스가 어느 포트에 있는지, mountd가 열려 있으면 공유 경로와 허용 대상이 드러납니다.
  • 평문 전송: sec=krb5p가 아니면 파일 내용이 네트워크에 평문으로 오갑니다.
  • 외부 노출 금지: 111·2049는 인터넷에 열 이유가 거의 없는 내부 전용 포트입니다.

6. SOC 관점

흔적 위치확인할 수 있는 것
방화벽 로그111/2049/mountd 포트 접근 출발지, 허용·차단
IDS/NSMRPC 프로그램 번호 조회, mount 요청, NFS 파일 연산
NFS 서버exportfs -v 설정, 마운트 요청 기록(시스템 로그, 배포판별 상이)
클라이언트mount, /etc/fstab, 마운트 시각

관제자가 확인할 질문

  • 111 또는 2049에 접근한 출발지가 exports 허용 대역·등록된 서버인가?
  • 여러 호스트의 111번을 차례로 조회하는 출발지가 있는가? (내부 정찰, 05 영역 228. 내부망 정찰에서 다룸)
  • 평소 NFS를 쓰지 않는 단말이 마운트를 시도했는가?
  • 짧은 시간에 대량의 읽기 트래픽이 2049에서 나갔는가?

오탐 주의: 백업 서버, 가상화·컨테이너 플랫폼의 공유 스토리지는 2049로 대용량·상시 트래픽을 만듭니다. 스토리지 구성도와 자산 목록을 먼저 확인합니다.


7. 핵심 정리

  • NFS는 RPC 기반 파일 공유이며 실제 입출력은 2049번에서 일어납니다.
  • NFSv3는 rpcbind(111)·mountd·nlockmgr·statd 등 보조 서비스 포트가 필요하고, 일부는 동적으로 바뀔 수 있습니다.
  • NFSv4는 TCP 2049 하나로 동작해 방화벽 관리가 단순합니다.
  • 접근 범위는 /etc/exports가 정하며, sec=sys의 UID 신뢰와 no_root_squash가 주요 위험입니다.
  • 관제에서는 111·2049 접근 출발지를 exports 허용 대역과 대조하고, 외부 노출 여부를 확인합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글