xinetd 란 무엇인가?

xinetd 의 이전 버전인 inetd 는 네트웍 접속을 제어합니다. “inetd가 관리하는 포트에 접속요청이 들어오면 inetd 는 tcpd 프로그램에게 요청을 넘기고 tcpd 는 hosts.{allow|deny} 파일의 규칙에 따라 허락 여부를 결정합니다. 여기서 허락된 요청에 대해 서버 프로세스(예를 들면, ftp)가 시작됩니다. 이런 구조를 tcp wrapper라 한다.”라는 것은 네트워크 서비스 동작의 이해에서 말씀드렸습니다.

xinetd은 tcp wrapper 가 제공하는 것과 비슷한 접근제어를 제공하지만, 훨씬 더 나은 기능을 제공합니다. (그래서 tcpd를 사용할 필요가 없습니다.)

특정한 인터페이스에 특정한 서비스를 지정하기(binding) (내부네트웍과 외부 세계에 서로 다른 서비스를 제공할 수 있습니다.)

ip_masquerading (또는, Network Address Translation -NAT) 과 조합하여 사용하면 다른 시스템에 대해 아주 훌륭한 프록시로서 사용될 수 있습니다.

이미 말했지만 주요한 결점은 RPC 콜에 대해 완벽한 지원이 되지 않는다는 점입니다. 그러나 xinetd 와 portmap 을 같이 이용하면 해결할 수 있다고 합니다. 또는, inetd와 공존시켜서 해결할 수도 있습니다.( 일부 문서에서는 권장하지 않은 방법이므로 불편하지 않다면 개의치 말고 넘어 갑시다. ;) )

 

컴파일과 설치

xinetd 구하기

기본적으로 와우 7.0 이상에 함께 설치되며 www.xinetd.org 에서도 구할 수 있습니다.

설치 전통적인 방법으로 설치합니다. 아니면 rpm으로 ...

# /configure; make; make install

 

컴파일할 때 줄 수 있는 옵션 3 가지

1. --with-libwrap : 이 옵션은 tcpd 설정파일(/etc/hosts.{allow,deny}) 을 검사하도록 합니다. tcpd 를 따로 설치할 필요가 없으므로 권장하지 않습니다.

2. --with-loadavg : 이 옵션은 max_load 설정 (뒤에서 설명합니다.) 을 참고하도록 합니다. 지나친 부하를 받았을 때 몇몇 서비스를 비활성화(deactivation) 시킬 수 있어서  DoS 공격을 막는데 필요한 옵션입니다.

3. --with-inet6 : IPv6을 사용하고 싶으면 이 옵션을 줍니다. IPv4와 IPv6 커넥션이 모두 관리되지만, IPv4 주소가 IPv6 포맷으로 변환됩니다.

xinetd을 시작할 때 inetd을 멈출 필요는 없지만, 그렇게 하지 않으면 두 데몬이 예측할 수 없는 행동을 초래할 수도 있습니다.

 

xinetd 사용 방법

주 설정파일은 /etc/xinetd.conf 입니다.

환경설정 파일은 default 섹션과 각 서비스를 정의 해 놓은 디렉토리를 알려주는 includedir 섹션의 두 부분으로 구성 되어 있습니다.

default 섹션에서는 xinetd 이 관리하는 모든 서비스에서 사용되는 속성을 정의합니다.

물론, 이 내용은 각 서비스를 정의하는 부분에서 그 옵션을 재정의하여 쓸 수 있습니다.

includedir  /etc/xinetd.d  부분은 xinetd을 통해서 제공할 서비스들을 모아 두는 디렉토리를 지정합니다.

가장 보편적인 서비스인 telnet 을 열어서 형식을 확인해 봅시다.

각 서비스는 service 라는 예약어로 시작되어 서비스명을 적어주어야 합니다.
여기서 서비스명은 /etc/services 파일내에 있는 service-name 필드와 일치해야 합니다.

그 다음, 서비스가 가질 각 속성과 값을 대입 합니다. 특이한 것은 += , -= 와 같은 연산을 지원하는 점입니다. 이 연산자는 기존 값의 목록에 새로운 값을 추가/제거 하는 연산입니다. 다음 표는 서비스가 가질 수 있는 속성의 목록과 설명입니다.

