강좌
클라우드/리눅스에 관한 강좌입니다.
자격증 분류

리눅스마스터1급 : 데몬(daemon)의 개념 및 역할

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스마스터1: 데몬(daemon)의 개념 및 역할

 

 




네트워크, 프린터 등을 포함하는 리눅스상의 서비스는 데몬 프로그램을 중심으로 제공되고 있다.

 

 

 

 

그런데 네트워크 서비스는 슈퍼 데몬이라는 것에 의해 관리되기도 하는데, 이것은 여러 가지 인터넷 서비스의 프로세스를 하나의 데몬에서 관리하도록 한 것이다.

 

 

 

 

여기서는 이러한 데몬의 기본적인 개념들을 살펴보도록 한다.

 

 

 

 

 

1) 데몬이란?

 

데몬(daemon)은 서버 프로세스로 시스템이 살아 있는 동안 항상 실행되는 백그라운드 프로세스 상태로 존재한다.

 

 

 

 

시스템에서 네트워크를 통해 특정한 서비스를 제공하기 위해 특정 포트를 열어두고 연결요청이 들어오길 기다리는 프로그램 또한 데몬이다.

 

 

 

 

예를 들어 FTP 서비스를 위한 데몬의 경우에는 21번 포트에 그리고 웹 서비스를 위한 데몬은 80번 포트에 귀를 기울이고(LISTENING) 있다.

 

 

 

 

 

 

그런데 Linux(Unix)는 다중 사용자 시스템으로서 하나의 연결은 하나의 포트를 통하는데 만약 한사람이 22번 포트를 사용해서 ssh를 사용하고 있다면 다른 사람은 어떻게 해야 할까?

 

 

인터넷 서비스 데몬은 대표 포트를 지키고 있다가 연결이 들어오면 새로운 프로세스(또는 Thread)를 가동시킨다.

 

 

 

 

자신은 계속 대표 포트를 지키고 있는 것이다.

 

 

 

 

, 데몬은 기본적으로 인터넷에 연결된 다른 컴퓨터(클라이언트)의 서비스 요청이 들어오면, 자식 프로세스에게 해당 연결을 넘겨주고 계속 같은 포트에 대해 연결 요청을 기다린다.

 

 

 

 

netstat로 확인해 보면 다음과 같다.

 

 

 

 

 

$ netstat -a

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 sulinux:ssh 211.181.178.79:1022 ESTABLISHED

tcp 0 0 *:ftp *:* LISTEN

tcp 0 0 *:www *:* LISTEN

tcp 0 0 *:1024 *:* LISTEN

tcp 0 0 *:ssh *:* LISTEN

tcp 0 0 *:auth *:* LISTEN

tcp 0 0 *:smtp *:* LISTEN

tcp 0 0 *:sunrpc *:* LISTEN

udp 0 0 *:xdmcp *:*

udp 0 0 *:sunrpc *:*

raw 0 0 *:icmp *:* 7

raw 0 0 *:tcp *:* 7

 

 

 

 

 

 

 

 

위의 예제는 특정 서버에서 netstat -a 명령의 결과 중 Active Internet conntections 부분만 잘라낸 것이다.

 

 

 

 

8번째 줄을 보면 ssh 데몬이 연결 요청을 기다리고 있는 것이 보인다.

 

 

 

 

통상 ssh 데몬은 22번 포트를 사용한다.

 

 

 

 

그리고 4번째 줄을 보면 클라이언트 IP(211.181.178.79)와 포트(1022)에서 SSH 서버 IP(sulinux:호스트네임)와 포트(22)로 연결된 자식 프로세스를 볼 수 있다.

 

 

 

 

이 다중 연결은 TCP에서 목적지 IP, 목적지 Port, 발신지 IP, 발신지 Port를 통해 수신 세그먼트를 역다중화 하기에 가능한 것이다.

 

 

 

 

TCP는 목적지 포트만 보고 어떤 프로세스가 수신 세그먼트를 받아야 할지 판단할 수 없다.

 

 

 

2) 슈퍼 데몬이란?

 

인터넷을 통한 서비스가 많아지면서 이러한 데몬의 활동에 불합리가 발생했다.

 

 

 

 

이유는 서비스 하나 하나가 다들 하나의 데몬을 꿰차고 있기 때문이었는데, ftp, telnet, www, smtp, talk, time, echo, pop3, imap, whois, domain 등 수 없이 많은 서비스에 하나하나의 데몬을 할당하다 보니 시스템이 무거워졌고, time, talk, pop3 등의 서비스는 사용자가 그리 많지도 않고, 해당 서비스에 빨리 접속해야 하는 것도 아니었기 때문에 더욱 불합리한 것이었다.

 

 

 

