본문 바로가기

OS/Linux

CentOS 리눅스 NFS서버 구축관리


CentOS 리눅스 NFS서버 구축관리

NFS(Network File System)
다른 호스트에 있는 파일시스템의 일부를 자신의 디렉토리처럼 사용할 수 있도록 해주는 것으로 즉, 하나의 서버에 디스크를 집중관리하고 그것을 공유하여 나머지 시스템들이 사용할 수 있게 해주는 것이다.

NFS설치
rpm명령어를 이용하여 NFS패키지들이 설치되어 있는지 확인.
[root@localhost /]# rpm -qa portmap
portmap-4.0-63
[root@localhost /]# rpm -qa nfs-utils
nfs-utils-1.0.6-84.EL4
만약 설치되어 있지 않다면 yum install portmap nfs-utils를 실행하여 설치.

환경설치
/etc/exports파일 : NFS서버 공유목록을 관리.
[root@localhost home]# vi /etc/exports
/share 118.128.194.84(rw, sync)
위의 설정은 118.128.194.84 호스트에게만 /share 디렉토리를 읽고 쓸수 있게 공유한다는 의미.
(자세한 설정법 976p)

NFS서버 실행
[root@localhost home]# /etc/init.d/portmap start
Starting portmap: [  OK  ]
[root@localhost home]# /etc/init.d/nfs start
Starting NFS services:  [  OK  ]
Starting NFS quotas: [  OK  ]
Starting NFS daemon: [  OK  ]
Starting NFS mountd: [  OK  ]

부팅시 자동시작위해 chkconfig를 이용하여 nfs를 on상태변경
[root@localhost home]# chkconfig nfs on
[root@localhost home]# chkconfig --list |grep nfs
nfslock         0:off   1:off   2:off   3:on    4:on    5:on    6:off
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off

exportfs명령을 이용하여 /etc/exports 파일에 설정한 공유목록이 정상적으로 공유가 되는지 확인.
[root@localhost home]# exportfs -v
/home/casualty  118.128.194.83(rw,wdelay,root_squash)

exportfs명령어는 nfs서버를 다시 시작하지 않고도 공유목록을 수정할 수 있다.
-a : /etc/exports파일을 읽어들인다.
-r : /etc/exports파일을 다시 읽어들인다.
-u ip:/디렉토리 : 입력한 디렉토리를 공유목록에서 제외한다.
-v : 현재의 공유목록을 확인한다.

mount명령어를 이용하여 NFS서버의 공유디렉토리를 사용해보자.
[root@localhost home]# mkdir /mnt/nfs
[root@localhost home]# mount -t nfs 118.128.194.83:/home/casualty /mnt/nfs

만약 마운트가 되지 않는다면 NFS서버의 방화벽사용을 중지한다.
/etc/init.d/iptables stop

[root@localhost home]# cd /mnt/nfs
[root@localhost nfs]# ll
total 28
-rw-r--r--  1 root     root        6 Apr  7 16:14 hello.txt

만약 부팅시 자동으로 마운트해야한다면 /etc/fstab에 추가해준다.

[root@localhost /]# vi /etc/fstab

# This file is edited by fstab-sync - see 'man fstab-sync' for details
LABEL=/1                /                       ext3    defaults        1 1
LABEL=/backup1          /backup                 ext3    defaults        1 2
none                    /dev/pts                devpts  gid=5,mode=620  0 0
none                    /dev/shm                tmpfs   defaults        0 0
LABEL=/home1            /home                   ext3    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /sys                    sysfs   defaults        0 0
LABEL=SWAP-sda5         swap                    swap    defaults        0 0
/dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,managed 0 0
118.128.194.83:/home/casualty /mnt/nfs          nfs     defaults        1 2


재부팅후 정상적으로 마운트 되는지 확인해 본다. 마운트 해제는 간단하다.
[root@localhost /]# umount /mnt/nfs



방화벽설정
NFS를 사용하면 방화벽 설정이 번거로워 방화벽은 끄고 사용하는 경우가 많다.하지만 보안을 위해 간단하게 방화벽을 설정하는 방법을 알아보자. 먼저 NFS에서 사용하는 포트를 알아보자.

 데몬 기본포트   추천포트
 portmap 111  111 
 rpc.statd 랜덤 4000
 rpc.nfs 2049 2049
 rpc.lockd 랜덤 4001
 rpc.mountd 랜덤 4002
 rpc.rquotad 랜덤 4003


위의 표와 같이 기본적으로 NFS포트는 111, 2049를 제외하고 모두 랜덤방식으로 포트가 변경되기 때문에 포트를 고정시켜주어야한다.

먼저 rpcinfo -p를 실행하여 현재 포트를 알아보자.
[root@localhost /]# rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp    801  status
    100024    1   tcp    804  status
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100021    1   udp  32983  nlockmgr
    100021    3   udp  32983  nlockmgr
    100021    4   udp  32983  nlockmgr
    100021    1   tcp  35241  nlockmgr
    100021    3   tcp  35241  nlockmgr
    100021    4   tcp  35241  nlockmgr
    100011    1   udp    780  rquotad
    100011    2   udp    780  rquotad
    100011    1   tcp    783  rquotad
    100011    2   tcp    783  rquotad
    100005    1   udp    786  mountd
    100005    1   tcp    789  mountd
    100005    2   udp    786  mountd
    100005    2   tcp    789  mountd
    100005    3   udp    786  mountd
    100005    3   tcp    789  mountd

