Profile picture

[CentOS / Ubuntu] 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...