이러한 낭비를 막아보자는 생각에 '슈퍼 데몬'이 탄생했다.

 

 

 

 

말 그대로 슈퍼(super, ) 데몬이다.

 

 

 

 

이것은 다른 데몬들, 예를 들어 talk, pop3, ftp 등을 관리하면서 이들의 대표 포트(talk517, pop3110, ftp21)로 오는 연결 요청을 해당 데몬에게 전달한다.

 

 

 

 

이렇게 되면 상대적으로 사용량이 적은 데몬들을 항시 대기시키지 않아도 되어 시스템이 무거워지는 것을 어느 정도 막을 수가 있다.

 

 

 

 

이러한 데몬을 보통 inetd(Internet Daemon)이라고 부른다.

 

 

 

 

그리고 현재는 xinetdinetd 대용으로 사용되고 있다.

 

 

 

 

 

 

그렇지만 xinetd(또는 inetd)의 사용여부에 대해서는 시스템 환경에 따라 결정할 사안이다.

 

 

 

 

시스템 자원을 아낄 수 있다는 점에서 많은 이점이 있지만 여기서 간과하지 말아야 할 것은 데몬이 어떻게 동작하는가이다.

 

 

 

 

다음은 이것에 의해 ssh 데몬이 시작되는 방법이다.

 

 

 

원격지에서 22번 포트로 ssh 연결 요청을 한다.

 

inetd는 이 요청을 받아서 해당 접속 요청이 어떠한 포트로 들어왔는지 검사한다.

 

연결 요청이 22번 포트로 들어왔으니 ssh 데몬을 시작시킨다.

 

데몬이 시작되면 연결을 1022 포트로 재지향하고 데몬에게 알린다.

 

연결 성공

 

 

 

 

위와 같이 여러 단계를 거치는 동안 시스템 자원은 아껴졌는지 모르겠지만 원격에서 기다리는 사람의 시간은 낭비되었을 것이다.

 

 

 

 

문제는 이러한 시간 낭비를 사람들이 싫어하게 되는 경우이다.

 

 

 

 

 

 

그리고 웹 데몬과 같이 기존에 사용자들이 많은 서비스의 경우에는 슈퍼 데몬에 의해 한 번의 절차를 더 거치기 때문에 속도가 느릴 뿐만 아니라 도리어 시스템에 더욱 많은 부담을 주게 된다.

 

 

 

 

 

그래서 웹 데몬과 같이 많이 사용되는 데몬이나 보통의 시스템에선 사용자에 대해 빠른 시작 속도를 보장해 주어야 할 필요가 있는 데몬들은 기존의 방식대로 항상 대기하면서 사용자 연결을 기다리도록 하고 있다.

 

 

 

 

이와 같은 방식을 standalone 방식이라고 한다.

 

 

 

 

그리고 나머지는 (x)inetd 방식을 사용하여 소규모 서비스들을 통합하여 운영한다.

 

 

 

3) 네트워크 서비스 포트 설정 파일 - /etc/services

 

 

슈퍼 데몬을 통해 관리되는 것을 포함하여 특정 인터넷 서비스에서 네트워크 서비스를 제공하기 위해서 리눅스 시스템에는 포트가 열려 있어야 한다.

 

 

 

 

이때 포트를 관리하는 파일이 /etc/services 파일이다.

 

 

 

 

services는 인터넷 서비스를 위해 텍스트 형태의 이름과 원래 할당된 포트 번호와 프로토콜 타입간의 맵핑을 제공하는 단순한 ASCII 파일이다.

 

 

 

 

모든 네트워킹 프로그램은 서비스를 위한 포트 번호(와 프로토콜)를 얻기 위해 이 파일을 조사해 봐야 한다.

 

 

 

 

포트 번호는 IANA(Internet Assigned Numbers Authority)에 의해 할당받는데, 포트 번호를 할당 받을 때 정책에 따라 TCPUDP를 따로 할당받게 된다.

 

 

 

 

그러므로 하나의 서비스를 하더라도 대부분의 엔트리(entry)는 두 개씩 가지고 있다.

 

 

 

 

 

 

이 파일을 살펴보면 리눅스 운영체제에서 정말 수많은 서비스를 제공할 수 있다는 것을 알 수 있다.

 

 

 

 

다음은 “more /etc/services” 명령으로 파일을 연 것으로 첫 화면이다(<스페이스 바>를 누르면 한 페이지씩, <엔터>를 누르면 한 줄씩 아래로 이동한다).

 

