DigiMoon 맘대로 닦고 조이고 기름치는 재미가 있는 DigiMoon만의 기억 저장소

Posted
Filed under 컴퓨터 탐구/리눅스

리눅스에서 httpd나 sshd, vsftpd 와 같은 데몬들은 패키지를 처음 설치하고 나면 기본적으로 standalone 방식으로 동작하게 설치됩니다.
우리가 인터넷 서비스 중에서 가장 많이, 그리고 자주 이용하는 게 웹서비스일 겁니다. 이 웹서비스를 담당하는 데몬인 httpd 같은 경우는 가장 많이 이용되는 서비스이므로 외부에서 접속을 시도하면 항상 신속하게 응답을 할 수 있어야 합니다. 따라서 메모리에 늘 상주하는 형태인 standalone 방식으로 구동시키는 것이 좋고 그렇게 하는 게 사실상 정석으로 통용되고 있습니다.
그러나 SSH나 FTP의 경우는 그리 자주 이용하지 않습니다. 물론 전용 파일 서버라면 vsftpd나 proftpd 같은 ftp 관련 데몬을 standalone 방식으로 구동시켜 항상 빠르게 응답할 수 있는 상태로 만들어 주는 게 좋겠죠. 하지만 SSH의 경우는 일반 사용자들은 거의 이용하지 않고 서버 관리자들이 주로 이용하고 ftp의 경우도 호스팅 서비스를 통해 홈페이지를 관리하는 사람들이 가끔 ftp로 웹페이지 파일 등을 올릴 때에나 이용할 뿐 그리 자주 이용하지는 않는 게 사실입니다.

따라서 이런 서비스들을 Xinetd 라고 하는 수퍼데몬에게 종속시키면 서비스를 이용할 때에만 수퍼데몬이 해당 서비스의 데몬을 작동시키게 되므로 시스템 자원을 절약할 수 있는 장점이 있습니다. 물론 stanalone 방식에 비해 응답 속도는 다소 느리겠지만 서버에 접속자가 많지 않을 경우 체감상 차이는 거의 없습니다.

그럼 저는 SSH와 FTP를 수퍼데몬에 의해 작동하도록 설정해 보겠습니다.
우선 ntsysv를 실행시켜 시스템을 처음 시작 시 데몬이 작동하지 않도록 설정합니다.
해당 서비스 항목을 체크 해제하면 됩니다.

[root@ns ~]# ntsysv

사용자 삽입 이미지


다음으론 /etc/xinetd.d 디렉토리로 이동합니다.

[root@ns ~]# cd /etc/xinetd.d
[root@ns xinetd.d]# ls
chargen      daytime-udp  eklogin  imaps  klogin       pop3s  swat      vsftpd
chargen-udp  echo         gssftp   ipop2  krb5-telnet  rsync  time
daytime      echo-udp     imap     ipop3  kshell       sshd   time-udp
[root@ns xinetd.d]#

위에 보시다시피 이 디렉토리 안에는 Xinetd 데몬이 담당하는 자식 데몬들의 실행 조건에 관한 내용이 담긴 파일들이 모여 있습니다. SSH의 경우는 sshd, FTP의 경우는 vsftpd 데몬이 담당하고 있습니다.
저는 sshd와 vsftpd 파일을 미리 생성해 두었습니다. 이 디렉토리 안에 있는 파일들은 거의 같은 내용으로 구성되어 있으므로 적당한 파일을 하나 골라 복사를 해서 각 서비스에 맞게 내용을 약간씩만 수정해 주면 됩니다.
해당 파일을 열어 편집하기 전에 해당 서비스의 실행 파일이 위치하고 있는 경로를 먼저 파악해 둡시다.

[root@ns xinetd.d]# which sshd
/usr/sbin/sshd
[root@ns xinetd.d]# which vsftpd
/usr/sbin/vsftpd
[root@ns xinetd.d]#

그 다음 /etc/services 파일을 편집기로 열어 봅니다.
[root@ns xinetd.d]# vi /etc/services
사용자 삽입 이미지


해당 서비스의 이름을 잘 기억해 둡시다.

이제 파일을 편집기로 직접 열어 봅시다. vsftpd부터 열어 보겠습니다.

