Profile picture

NFS 서버 설치하기

JaehyoJJAng2023년 06월 09일

NFS

유닉스나 리눅스 환경에서는 NFS 서버를 구축하여 서로간의 디렉토리를 손쉽게 공유할 수 있다

이는 네트워크를 이용하여 여러 서바간의 마운트를 통해 마치 하나의 파일 스토리지처럼 사용하는 기술이다

이는 마치 내 PC에서 다른 로컬드라이브에 접근하는 것 처럼, 컴퓨터 네트워크를 통해 마운트된 다른 서버의 드라이브 파일에 액세스할 수 있도록 해준다
image


특징

  • NFS로 공유한 파일은 일반적인 소유권과 접근 권한이 그대로 적용됨
  • 원격으로 접속한 유저가 파일 소유 권한이 있다면, UID를 이용해 파일 조작이 가능
  • 루트의 권한을 갖는 사용자가 해당 공유 디렉토리에서 모두 조작 가능함

실습 개요

네트워크 기반 스토리지를 설치하기 위해 직접 NFS 서버를 구축하여

클라이언트에서 NFS 서버가 제공하는 스토리지를 마운트해보도록 하자.


NFS 구축하기

CentOS

Server 측 설정

1. nfs 설치

# nfs-utils 패키지 있는지 확인
rpm -qa nfs-utils

# nfs-utils 설치
yum install -y nfs-utils

2. NFS 서비스에 이용될 공유 디렉토리 생성

mkdir -p /mnt/nfs-server/data

3. 공유 디렉토리에 권한 설정

chmod 707 -R /mnt/nfs-server

4. /etc/exports 을 아래와 같이 설정

$ vim /etc/exports

# ----- /etc/exports -----
/mnt/nfs-server/data  192.168.121.0/24(rw,sync)

/mnt/nfs-server/data 디렉토리에 대한 접근 권한을 192.168.121.0/24 네트워크 대역에 대해 읽기/쓰기 권한을 줌.


5. nfs 설정 파일 편집 (/etc/sysconfig/nfs)
아래 서비스들 주석 해제

  • LOCKD_TCPPORT = 3280322
  • LOCKD_UDPPORT = 3276957
  • MOUNTD_PORT = 89263
  • STATD_PORT = 662
sed -i '/^#LOCKD_TCPPORT/s/^#//' /etc/sysconfig/nfs
sed -i '/^#LOCKD_UDPPORT/s/^#//' /etc/sysconfig/nfs
sed -i '/^#MOUNTD_PORT/s/^#//' /etc/sysconfig/nfs
sed -i '/^#STATD_PORT/s/^#//' /etc/sysconfig/nfs

6. exports의 수정 내용 반영

exportfs -r # 수정 내용 반영
exportfs -v # NFS 설정 확인
rpcinfo -p  # rpcbind가 사용중인 포트 출력

7. 서비스 가동

systemctl enable --now nfs-server
systemctl enable --now rpcbind

# 서비스 가동 상태 확인
sudo systemctl list-unit-files --type service --state=enabled | grep "nfs"
nfs-server.service                         enabled
nfs.service                                enabled

8. 방화벽 오픈

# TCP: 111,892,2049,32803
firewall-cmd --permanent --zone=public --add-port=111/tcp
firewall-cmd --permanent --zone=public --add-port=892/tcp
firewall-cmd --permanent --zone=public --add-port=2049/tcp
firewall-cmd --permanent --zone=public --add-port=32803/tcp

# UDP: 111,892,2049,32769
firewall-cmd --permanent --zone=public --add-port=111/udp
firewall-cmd --permanent --zone=public --add-port=892/udp
firewall-cmd --permanent --zone=public --add-port=2049/udp
firewall-cmd --permanent --zone=public --add-port=32803/udp

# 방화벽 재시작
firewall-cmd --reload

8. 마운트가 잘 되었는지 테스트

$ showmount -e
Export list for nfs-server:
/mnt/nfs-server/data 192.168.121.*

$ exportfs -v
/mnt/nfs-server/data
		192.168.121.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

Client 측 설정

1. nfs 설치

# nfs-utils 패키지 있는지 확인
rpm -qa nfs-utils

# nfs-utils 설치
yum install -y nfs-utils

2. NFS 서버에 어떤게 마운트 되어있나 확인