cd748e8935a013f3cf536af9b9b6806b_1683618351_2291.png
 

 

현재 필자의 시스템의 /etc/services 파일에는 48619번까지의 서비스 내용이 들어 있다.

 

 

 

 

위에 보면 친숙한 telnetftp 등의 포트 번호와 사용하는 프로토콜의 정보 등을 볼 수 있을 것이다.

 

 

 

 

이 내용이 바로 시스템에서 서비스 이름을 포트 번호와 매치시키기 위한 표준 정보들이다.

 

 

 

 

클라이언트와 서버는 바로 이 정보를 가지고 표준 포트를 찾고 연결을 수행한다.

 

위의 엔트리들은 다음과 같은 형식을 가지고 있다.

 

 

 

 

 

 

 

service-name port/protocol [aliases] [# comment]

 

 

 

 

 

 

 

service-name은 해당 서비스의 이름을 지칭하고, port는 서비스가 제공되는 포트, 그리고 protocol에는 서비스가 사용하는 프로토콜이 기재된다.

 

 

 

 

하나의 서비스가 하나 이상의 프로토콜을 사용하거나, 다른 프로토콜을 사용하는 다른 서비스들이 동일한 포트를 사용하는 것이 가능하다.

 

 

 

 

aliases 필드에는 서비스의 별칭을 기재한다.

 

 

 

 

# comment에는 해당 서비스에 대한 설명이 들어간다.

 

위의 예를 보면, ssh 서비스는 22번 포트를 사용해서 제공된다.

 

 

 

 

그리고 프로토콜을 tcpudp를 사용하고 있다.

 

 

 

 

별칭은 없고 다만 'SSH Remote Login Protocol' 라고 주석이 달려 있다.

 

 

 

 

 

 

 

 

 

 

ssh 22/tcp # SSH Remote Login Protocol

ssh 22/udp # SSH Remote Login Protocol

 

 

 

 

 

 

 

 

친숙하진 않겠지만 512 포트는 tcp 를 사용하는 exec 라는 서비스와 udp 를 사용하는 biff(메일 도착 알림 서비스) 에 의해 사용된다.

 

 

 

 

 

 

 

exec 512/tcp

biff 512/udp comsat

 

 

 

 

 

 

 

 

일반적으로 /etc/services 파일을 수정하는 경우는 거의 없지만, 사용자가 표준에 해당하는 서비스 외에 제공하고 싶은 서비스가 있다면 기존에 제공하지 않는 포트를 지정하여 파일을 수정할 수 있다.

 

 

 

 

그리고 그리 사용이 많지는 않지만 보안을 위하여 포트 번호를 바꾸기도 한다(그렇지만 이것은 근본적인 해결책은 되지 못한다.

 

 

 

 

포트 스캐너를 이용하면 간단하게 포트 번호를 확보할 수 있기 때문이다). 회사나 Warez 같은 경우 포트 번호가 표준으로 되어 있지 않다면 포트 번호를 아는 사람들만이 들어올 확률이 높아지므로 가끔 사용한다.

 

 

 

 

다음에서 ssh 의 서비스 포트를 바꿔보자.

 

 

 

먼저 /etc/services에서 포트 번호를 8000번으로 바꾸어 준다.

 

 

 

 

 

 

 

# cat /etc/services | grep ssh

ssh 8000/tcp # SSH Remote Login Protocol

ssh 8000/udp # SSH Remote Login Protocol

 

 

 

 

 

 

 

그리고 ssh의 설정 파일인 /etc/ssh/sshd_config에서 포트 번호를 8000으로 지정해 준다.

 

 

 

 

 

 

# cat /etc/ssh/sshd_config | grep Port

Port 8000

 

 

 

 

 

 

 

마지막으로 설정한 파일을 데몬에 적용시키기 위하여 다음과 같이 ssh의 데몬을 재시작한다.

 

 

 

 

 

 

 

# service sshd restart

sshd 를 정지 중: [ OK ]

sshd ()를 시작 중: [ OK ]

#

 

 

 

 

 

 

 

이 경우에 다음과 같이 기존의 방식대로 접속을 시도하면 접속에 실패하게 된다(sulinux는 호스트명으로서 /etc/hostsIP 주소, 도메인 네임 및 호스트명(별칭)을 한 줄로 등록시켜 두면 IP 주소나 전체 도메인 네임을 적지 않아도 호스트명만으로 연결이 가능하다).

 

 

 

 

 

 

 

# ssh sulinux

Secure connection to sulinux refused.

 

 

 

 

 

 

 

그리고 바꿔준 번호인 8000번으로 포트 지정(-p)을 하고 접속하면 접속이 된다.

 

 

 

 

 

 

 

# ssh -p 8000 sulinux

root@sulinux's password:

 

 

 

 

 

 

 

이제 sulinux 시스템에 ssh 접속을 하려는 사람은 포트가 8000번이라는 것을 알아야만 접속할 수 있게 되는 것이다.

 

 

 

 

 

 

 

 

 

 

1024번을 기준으로 한 포트 번호의 구분

1024번 아래쪽 포트 번호는(보통 'low numbered' port라고 부르는) 루트(root)에 의해서만 지정될 수 있다(이에 대해서는 man 페이지의 bind(2), tcp(7), udp(7)를 참조하도록 하기 바란다). 그러므로 낮은 번호의 포트에 연결된 클라이언트는 그 포트에서의 서비스가 표준 실행이고, 사용자에 의해 실행되는 낮은 품질의 서비스가 아니라는 것을 믿을 수 있다.

 

 

 

 

그리고 IANA에 의해 분류된 잘 알려진 포트 번호는 일반적으로 이 범위에 위치한다.

 

 

 

 

 

4) 데몬의 시작과 종료

 

