[Linux] xinetd 데몬의 특징 및 사용법
xinetd(Extended Internet Services Daemon)는 리눅스 시스템에서 네트워크 서비스(http, ssh, telent, ftp, tftp 등)를 관리하는 데 사용되는 데몬입니다. xinetd는 서비스 요청을 받아들이고 각 서비스에 대한 실행을 관리합니다. 주로 TCP/IP 기반의 서비스를 관리하며, 일반적으로 시스템 부팅 시 시작됩니다.
여기서 잠깐!
xinetd에 대한 전체적인 그림을 이해하려면 xinetd를 통한 네트워크 서비스와 독립형 네트워크 서비스에 대한 개념을 알아야 합니다.
- xinetd를 통한 네트워크 서비스
- xinetd는 네트워크 서비스를 관리하고, 요청이 들어오면 해당 서비스를 시작합니다. 따라서 각 서비스는 필요한 경우에만 실행됩니다.
- xinetd는 필요할 때만 해당 서비스를 시작하고 리소스 제한을 구성할 수 있으므로 시스템 리소스를 절약할 수 있습니다.
- xinetd를 사용하면 서비스마다 액세스 제어가 가능하므로 TCP Wrapper를 사용할 필요가 없습니다.
- 서비스의 대기 시간에 대한 이슈가 없고, 시스템 리소스가 더 많은 서버에서 특히 유용합니다.
- 독립형 네트워크 서비스
- 각각의 네트워크 서비스는 서버에서 독립적으로 실행됩니다. 즉, 해당 서비스의 데몬은 시스템 부팅 시 자동으로 시작됩니다.
- 서비스는 시스템 리소스를 지속적으로 사용하며, 항상 대기 상태로 있어야 합니다.
- 모든 클라이언트 요청에 대해 새로운 프로세스 또는 스레드를 생성하여 서비스를 처리합니다.
- 대부분의 서비스는 기본적으로 이 방식으로 작동하며, 특별한 경우가 아니라면 추가 구성이 필요하지 않습니다.
xinetd를 통한 네트워크 서비스는 리소스를 절약하고 필요한 경우에만 서비스를 시작해야 하는 경우에 적합합니다. 예를 들어, SSH, Telnet, FTP, TFTP 등의 서비스가 여기에 해당됩니다. 독립형 네트워크 서비스는 항상 실행되어야 하는 서비스에 적합합니다. 예를 들어, 웹 서버(HTTP)와 같은 서비스가 여기에 해당됩니다.
xinetd의 주요 특징과 기능은 다음과 같습니다:
- 서비스 관리:
xinetd는 다양한 네트워크 서비스를 관리합니다. 예를 들어 Telnet, FTP, SSH, HTTP 등의 서비스를 관리하며, 각 서비스의 포트 및 설정을 지정할 수 있습니다. - 액세스 제어:
xinetd는 서비스에 대한 액세스 제어를 제공합니다. 호스트 기반 및 사용자 기반의 액세스 제어, 접근 제어 목록 (ACL)을 사용하여 특정 IP 주소 또는 서브넷에 대한 액세스를 허용하거나 거부할 수 있습니다. - 리소스 관리:
xinetd는 동시에 실행되는 서비스 수를 제한하고, 사용 가능한 리소스 (예: CPU 및 메모리)를 관리하여 시스템 자원을 효율적으로 사용할 수 있도록 돕습니다. - 로그 기록:
xinetd는 서비스 요청 및 실행에 대한 로그를 기록하여 서비스의 상태를 모니터링하고 문제를 해결하는 데 도움을 줍니다. - 보안 강화:
xinetd는 보안을 강화하기 위해 서비스를 필요할 때만 시작하고, 서비스에 대한 접근을 제어하여 보안을 강화합니다.
xinetd 설정 파일은 주로 /etc/xinetd.conf 및 /etc/xinetd.d/ 디렉토리에 있습니다. 이러한 설정 파일을 편집하여 서비스를 추가, 수정 또는 제거하고, 액세스 제어 및 리소스 제한을 구성할 수 있습니다. 변경된 설정은 일반적으로 xinetd를 다시 시작하여 적용됩니다.
/etc/xinetd.conf 파일에는 서비스의 실행 제한 시간, 최대 연결 수, 로깅 등의 전역 옵션 및 서비스별 설정 파일이 포함된 디렉터리를 지정합니다.
[root@rhel7u7 ~]# vi /etc/xinetd.confdefaults { # log_type = { SYSLOG facility [level] | FILE /path/to/file [soft_limit [hard_limit]] } log_type = SYSLOG daemon info # log_on_failure 지시자 설정 사항: HOST USERID ATTEMPT log_on_failure = HOST # log_on_success 지시자 설정 사항: PID HOST USERID EXIT DURATION TRAFFIC log_on_success = PID HOST DURATION EXIT # connection per second: 초당 50회 이상의 연결 요청이 있으면 10초간 대기 cps = 50 10 # 동시에 서비스할 수 있는 서버의 수 instances = 50 # 소스 IP당 최대 instance 숫자: UNLIMITED를 지정하면 제한없이 연결 가능 per_source = 10 } # 서비스별 설정 파일이 포함된 디렉터리를 지정 includedir /etc/xinetd.d
/etc/xinetd.d/ 디렉터리에 있는 서비스별 설정 파일에 있는 주요 지시자(directive)에 대해 알아보겠습니다. 서비스별 설정 파일에서 지정한 설정이 /etc/xinetd.conf 파일에서 지정한 설정을 덮어씁니다.
[root@rhel7u7 ~]# vi /etc/xinetd.d/sshservice ssh #usually one listed in the /etc/services file { flags = REUSE socket_type = stream #TCP:stream, UDP:dgram, IP:raw protocol = tcp port = 22 wait = no #single-threaded (yes) or multi-threaded (no). #서버 프로세스의 uid, xinetd의 유효 사용자 ID가 슈퍼유저가 아닌 경우 이 속성은 유효하지 않음 user = root server = /usr/sbin/sshd #서비스 실행 시 전달되는 매개변수 server_args = -i #/etc/xinetd.conf 파일의 log_on_failure 지시자에 추가 log_on_failure += USERID #/etc/xinetd.conf 파일의 log_on_success 지시자에 추가 log_on_success += PID HOST EXIT #지정 형식: %d.%d.%d.%d, IP주소/netmask, /etc/networks 파일의 네트워크 이름, 호스트명, 도메인명 #192.168.56.0/24가 only_from에 등록되어 있어도, 192.168.56.101에서는 서비스에 접근 불가 no_access = 192.168.56.101 192.168.57.0 10.0.1.0/24 loopback .domain.com only_from = 192.168.56.0/24 #서비스에 접근할 수 있는 시간을 지정, space로 구분하여 다수의 시간대를 지정할 수 있음 access_times = 09:45-16:15 #xinetd 데몬을 통해 서비스하려면 "no" 설정, 독립형 네트워크 서비스로 사용하려면 "yes"로 설정 disable = yes }[root@rhel7u7 ~]# vi /etc/xinetd.d/telnetservice telnet #usually one listed in the /etc/services file { flags = REUSE socket_type = stream #TCP:stream, UDP:dgram, IP:raw wait = no #single-threaded (yes) or multi-threaded (no). user = root server = /usr/sbin/in.telnetd log_on_failure += USERID #/etc/xinetd.conf 파일의 log_on_failure 지시자에 추가 log_on_success += PID HOST EXIT # no_access = 10.0.1.0/24 only_from = 192.168.56.0/24 # access_times = 09:45-16:15 disable = no }[root@rhel7u7 ~]# vi /etc/xinetd.d/tftpservice tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd #secure mode로 실행하려면 "-s" 옵션 설정 server_args = -s /var/lib/tftpboot disable = yes per_source = 11 cps = 100 2 flags = IPv4 }