showmount -e [NFS 서버의 IP 주소]
showmount -e 192.168.121.130

Export list for 192.168.121.130:
/mnt/nfs-server/data 192.168.121.*

3. 클라이언트에서 해당 서버 디렉토리와 함께 마운트할 디렉토리를 생성

mkdir /home/nfs-client/data

4. 마운트 시키기

# mount -t nfs NFS서버주소:마운트경로 마운트할디렉토리
sudo mount -t nfs 192.168.121.130:/mnt/nfs-server/data /home/nfs-client/data

d

5. 마운트 잘 되었는지 테스트

$ mount | tail -n 1
192.168.121.130:/mnt/nfs-server/data on /home/nfs-client/data type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.121.136,local_lock=none,addr=192.168.121.130)

$ df -h | grep "/home/nfs-client/data"
192.168.121.130:/mnt/nfs-server/data   24G  1.6G   23G   7% /home/nfs-client/data

6. /etc/fstab에 등록

vim /etc/fstab

# --- /etc/fstab ---
192.168.121.130:/home/nfs-server/data /mnt/nfs-client/data nfs sync  0 0

Ubuntu

Server 측 설정

  • NFS 서버 설정

1. 패키지 설치

sudo apt-get update -y
sudo apt-get install -y nfs-kernel-server

2. 공유할 디렉토리 생성 및 설정

공유할 디렉토리의 경우 일반적으로 소유자와 소유그룹을 의사사용자인 nobodynogroup으로 변경한다.

이는 신뢰할 수 없는 클라이언트들에 대응하며, NFS 에서만 사용하도록 권장된다.

일반적인 디렉토리의 권한은 775이며, 클라이언트의 경우 쓰기 권한은 없다.

아래에서 언급할 root_squash 설정을 통해 클라이언트의 rootnobody로 매핑하여 파일쓰기가 가능하다.

예시로 생성할 공유 디렉토리는 /home/dev/myNFS 디렉토리이다.

mkdir -p ~/myNFS
sudo chown -R nobody:nogroup ~/myNFS

3. 권한 설정 후 배포

배포할 디렉토리에 대한 권한 및 설정을 작성하자.

/etc/exports 파일을 수정할건데, 해당 파일은 서버가 클라이언트에 노출하는 모든 디렉토리에 대한 정보를 담는다.

예시에서는 클라이언트 접속 IP 허용 범위를 192.168.219.0/24 대역으로 설정한다.

cat << EOF | sudo tee -a /etc/exports
/home/dev/myNFS 192.168.219.0/24(rw, sync, no_subtress_check)
EOF
옵션 설명
rw, ro 읽기/쓰기, 읽기 전용
sync 변경사항 발생 시 동기적 저장 및 처리
async 데이터의 변경에 대해 비동기적 처리
root_squash 클라이언트의 root 사용자를 root가 아닌 서버의 nobody 유저의 권한으로 처리.
쓰기 작업 시 클라이언트 root로 작업해도 nobody로 작업됨.
no_root_squash 클라이언트의 root 사용자를 root 그대로의 권한 인정. 클라이언트가 생성한 파일의 소유자가 root로 작성됨. (보안에 민감)
all_squash 모든 클라이언트 사용자를 nobody 유저로 매핑시킨다. 클라이언트는 root 권한이 없이 작업하고 이는 nobody 유저의 작업으로 된다.
no_all_squash 공유된 디렉토리의 사용자(서버)와 클라이언트의 사용자가 일치해야한다. uid와 gid가 일치하면 쓰기작업을 할 수 있다.
no_subtree_check 클라이언트가 작업한 내용에 대해 무결성 검사를 하는 하위 트리 검사를 수행하지 않는다.

4. 수정한 권한 및 설정 적용

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

Client 측 설정

1. 공유 된 NFS 디렉토리를 마운트하기 위해 패키지를 설치한다.

sudo apt-get update -y
sudo apt install -y nfs-common

2. 공유 디렉토리 테스트

showmount -e 192.168.219.179 # NFS 서버 IP

# output
Export list for 192.168.219.179:
/home/dev/myNFS 192.168.219.0/24

3. 마운트

임시로 디렉토리를 만들어 NFS 디렉토리를 마운트

mkdir ~/myNFSClient
sudo mount 192.168.219.179:/home/dev/myNFS /home/client/myNFSClient

Loading script...