데몬의 시작과 종료는 원래 해당 데몬의 실행 파일을 직접 실행하여 시작하고 해당 프로세스를 종료함에 의해서 종료할 수 있다.

 

 

 

 

그러나 이러한 작업은 너무 번거로운 작업인데 리눅스에서는 시작과 종료를 위한 스크립트를 /etc/init.d 디렉토리(또는 /etc/rc.d/init.d) 아래에 제공하고 있다.

 

 

 

 

그리고 이 디렉토리의 파일들은 각 런레벨에 대한 스크립트를 포함하는 디렉토리에 [K 또는 S][번호][스크립트명] 정도의 이름으로 링크된다.

 

 

 

 

이 디렉토리는 /etc/rc[런레벨번호].d 의 형식(또는 /etc/rc.d/rc[런레벨번호].d)로 존재한다.

 

 

 

 

 

이 스크립트는 직접 실행하거나 service 명령으로 다음과 같이 실행할 수 있다.

 

 

 

 

 

 

 

# /etc/init.d/[서비스 데몬명] [명령]

 

 

 

 

 

 

또는

 

 

 

 

 

 

# service [서비스 데몬명] [명령]

 

 

 

 

 

 

서비스 데몬명에는 데몬의 이름이 들어가고 명령에는 각 스크립트에 정의된 명령이 들어간다.

 

 

 

 

이 명령에는 일반적으로 start, stop, restart 등이 있다(각각 시작, 정지, 재시작). 그리고 status, condrestart, reload 등의 옵션을 사용하기도 한다.

 

 

 

 

 

 

그리고 이 서비스 데몬의 자동 시작 여부는 각각 런레벨 디렉토리의 시작 스크립트 파일명을 수정해서 설정할 수도 있으나 이것은 무척 수고스러운 일이기 때문에, 콘솔용 프로그램인 ntsysv 또는 X 윈도우용 프로그램인 시스템 서비스 설정프로그램을 이용하여 설정할 수 있다.

 

 

 

먼저 ntsysv는 그놈 콘솔, KDE 콘솔과 같은 터미널 프로그램이나 텍스트 모드의 콘솔에서 ntsysv 명령을 내려서 실행하는데, 다음과 같이 실행한다.

 

 

 

 

서비스하고 싶은 서비스 데몬에 체크(* 표시)하고 확인을 누르면 해당 서비스가 시스템 시작시 자동으로 시작된다.

 

 

 

cd748e8935a013f3cf536af9b9b6806b_1683618378_3702.png
 

 

 

 

다음으로 X 윈도우용 프로그램인 서비스 설정 프로그램을 패널 메뉴에서 시스템 관리 서버 설정 서비스 설정을 클릭하거나 터미널 쉘프롬프트에서 serviceconf 명령으로 실행할 수 있다.

 

 

 

 

 

이 프로그램으로도 런레벨별로 서비스 데몬의 자동 시작 여부를 설정하고 설정창에서 특정 서비스의 시작, 중지 및 재시작이 가능하다.

 

 

 

 

이 프로그램은 슈퍼 데몬(xinetd)에 의한 서비스 목록도 설정할 수 있다.

 

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,056 명
  • 현재 강좌수 :  35,910 개
  • 현재 접속자 :  198 명