속  성

의미 / 값

socket_type

사용하는 TCP/IP 소켓, stream(TCP), dgram(UDP), raw, seqpacket이 올 수 있다.

protocol

서비스가 이용하는 protocol 지정.  /etc/protocols 에 있다.  지정되지 않으면 서비스가 이용하는 protocol 이 디폴트로 지정된다.

server

실행될 Daemon , 반드시 지정되어야 한다.

server_args

Daemon 에 넘겨질 인수 지정한다.

port

서비스하는 포트번호  /etc/services 에 있는 내용과 일치해야 한다.

wait

yes나 no.
yes
이면 xinetd 가 요청된 한 daemon 이 끝날 때까지 다른 요청을 받지 않는다. 즉, single-thread service 이다.  
no
이면 각 요청에 대해  daemon 이 작동한다. 즉 multi-thread service 이다.

user

daemon 의 UID를 설정, xinetd의 UID가 0이 아니면 의미가 없다.

group

daemon 의 GID를 설정, xinetd의 GID가 0이 아니면 의미가 없다.

nice

daemon 의 우선순위 (nice)를 지정.

access_times

서비스를 이용할 수 있는 시간 간격을 설정.  
hh:mm-hh:mm
형식. 예) 08:00-18:00

위의 표 외에도 몇가지의 속성을 더 부여할 수 있습니다.

 

서비스의 예

와우리눅스 7.1 파란에서 proftpd를 xinetd 를 이용하여 서비스 하는 예를 들어 보겠습니다.

proftpd 는 standalone 모드와 inetd 모드 두가지로 작동할 수 있는데, /etc/xinetd.d 에는 proftpd 서비스가 들어있지 않습니다. 그러므로 이 파일을 만들어 주어야 하는데 표준적인 서비스인 telnet 을 복사해서 수정하여 사용하여도 됩니다.

그러나, proftp가 설치된 경우라면, /etc/proftpd/conf/ 디렉토리로부터 proftpd.xinetd 파일을 복사하여 사용하면 됩니다.

# cp /etc/proftpd/conf/proftpd.xinetd   /etc/xinetd.d/proftpd

여기서는 복사하면서 이름을 바꾸었지만, 필수 사항은 아닙니다.

복사한 파일을 열어 아래 항목을 변경합니다.

# vi  /etc/xinetd.d/proftpd

     disable = no    # <--  yes를 no로 변경

이제 localhost 로 접속을 시도해 볼 차례입니다. 그러나 먼저 확인을 해야 할 사항이 있습니다. 한 서비스를 standalone 모드와 inetd 모드로 동시에 설정하면 에러가 나므로,

# vi /etc/proftpd/conf/proftpd.conf

     ServerType = inetd

와 같이 바꾸어 주어야 합니다. (※ xinetd 가 아니라 inetd 입니다.)

그리고, proftpd 가 떠 있다면 종료시킵니다.

# /etc/rc.d/initd.d/proftpd  stop

xinetd 를 재실행 합니다.

# /etc/rc.d/initd.d/xinetd restart

이제 실제로 ftp 서비스가 정상적으로 이루어 지고 있는지를 테스트해 봅니다.

 

xinetd 와 관련된 또 하나의 예를 들어 보겠습니다. (서비스 이름처럼 함부로 사용하지 마십시오. :)  )

1.     /etc/services 파일에 다음 줄을 추가합니다.

donotuse 555/tcp

2.     /etc/xinetd.d/ 디렉토리에 다음과 같은 서비스를 만듭니다.

# vi  donotuse

service donotuse

{

        disable         = no

        flags           = REUSE

        socket_type     = stream        

        wait            = no

        user            = root

        server          = /sbin/shutdown

        server_args     = -r now

        only_from       = 127.0.0.1

        log_on_failure  += USERID

}

3. telnet  donotuse 를 실행하여   실제로 shutdown 명령이 실행 되는지 확인합니다. 

[출처] xinetd 설정하기|작성자 리밥