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서버를 운영할 수 있다.