위의 포트들은 111번과 2049번을 제외하고 NFS를 재시작 할때마다 포트가 변경되므로 방화벽을 적용하기가 쉽지않다. 그래서 모든 포트를 고정시켜보자.

먼저 /etc/init.d/nfslock파일을 편집하여 rpc.statd의 포트를 4000번으로 설정해보자.
[root@localhost /]# vi /etc/init.d/nfslock
start() {
    if [ ! -f /var/lock/subsys/nfslock ]; then
        # Start daemons.
        if [ "$USERLAND_LOCKD" ]; then
          echo -n $"Starting NFS locking: "
          daemon rpc.lockd
          echo
        else
        # See if the kernel lockd should start up
        # listening on a particular port
        #
                LOCKDARG=""
                [ -n "$LOCKD_TCPPORT" ] && LOCKDARG="nlm_tcpport=$LOCKD_TCPPORT"
                [ -n "$LOCKD_UDPPORT" ] && \
                        LOCKDARG="$LOCKDARG nlm_udpport=$LOCKD_UDPPORT"
                [ -n "$LOCKDARG" ]  && \
                        modprobe lockd $LOCKDARG
        fi
        echo -n $"Starting NFS statd: "
        # See if a statd's ports has been defined
        [ -n "$STATD_PORT" ] && STATDARG="$STATDARG -p $STATD_PORT"
        [ -n "$STATD_OUTGOING_PORT" ] \
                && STATDARG="$STATDARG -o $STATD_OUTGOING_PORT"
        # See if we have an HA-callout program specified
        [ -n "$STATD_HA_CALLOUT" ] \
                && STATDARG="$STATDARG -H $STATD_HA_CALLOUT"
        daemon rpc.statd -p 4000
        daemon rpc.statd "$STATDARG"
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/nfslock
    fi
    return $RETVAL
}

daemon rpc.statd 부분을 daemon rpc.statd -p 4000로 수정한다.
이제 /etc/sysconfig/nfs파일을 생성하여 rpc.lockd과 rpc.mountd의 포트를 각각 4001번 4002번으로 설정한다.

[root@localhost /]# vi /etc/sysconfig/nfs
LOCKD_TCPPORT=4001
LOCKD_UDPPORT=4001
MOUNTD_PORT=4002

그리고 마지막으로 /etc/service파일을 열어 아래와 같이 기존에 설정되어있는 4003포트를 주석으로 설정하고 rquotad를 추가해 준다.
rquotad         4003/tcp                        # rpc.rquotad tcp port
rquotad         4003/udp                        # rpc.rquotad udp port

이제 NFS를 다시 시작하여 변경한 포트가 적용되는지 확인해 본다.
[root@localhost /]# /etc/init.d/nfslock restart
Stopping NFS locking: [  OK  ]
Stopping NFS statd: [  OK  ]
Starting NFS statd: [  OK  ]
[root@localhost /]# /etc/init.d/nfs restart
Shutting down NFS mountd: [  OK  ]
Shutting down NFS daemon: [  OK  ]
Shutting down NFS quotas: [  OK  ]
Shutting down NFS services:  [  OK  ]
Starting NFS services:  [  OK  ]
Starting NFS quotas: [  OK  ]
Starting NFS daemon: [  OK  ]
Starting NFS mountd: [  OK  ]

이제 변경된 포트가 적용되는지 확인해 보자.
[root@localhost /]# rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100021    1   udp  32983  nlockmgr
    100021    3   udp  32983  nlockmgr
    100021    4   udp  32983  nlockmgr
    100021    1   tcp  35241  nlockmgr
    100021    3   tcp  35241  nlockmgr
    100021    4   tcp  35241  nlockmgr
    100024    1   udp   4000  status
    100024    1   tcp   4000  status
    100011    1   udp   4003  rquotad
    100011    2   udp   4003  rquotad
    100011    1   tcp   4003  rquotad
    100011    2   tcp   4003  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100005    1   udp   4002  mountd
    100005    1   tcp   4002  mountd
    100005    2   udp   4002  mountd
    100005    2   tcp   4002  mountd
    100005    3   udp   4002  mountd
    100005    3   tcp   4002  mountd

우리가 지정한 포트로 실행이 되었다. 이제 위의 포트들을 iptables를 이용하여 열어주자.
/etc/sysconfig/iptables 파일을 아래와 같이 추가한다.
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4000:4004 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 4000:4004 -j ACCEPT

111번, 2049, 4000~4003번까지 tcp,udp포트를 허용해준다. 그리고 iptables를 다시 시작한다.

[root@localhost /]# /etc/init.d/iptables  restart
Flushing firewall rules: [  OK  ]
Setting chains to policy ACCEPT: filter [  OK  ]
Unloading iptables modules: [  OK  ]
Applying iptables firewall rules: [  OK  ]

이제 방화벽을 적용하여 NFS서버를 운영할 수 있다.