OS/LINUX2005. 2. 15. 01:00
반응형

[출처:http://www.linuxcenter.or.kr]

1. 개요

1.1 개 념

NFS(Network File System)란 랜 등 정보 통신 네트워크에 접속되어 있는 다른 컴퓨터에 있는 파일이나 파일 시스템을 공유하기 위한 분산 파일 공유 시스템 소프트웨어로 정의되어 있다. 1985년에 미국의 선 마이크로시스템즈사가 개발하였는데, 그 유용성 때문에 많은 시스템에서 이용할 수 있어 업계 표준과 같이 되어 있다. NFS는 개발사인 선 마이크로시스템즈사의 등록 상표이다.

현재의 컴퓨팅 환경은 많은 사용자들이 네트워크와 접속되어 있으며, 이에 따른 파일시스템의 이용 필요성이 급증하고 있다. 그러므로 NFS를 사용하여 서버를 구축하고 이를 적절히 활용하여 가격이 저렴해진 저장공간을 활용하고 있다. 하지만 이 서비스 자체는 보안에 문제의 소지가 있으므로 제한적인 용도로 사용하기를 바란다.

(NFS)은 네트워크를 통해 파일을 공유할 수 있도록 만들어진 프로토콜이다. NFS는 하드웨어, 운영체제 또는 네트워크 구조가 달라도 파일을 공유할 수 있도록 고안되었으며, 파일공유 등을 비롯해 다른 부가기능을 제공한다. 그러나 서비스 자체의 보안 문제과 공유 파일의 보안 문제가 발생할 소지가 있으며, 특히 다른 시스템이 재부팅을 하거나 꺼지게 되면 다른 컴퓨터에 오류가 생기거나 심지어 멈춰버릴 수 있는 단점을 갖기 때문에 제한적인 용도로 사용된다. 사용하는 프로토콜은 NLM(Network Lock Manager)과 NSM(Network Status Monitor)이다.


2. 설정

2.1 설치 전 준비사항

NFS 서버를 운영하려면 가장 먼저 커널레벨에서 NFS 지원 옵션이 선택되어야 한다.

 

Filesystems -> Network File System -> NFS server support(NEW)

이 옵션을 확인하기 위해서는 다음의 옵션이 선택되어야 한다.

 

Code maturity level options

-> Prompt for development and/or incomplete code/drivers 

이 기능 역시 모듈 혹은 커널 내부에 정적으로 설정할 수 있다. 이러한 옵션을 선택하고 정상적으로 커널 컴파일이 이루어졌다면 새로 컴파일한 커널을 기반으로 재부팅 후 데몬을 설정한다.

NFS 데몬을 설정하기 전에 포트맵(portmap)이라는 프로그램이 필요한데 이것은 NFS의 독특한 서비스 구성 때문이다. 일반적인 서버의 경우 데몬이 특정 포트로 신호가 들어오는가를 대기하고 있다가 신호가 들어오면 시스템이 응답하는데 반하여 NFS의 경우에는 포트맵이라는 프로그램이 포트 111번에서 대기하고 있다가 신호가 오면 데몬을 호출하여 연결을 시작하기 때문에 NFS를 설치하기 전에 반드시 포트맵을 설치해야 한다.

2.1 설정 파일

(1) /etc/hosts 

원할한 시스템 사용을 위하여 /etc/hosts에 NFS를 사용할 각 시스템의 항목을 등록해 주는 것이 좋다.

[root@ksw /root]# vi /etc/hosts

# Do not remove the following line, or various programs 

# that require network functionality will fail. 

127.0.0.1             nfs localhost.localdomain        localhost 

218.49.223.155               nfs linuxman.localdomain        linuxman 

218.49.223.154               client ksw.localdomain 

(2) /etc/exports

이 파일은 NFS가 소유 파티션의 어느 부분을 외부로부터 액세스 허용할 것인지를 정의한다. 이 파일의 정의는 다음과 같이 진행한다. 현재 클라이언트에게 임의의 1개 디렉토리를 읽기/쓰기 권한으로 부여하고 싶다면 다음과 같은 형식으로 설정한다. 이때 /home 디렉토리 밑에 test라는 디렉토리를 생성해야 한다.

 

# /etc/exports

/home/test 218.49.223.154(rw,no_root_squash) 

기본적으로는 /etc/exports 파일은 생성되어 있지만 내용은 전혀 없기 때문에 원하는 형식으로 설정해야 한다. #으로 시작하는 부분은 주석으로 무시된다. 만약 여러 개의 클라이언트에게 파일 공유를 설정하려면 다음과 같이 한다.

 

# /etc/exports

/home/test 218.49.223.154(rw,no_root_squash) linuxer(rw,no_root_squash) 

sinyoung(ro,no_root_squash) www.linuxcenter.or.kr(rw,no_root_squash)  

이때 스페이스(space)로 서로 다른 클라이언트를 지정하면 된다. 또한 로컬로 연결된 곳외의 원격지는 도메인명이나 IP주소만 적어주면 똑같이 사용할 수 있다.

문법은 매우 간단한데 개략적으로 살펴보면 다음과 같다. 가장 앞부분에 지정하는 것이 제공할 디렉토리이고 그 다음에 위치하는 것이 접근을 허용할 호스트의 이름 혹은 인터넷 주소이다. 이 주소 부분은 직접 IP를 지정하여 사용하거나 도메인 이름을 사용할 수도 있다. 마지막으로 ( ) 안에 들어 있는 부분은 옵션이며, 그 내용은 다음 표와 같다. 이때, 각각의 옵션은 NFS의 버전에 따라 기본값이 약간씩 다르기 때문에 유의하기 바란다.

 

옵 션

기        능

rw/ro

rw는 읽기/쓰기를 가능하게 하는 옵션이며, ro는 읽기 전용으로 설정하는 옵션이다.

root_squash

모든 클라이언트는 루트(uid/gid=0)가 부여한 익명 사용자 UID/GID로 접근하게 된다. 기본값으로 적용되어 있으며, 클라이언트상에서 루트의 권한을 가지고 있는 사용자라 하더라도 권한의 변경이 되지 않는다. 일반적으로는 원격 루트가 시스템을 관리할 수 있도록, no_root_squash 옵션을 사용하는 것이 일반적이다.

squash_uid

접속에 사용될 특정한 uid를 설정한다.

squash_gid

접속에 사용될 특정한 gid를 설정한다.

all_squash

이 옵션을 사용하게 되면 익명 uid,gid로 전환한다.

noaccess

하위 디렉토리에서 몇몇 디렉토리를 제외하고자 할 때 사용되는옵션이다.

link_relative

모든 심볼릭 링크를 변환한다.


3. 실행

3.1 데몬 실행

파일 설정이 모두 완료되었다면 이를 적용하기 위해 포트맵 데몬과 NFS 데몬을 재구동해야 한다.

 

[root@ksw /root]# /etc/rc.d/init.d/portmap restart

[root@ksw /root]# /etc/rc.d/init.d/nfs restart 

3.2 클라이언트 실행

(1) 클라이언트에서 마운트

클라이언트 개념에서는 NFS를 이용하기 위한 다른 동작은 없으며, 접근하고자 하는 서버의 하드가 자신의 시스템에 부착될 수 있도록만 하면 된다. 즉 유닉스나 리눅스 시스템의 모든 장치는 파일로 인식되기 때문에 마운트를 해야 한다. 그러나 마운트를 위한 서버 시스템에서 클라이언트에게 NFS 서비스 디렉토리를 허용하지 않는다면 클라이언트는 NFS를 이용할 수 없다. 만약 이런 제한 조건이 없다면 클라이언트는 단지 마운트만 하면 손쉽게 NFS를 이용할 수 있다.

(2) 마운트

클라이언트에서도 앞에서 수행하였던 커널에서의 NFS 클라이언트 지원 옵션이 지원된다는 전제로 설명하도록 하겠다. 클라이언트에서는 아주 간단히 사용할 수 있는데, 다음과 같은 명령을 루트의 권한으로 입력한다.

 

[root@ksw /root]# mount -t nfs -o timeo=10 218.49.223.155:/home/test /mnt/test

위의 명령을 사용하면 /mnt/test 디렉토리에 원격서버(218.49.223.155)의 /home/test 디렉토리가 마운트된다. 위의 옵션을 개별적으로 살펴보면 -t는 파일시스템의 형식이 nfs라는 것을 알려주는 옵션이고, -o 는 timeout 값을 지정하는 옵션이다. NFS는 네트워크를 기반으로 파일시스템을 제공하는 서비스이기 때문에, 네트워크의 상황이 나쁠 경우 무작정 기다린다면 네트워크의 장애를 일으킬 수 있다. 따라서 이러한 옵션 값 설정을 통해 조절한다.

NFS에 관련된 마운트 명령의 옵션을 간단히 살펴보면 다음과 같다.


1) rsize=n

