• 맑음동두천 2.1℃
  • 맑음강릉 5.9℃
  • 맑음서울 3.7℃
  • 구름조금대전 2.9℃
  • 구름많음대구 7.1℃
  • 흐림울산 8.7℃
  • 구름조금광주 5.9℃
  • 흐림부산 10.3℃
  • 구름많음고창 3.8℃
  • 흐림제주 10.0℃
  • 구름조금강화 1.8℃
  • 구름많음보은 2.4℃
  • 구름많음금산 4.4℃
  • 흐림강진군 7.3℃
  • 구름많음경주시 7.7℃
  • 구름많음거제 9.6℃
기상청 제공

nfs 포트고정시키기(방화벽 사용을 위함)

출처는 http://www.ysy2080.com/uribury/1170


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

1) nfs설정을 시작하기전에 nfs패키지들이 설치되어있는지 확인해보자

rpm -qa portmap

rpm -qa nfs-utils

대부분 설치되어있으며, 설치가 안되어있을경우 간단히 yum install portmap nfs-utils

2)portmap과 nfs를 시작한다
/etc/init.d/portmap start
/etc/init.d/nfs start
※반드시 portmap부터 시작 후 nfs를 시작해야 된다
nfs부터 시작 할 경우
NFS 쿼터를 시작 중: 서비스를 등록할 수 없습니다: RPC: 받을 수 없음; errno = 연결이 거부됨
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp 에러메시지 출력됨


3) NFS 서버의 공유 목록을 관리하는 파일은 /etc/exports 파일이다. 이 파일을 편집하여 공유 목록을 관리하게 된다.

설정형식 : 공유디렉토리                     접근할 호스트(옵션)

ex) /backup   121.156.48.157(rw,all_squash)
/backup디렉토리를 클라이언트(121.156.48.157) IP에서 접급할 수 있다

설정옵션
rw : 읽기, 쓰기 가능
ro : 읽기만 가능
secure : 클라이언트 마운트 요청시 포트를 1024 이하로 한다.
noaccess : 엑세스 거부
root_squach : 클라이언트의 root가 서버의 root 권한을 획득하는 것을 막는다.
no_root_squash : 클라이언트의 root와 root를 동일하게 한다.
sync : 파일 시스템이 변경되면 즉시 동기화 한다.
all_squach : root를 제외하고 서버와 클라이언트의 사용자를 동일한 권한으로 설정 한다.
no_all_squach : root를 제외하고 서버와 클라이언트의 사용자들을 하나의 권한을 가지도록 설정한다.

부팅시 자동으로 올라오도록 설정
chkconfig --level 3 nfs on
chkconfig --level 3 portmap on

exportfs 명령어를 이용하여 /etc/exports 파일에 설정한 공유 목록이 정상적으로 공유가 되는지 확인
[root@ns etc]# exportfs -v
/backup         121.156.48.157(rw,wdelay,root_squash,all_squash,no_subtree_check,anonuid=65534,anongid=65534)

4) nfs포트는 portmap(111)과 rpc.nfs(2049)를 제외하고서는 모두 랜덤방식으로 포트가 변경되기때문에 방화벽을 사용 할 경우 포트를 고정시켜주어야 한다. (참골치아프다 --'')

현재포트를 확인하려면 rpcinfo -p로 확인 할 수있다. 랜덤으로 되어있을텐데 귀찮게 뭐하러 확인하나;;;

portmap(111) rpc.nfs(2049)를 제외한 나머지 포트는 고정시키자
rpc.statd 4000
rpc.lockd 4001
rpc.mountd 4002
rpc.rquotad 4003
포트번호는 상관없으나 대부분이렇게 고정하므로 나역시도...

rpc.statd포트를 4000번으로 고정
/etc/init.d/nfslock에서 74번줄을 변경
  # See if we have an HA-callout program specified
  [ -n "$STATD_HA_CALLOUT" ]
    && STATDARG="$STATDARG -H $STATD_HA_CALLOUT"
  daemon rpc.statd -p 4000  <---이 부분