[root@ns xinetd.d]# vi vsftpd
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
service ftp          <- /etc/services 파일 안에 있는 서비스명으로 필히 입력
{
        disable = no                    <- 해당 서비스를 실행할 것인지 말 것인지 정함. no로 설정
        socket_type     = stream    <- tcp일 경우 stream, udp일 경우 dgram으로 설정
        wait            = no              <- xinetd가 서비스 요청 받은 이후 즉시 다른 요청 처리할 지 여부 결정,
                                                  stream 일 경우 반드시 no로 설정
        user            = root            <- 해당 서비스를 root 권한으로 실행
        server          = /usr/sbin/vsftpd     <- 서비스의 실행 파일이 있는 절대 경로
        log_on_failure  += USERID    <- 해당 서비스에 접속하는 데 실패했을 경우 /etc/xinetd.conf 파일에서 정의
                                                     된 기본 항목에 추가하여 USERID값, 즉 접속한 사용자의 ID를 로그파일에
                                                     추가로 기록

}

그러나 vsftpd의 경우는 이 파일만 손 본다고 끝나는 게 아닙니다. vsftpd의 환경설정 파일인 /etc/vsftpd/vsftpd.conf 에서도 손을 봐야 할 게 한 군데 더 있습니다.

[root@ns xinetd.d]# vi /etc/vsftpd/vsftpd.conf
사용자 삽입 이미지

최하단부를 보면 기본값으로 listen=YES 라고 되어 있는데 이것을 xinetd 방식으로 동작하게 NO로 변경해 줍니다. standalone 방식으로 동작하게 하려면 이 부분을 YES로 설정하면 됩니다.

ssh도 마저 설정하도록 합니다.

[root@ns xinetd.d]# vi sshd
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
service ssh
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/sshd
        server_args     = -i
        log_on_failure  += USERID
}

이제 xinetd 데몬을 리스타트합니다.
[root@ns xinetd.d]# service xinetd restart

현재 작동 중인 데몬의 상태를 볼까요?

[root@ns xinetd.d]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             Stat
e       PID/Program name
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LIST
EN      2086/mysqld
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LIST
EN      2473/smbd
tcp        0      0 0.0.0.0:110                 0.0.0.0:*                   LIST
EN      6857/xinetd
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LIST
EN      6857/xinetd
tcp        0      0 192.168.10.103:53           0.0.0.0:*                   LIST
EN      2355/named
tcp        0      0 127.0.0.1:53                0.0.0.0:*                   LIST
EN      2355/named
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LIST
EN      6857/xinetd
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LIST
EN      2446/sendmail: acce
tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LIST
EN      2355/named
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LIST
EN      2473/smbd
tcp        0      0 :::80                       :::*                        LIST
EN      2500/httpd
[root@ns xinetd.d]#

sshd와 vsftpd는 이제 standalone 방식이 아닌 xinetd 방식으로 작동하기 때문에 리스트에는 더 이상 나오지 않습니다.
아래 이미지처럼 데몬은 아예 작동하지 않고 있습니다.
사용자 삽입 이미지


그러나 위 리스트를 다시 자세히 보시기 바랍니다. xinetd 항목을 보면 21번과 22번 포트가 LISTEN 상태인 것을 확인할 수 있습니다. 이는 아까 /etc/xinetd.d 디렉토리에 설정해 둔 sshd와 vsftpd가 사용하는 포트입니다. 데몬 자체는 작동하고 있지 않지만 해당 데몬이 사용하는 tcp 포트는 xinetd 데몬이 사용할 수 있도록 항상 리슨 상태로 대기하고 있는 것입니다. sshd와 vsftpd 뿐만 아니라 telnet 도 xinetd 타입으로 작동하게 설정하였다면 telnet이 이용하는 포트인 23번 포트가 리슨 상태로 추가되겠죠.

이제 서버에 FTP접속을 한 상태에서 다시 확인해 보면 작동을 하고 있다고 나옵니다.
xinetd 데몬 자체는 standalone 방식으로 메모리에 항상 상주하고 있다가 외부에서 자식 프로세스에 대한 서비스 요청이 있게 되면 그 때만 해당 서비스를 작동시키기 때문이죠.


Creative Commons License
2007/03/16 02:38 2007/03/16 02:38