NFS 서버로부터 읽어들이는 바이트 수를 지정한다. 기본값은 커널에 따라 다른데, 기본값은 1024 바이트이다.

2) wsize=n

NFS 서버에 쓰기를 할 때 사용하는 바이트 수를 정한다. 기본값은 커널에 따라 다른데 기본값은 1024 바이트이다.

3) timeo=n

RPC(Remote Procedure Call) 타임아웃이 발생한 이후 첫번째 재전송 요구를 보낼 때 사용되는 시간으로서, 1/10 초 단위이다. 기본값은 0.7 초이다. 첫 번째 타임아웃이 생기고 나서는 타임아웃 시간의 최대치인 60초에 이르거나 너무 많은 재전송 요구가 발생될 때까지 타임아웃 시간이 2 배로 변화한다. 이것은 네트워크 트래픽을 감소시키기 위한 방법으로 네트워크 속도가 느리거나 서버 자체가 느린 경우나 여러 개의 라우터와 게이트웨이를 경우할 경우에는 마운트 당시 타임아웃 시간을 늘려주는 것이 좋다.

4) retrans=n

타임아웃을 발생시키는 재전송 횟수를 설정한다. 기본값은 3번의 타임아웃으로 타임아웃이 일어나면 파일작업이 중지되거나 콘솔 상에 "server not responding"이라는 메시지가 출력된다.