/etc/sysconfig/nfs 파일에서(없으면 생성 할 것!!) rpc.lock과 rpc.mountd포트를 등록한다
LOCKD_TCPPORT=4001
LOCKD_UDPPORT=4001
MOUNTD_PORT=4002


/etc/services에서 4003포트를 rquotad로 변경
ex)
rquotad 4003/tcp          # rpc.rquotad tcp port
rquotad 4003/udp          # rpc.rquotad udp port

nfs를 다시시작하여 적용되었는지 확인 (netstat는 길어서 생략)
[root@ns etc]# rpcinfo -p
   프로그램 버전 원형   포트
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp   4000  status
    100024    1   tcp   4000  status
    100011    1   udp   4003  rquotad
    100011    2   udp   4003  rquotad
    100011    1   tcp    615  rquotad
    100011    2   tcp    615  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100021    1   udp   4001  nlockmgr
    100021    3   udp   4001  nlockmgr
    100021    4   udp   4001  nlockmgr
    100021    1   tcp   4001  nlockmgr
    100021    3   tcp   4001  nlockmgr
    100021    4   tcp   4001  nlockmgr
    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에 4000 ~ 4004번까지 tcp,udp를 등록해주자

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 4000:4004 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 4000:4004 -j ACCEPT

등록을 마쳤으면 당연히 방화벽재시작

5) 드디어 설정은 끝났다 알고나면 설정도 별건아닌거 같다 (뭐든지 알고나면 별거 아니라는...)
※클라이언트서버도 portmap을 실행시켜주어라!!

mount -t nfs 222.122.13.146:/backup /home/ysy2080/nfs

Filesystem            Size  Used Avail Use% Mounted on
/dev/hda2             2.0G  624M  1.3G  34% /
/dev/hda1              99M   36M   59M  38% /boot
tmpfs                 252M     0  252M   0% /dev/shm
/dev/hda9              12G  1.2G  9.5G  11% /home
/dev/hda8             996M   34M  911M   4% /tmp
/dev/hda7             7.6G  2.5G  4.8G  34% /usr
/dev/hda6             7.6G  2.0G  5.3G  27% /usr/local
/dev/hda5             7.6G  1.1G  6.2G  15% /var

222.122.13.146:/backup
                      147G  3.6G  136G   3% /home/ysy2080/nfs

드디어 성공!!

※ mount시 error

mount: mount to NFS server '222.122.13.146' failed: RPC Error: Program not registered.

2시간만에 구글링으로 알아냈다....;;;

hosts.allow hosts.deny파일이 604이상이 되야된다;;;



NFS 주요 데몬
rpc.mountd
* NFS 마운트 데몬이다.
* /etc/exports 설정에 따라 클라이언트의 마운트 요청을 처리한다.
rpc.nfsd
* 클라이언트가 rpc.mountd에 접속이 유지되면, rpc.nfsd를 사용하여 클라이언트의 요구에 따라 처리한다.
* /etc/exports 설정에 따라 클라이언트는 다양한 작업을 할 수 있다.
rpc.lockd
* 파일 잠금과 관련된 데몬으로 현재 사용 중인 파일을 다른 사람이 사용할 수 없게 잠그는 역할을 한다.
rpc.startd
* 파일 잠금과 해제의 역할을 한다.
 
Portmap
 RPC(Remote Procedure Call) ㅍ로그램을 port(tcp/udp)에 매핑시켜주는 데몬이다.
NFS를 사용하려면 꼭 필요한 데몬이다.
 RPC를 사용하는 프로그램(NFS)이 시작되면 portmap은 서비스를 제공할 port를 portmap에 등록시킨다.
portmap은 Time Service를 필요로 한다.
   (Time Service는 xinetd 데몬에 포함되어 있다.)
portmap이 자신의 운영체제에 설치되어 있는지 확인하자.