5) acregmin=n

서버에게 최신 정보를 요청하기에 앞서 일반 파일 속성이 임시로 저장되어야 할 최소값을 설정한다. 기본값은 3초이다.

6) acregmax=n

서버에게 최신 정보를 요청하기에 앞서 일반 파일 속성이 임시로 저장되어야 할 최대값을 설정한다. 기본값은 60초이다.

7) acdirmin=n

서버에게 최신 정보를 요청하기에 앞서 디렉토리의 속성이 임시로 저장되어야 할 최소값을 설정한다. 기본값은 30초이다.

8) acdirmax=n

서버에게 최신 정보를 요청하기에 앞서 디렉토리의 속성이 임시로 저장되어야 할 최대값을 설정한다. 기본값은 60초이다.

9) actimeo=n

이 값을 다음 acregmin, acregmax, acdirmin와 acdirmax에 똑같이 적용한다. 기본값은 없다.

10) retry=n

백그라운드에서 진행중인 NFS 마운트 작업이 포기될 때까지 실행할 횟수를 설정한다. 기본값은 10000 번이다.

11) namlen=n

NFS 서버가 RPC 마운트 프로토콜의 버전 2를 지원하지 않을 때 원격 파일시스템에서 지원되는 파일명의 길이를 명시한다. POSIX pathconf 함수를 지원하기 위해 사용된다. 기본값은 255 개의 문자이다.

12) port=n

NFS 서버와 연결할 수 있는 포트번호를 설정한다. 만약 0(기본값)이라면 원격 호스트의 포트맵에게 질의하여 알아내도록 한다. 만약 포트맵에 NFS 데몬이 등록되어 있지 않은 경우에는 2049라는 표준 NFS 포트번호가 사용된다.

12) mountport=n

mountd 포트번호를 지정한다.

13) mounthost=name

mountd를 실행중인 호스트 이름을 설정한다.

14) mountprog=n

원격 호스트의 마운트 데몬과 접속하기 위해 사용할 수 있는 별도의 RPC 프로그램 번호를 설정한다. 만약 여러 개의 NFS 서버를 운영하고 있을 때 사용한다. 기본값은 표준 RPC 마운트 데몬 프로그램 번호인 100005이다.

15) mountvers=n

원격 호스트의 마운트 데몬과 접속하기 위해 사용하는 별도의 RPC 버전 번호를 명시한다. NFS 서버를 여러 개 운영하고 있을 때 사용한다. 기본값은 버전 1이다.

16) nfsprog=n

원격 호스트의 NFS 데몬과 접속하기 위해 사용하는 별도의 RPC 프로그램 번호를 설정한다. NFS 서버를 여러 개 운영하고 있을 때 사용한다. 기본값은 표준 RPC NFS 데몬 프로그램 번호인 100003이다.

17) nfsvers=n

원격 호스트의 NFS 데몬과 접속하기 위해 사용하는 별도의 RPC 버전 번호를 설정한다. NFS 서버를 여러 개 운영하고 있을 때 사용한다. 기본값은 버전 2이다.

18) bg

첫번째 NFS 마운트 시도가 타임아웃 되면 백그라운드에서 실행을 계속한다. 기본값은 fg로 설정되어 있다.

19) fg

첫번째 NFS 마운트 시도가 타임아웃 되면 그 즉시 포기해 버린다. 기본값이다.

20) posix

POSIX 규칙을 사용하여 NFS 파일시스템을 마운트한다. 파일 이름의 최대 길이에 대하여 POSIX pathconf 함수를 제대로 지원하기 위해 사용된다. 원격 호스트는 RPC 마운트 프로토콜 버전 2를 지원해야 한다.

21) nocto

파일이 생성될 때 새로운 속성을 가져오지 않도록 한다.

22) noac

모든 속성에 대한 캐시를 해제한다. 서버 효율을 떨어뜨리지만 두 개의 다른 NFS 클라이언트로 하여금 서버상의 공통 파일시스템에 쓰기작업을 할 때 효율이 좋아진다.

23) tcp

NFS 파일시스템을 기본값인 UDP가 아니라 TCP 프로토콜을 사용하여 마운트한다. 대부분의 NFS 서버는 오직 UDP만을 지원한다.

24) udp

NFS 파일시스템을 UDP 프로토콜로 마운트한다. 기본값이다.

수치값을 동반하지 않는 단독 옵션들은 no를 앞에 붙이는 형태로 사용할 수 있다. 예를 들어 nointr이라는 옵션은 파일작업을 가로챌 수 없도록 한다.

(3) 자동 마운트

만약, 특정한 사용자에게 임의의 디렉토리에 대한 공유를 허용하고자 한다면 서버 상의 설정파일인 /etc/exports를 다음과 같이 설정한다. 즉, 서버 상의 /home/ksw 디렉토리를 ksw라는 사용자의 /mnt/ksw 디렉토리에서 사용하도록 설정하는 것으로 이때 ksw라는 사용자의 uid와 gid는 각각 501이라고 가정한다.

 

# /etc/exports

/home/ksw 192.168.1.2(rw,no_root_squash,squash_uid=501,squash_gid=501) 

클라이언트가 부팅할 때마다 자동적으로 이러한 동작을 수행하도록 하고 싶다면 /etc/fstab에 다음 항목을 추가한다.

 

/192.168.1.13:/home/ksw /mnt/ksw nfs rw,squash_uid=501,squash_gid=501 1 1

이제 클라이언트가 구동될 때마다 자연스럽게 /mnt/ksw에 원격 디렉토리가 마운트된다.


4. 유틸리티

4.1 showmount

mount 데몬에 NFS 서버에 대해 질의하여 사용중인 상태를 표시하는 명령어로 옵션없이 사용하면, 해당 호스트에 접속한 사용자를 볼 수 있다. showmount는 사용자를 기준으로 정렬되어 출력된다. 옵션은 다음과 같다.

 

옵 션

기        능

-a, --all

클라이언트의 호스트 이름과 마운트된 디렉토리를 호스트:디렉토리 포맷으로 출력

-d, --directories

클라이언트에서 사용하는 디렉토리 이름만을 출력

-e, --exports

NFS 서버의 export 항목의 리스트를 출력

-h, --help

간단한 도움말을 출력

-v, --version

현재 사용중인 showmount의 버전 정보를 출력

--no-headers

출력에서 요약정보를 생략하고 출력

4.2 nfsstat

NFS 서버와 클라이언트의 동작상태를 보여주는 유틸리티이다. 옵션은 다음과 같다.

 

옵 션

기        능

-c

클라이언트의 상태만을 출력

-s

서버측의 상태만을 출력

-W

출력을 조정하는 옵션으로 일반적으로 -c -s와 함께 사용

-w

일정한 지연시간을 갖고 nfs서버와 클라이언트의 상태 출력

4.2 nhfsstone

NFS를 벤치마킹하기 위한 프로그램으로 시간당 부하 수, 전송율, 실패율 등의 NFS와 관련된 데이터를 제공한다. 이 프로그램은 NFS를 벤치마킹하기 위해 만들어진 프로그램이기 때문에 다른 종류의 파일시스템에서는 적용할 수 없다. 옵션은 다음과 같다.

 

옵 션

기        능

-v

자세한 정보 출력

-t

실행시간에 대한 초단위의 설정

-c

NFS에 발생시킬 요청의 총 개수

-l

초당 NFS에 호출을 발생시킬 부하의 개수(기본값은 30)

5. 보안

NFS를 이용해 외부에 있는 하드디스크를 자신의 하드디스크처럼 사용할 수 있다는 것은 매우 편리한 일이다. 그러나 NFS가 네트워크를 기반으로 만들어졌기 때문에 보안적으로도 치명적인 부분을 내재하고 있다.

따라서 NFS는 서버는 클라이언트와 신뢰를 갖고 구축해야 한다. 만약 외부 침입자가 서버의 exports 파일을 볼 경우, 침입자는 자신의 머신을 NFS로 마운트하여 정보를 빼내갈 수 있다. 이런 문제를 봉쇄하기 위해 위에서 설명한 여러 옵션들을 적절하게 설정해야 한다. 일단 침입자가 마운트에 성공하면 침입자는 고의적으로 용량이 큰 파일을 빼가거나 넣음으로써 서버를 비롯한 클라이언트까지 네트워크에 부하를 증가시켜 전체 네트워크를 다운시킬 수도 있다. 관리자는 이러한 문제가 일어나지 않도록 exports 파일을 잘 관리해야 한다.

기본적으로 TCP Wrapper를 이용하는데 hosts.deny에 rpc.mountd와 portmap을 모두 금지시키고 hosts.allow에 공유를 허용할 호스트를 입력하여 최소한의 보안기능을 유지한다.

반응형
Posted by [PineTree]