1 / 30

inetd Daemon 의 이용

inetd Daemon 의 이용. VLSI 석사 3 학기 고재현. 목차. 개요 inetd 의 소개 간단한 stream tcp 서버 구현 inetd 를 이용한 datagram 서버 요약. 개요. inetd Daemon 은 무엇인가 ? inetd 를 이용한 서버 자원의 활용 문제 해결 inetd 가 어떻게 서버 구축을 간단하게 하는가 ?. 모든 서버의 공통 단계. 소켓 생성 소켓을 well-known 주소와 바인드 클라이언트 연결을 listen 클라이언트 연결을 accept.

zena-smith
Download Presentation

inetd Daemon 의 이용

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. inetd Daemon의 이용 VLSI 석사 3학기 고재현

  2. 목차 • 개요 • inetd의 소개 • 간단한 stream tcp 서버 구현 • inetd를 이용한 datagram 서버 • 요약

  3. 개요 • inetd Daemon은 무엇인가? • inetd를 이용한 서버 자원의 활용 문제 해결 • inetd가 어떻게 서버 구축을 간단하게 하는가?

  4. 모든 서버의 공통 단계 • 소켓 생성 • 소켓을 well-known 주소와 바인드 • 클라이언트 연결을 listen • 클라이언트 연결을 accept

  5. inetd의 소개 • /etc/rc.d/init.d/inet 스크립트에 의해 실행되는 daemon • 다양하게 심볼릭 링크된 스크립트에서 실행 • Red Hat Linux의 경우 • /etc/rc.d/rc3.d/S50inet – Run level 3에서 • /etc/rc.d/rc3.d/S50inet – Run level 5에서 • /etc/inetd.conf 파일 • inetd daemon이 처음 실행될 때 참조 • 어떤 Internet 서비스가 listen하는지 • 요청이 왔을때 어떤 서버에 요청을 넘길지

  6. /etc/inetd.conf 환경설정 파일 • 한 라인에 인터넷 서비스를 기술

  7. /etc/inetd.conf 필드 – (1) • 인터넷 서비스 이름 필드 • /etc/services 파일에 있는 서비스 이름 • /etc/services 파일 내용 • telnet : tcp 서비스이고 23번 포트로 설정 • inetd daemon이 감시 할 포트 결정 # grep telnet /etc/services telnet 23 / tcp rtelnet 107 / tcp # Remote Telnet rtelnet 107 / tcp

  8. /etc/inetd.conf 필드 – (2) • 소켓 타입 필드 • stream과 dgram 타입만 언급 • inetd(8) man page에 소켓리스트 포함 • raw, rdm, seqpacket 타입 • stream 타입 : SOCK_STREAM과 대응 • socket(2) 함수 호출에 사용 • Dgram 타입 : SOCK_DGRAM과 대응

  9. /etc/inetd.conf 필드 – (3) • 프로토콜 필드 • 소켓에서 사용할 프로토콜 선택 • /etc/protocols 파일에 있는 목록의 값 • 가장 일반적으로 사용되는 프로토콜 • TCP 프로토콜을 위한 tcp • UDP 프로토콜을 위한 udpㅁ

  10. /etc/inetd.conf 필드 – (4) • 플래그 필드 • datagram에만 사용 • 비 datagram 소켓에는 nowait 값을 설정 • 두 가지 datagram-oriented 서버 • 읽은 UDP 패킷을 timeout 되거나 종료(wait 값 설정)될 때까지 보관하는 서버 • 하나의 패킷만 읽고 종료(nowait로 설정)하는 서버 • datagram traffic 처리를 위해 사용

  11. /etc/inetd.conf 필드 – (5) • 사용자 ID 필드 • inetd는 root에서 동작 • 다른 사용자 계정을 inetd daemon의 식별자로 바꾸도록 지원 • 보안과 관련 최소의 권한으로 서버를 구동하기 위해 사용

  12. /etc/inetd.conf 필드 – (6) • 실행 경로 필드 • Inetd에게 실행 가능한 완전 경로명 표시 • daemon이 fork(2)를 호출한 후 exec(2)가 호출하는 파일 • 서버 인수 필드 • Exec(2)를 호출할 때 사용하는 명령어라인 인수 • 인수는 argv[0]부터 시작 • 경로명과 다른 명령어 이름을 허용 • 실행파일이 이름에 따라 다른 특성 나타낼 때 사용

  13. inetd 서버 설계 파라미터 • 소켓은 시작된 서버에 다음 파일 유닛 전달 • File unit 0는 표준 입력을 위한 클라이언트 소켓 • File unit 1는 표준 출력을 위한 클라이언트 소켓 • File unit 2는 표준 에러를 위한 클라이언트 소켓 • 단일 소켓 함수 호출 없도록 설계

  14. 간단한 stream tcp 서버 구현 5: #include <stdio.h> 6: #include <unistd.h> 7: #include <stdlib.h> 8: #include <errno.h> 9: #include <string.h> 10: #include <time.h> 11: #include <sys/types.h> 소켓 헤더파일이 없다

  15. 간단한 stream tcp 서버 구현 30: int z; 31: int n; 32: time_t td; /* Current data&time */ 33: char dtbuf[128]; /* Date/Time Info */ 소켓 주소 구조체 필요없다.

  16. 간단한 stream tcp 서버 구현 38: time(&td); 39: n = (int) strftime(dtbuf,sizeofdtbuf, 40: "%A %b %d %H:%M:%S %Y", 41: localtime(&td)); 42: 43: /* 44: * Write result back to the client: 45: */ 46: z = write(1,dtbuf,n); 47: if(z ==-1) 48: bail("write(2)"); 소켓 호출이 필요없다.

  17. 간단한 stream tcp 서버 구현 • Shell을 이용한 테스트 • Port 13을 이용한 daytime 서비스 $ make inetdserv gcc –c –D_GNU_SOURCE –Wall –Wreturn –type inetdserv.c gcc inetdserv.o –o inetdserv $ ./inetdserv Tuesday Nov 02 16:29:45 1999 $ telnet 192.168.0.1 13 Trying 192.168.0.1… Connected to 192.168.0.1. Escape character is ‘^]’. Tue Nov 2 16:31:09 1999 Connection closed by foreign host. $

  18. /etc/inetd.conf 파일 수정 • 실행파일 복사 및 실행 가능하도록 설정 • /etc/inetd.conf 파일 수정 $ cp inetdserv /tmp/inetdserv $ chmod a+rx /tmp/inetdserv $ tail –1 /etc/inetd.conf 9099 stream tcp nowait root /tmp/inetdserv inetdserv

  19. /etc/inetd.conf 파일 수정 • 각 필드의 의미 • 9099 : 사용할 포트 • stream : tcp stream 소켓을 사용 • tcp : tcp 스트림을 사용 • nowait : tcp 스트림 엔트리가 무엇을 원하는가 • root : 수행 권한 • /tmp/inetdserv : 실행 경로명 • Inetdserv : 명령어 인수 9099 stream tcp nowait root /tmp/inetdserv inetdserv

  20. 설정 변화를 inetd에 통보 • root 계정에서 다음을 수행 • 의미 • inetd daemon의 process id를 얻는다 • Inetd에 HUB 신호를 보내 환경 설정파일을 다시 읽도록 한다. 프로세스는 종료하지 않는다. # ps -ax | grepinetd 314 ? S 0:00 inetd # kill -HUP 314 #

  21. 설정 변화를 inetd에 통보 • 설정 변경 확인 # lsof -i COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME portmap 238 root 3u inet 369 UDP *:sunrpc portmap 238 root 4u inet 370 UDP *:sunrpc (LISTEN) inetd 314 root 4u inet 474 UDP *:ftp (LISTEN) inetd 314 root 5u inet 475 UDP *:telnet (LISTEN) inetd 314 root 6u inet 476 UDP *:login (LISTEN) inetd 314 root 8u inet 477 UDP *:exec (LISTEN) inetd 314 root 10u inet 478 UDP *:auth (LISTEN) inetd 314 root 11u inet 1124 UDP *:9099 (LISTEN) inetd 314 root 12u inet 1163 UDP *:daytime (LISTEN) named 342 root 4u inet 531 UDP *:1024 TCP *:9099로 표시된 부분이 새로 추가된 서버 inetd가 포트 9099로 연결하기 위해 listening *:9099는 어떤 포트로부터의 연결도 받는다는 의미

  22. 새로운 서비스 테스트 • localhost 주소를 이용한 테스트 • 카드 인터페이스 주소 이용한 테스트 $ telnet localhost 9099 Trying 127.0.0.1... Connected to localhost Escape character is '^]'. Tuesday Nov 2 17:10:37 1999 Connection closed by foreign host. $ $ telnet 192.168.0.1 9099 Trying 192.168.0.1... Connected to 192.168.0.1. Escape character is '^]'. Tuesday Nov 2 17:13:28 1999 Connection closed by foreign host. $

  23. 새로운 서비스 테스트 • daytime 서버와 비교 $ telnet 192.168.0.1 13 Trying 192.168.0.1... Connect to 192.168.0.1. Escape character is '^]'. Tue Nov 2 17:16:57 1999 Connection closed by foreign host. $

  24. 새로운 서비스 중단 • /etc/inetd.conf 파일에서 추가된 내용 삭제 • root 계정에서 다음을 수행 # ps -ax | grepinetd 314 ? S 0:00 inetd # kill -HUP 314 #

  25. inetd를 이용한 datagram 서버 • UDP 서버에 적용된 inetd • inetd 서버가 UDP 포트를 listen • Inetd가 select(2) 호출해 datagram의 도착을 알린다. • Inetd가 UDP 서버 시작을 위해 fork(2)와 exec(2)를 호출 • UDP 서버가 하나의 패킷을 읽기 위해 file unit 0(stdin)을 사용

  26. inetd를 이용한 datagram 서버 • UDP 서버의 선택 • 단계 4에서 UDP 패킷을 처리한 후 • Exit(종료) • 다른 UDP 패킷을 기다림(timeout 후에 종료)

  27. Wait와 nowait의 이해 • nowait • 하나의 datagram을 처리하고 종료할 때 • 새로운 datagram 도착하면 새 프로세스 시작 • wait • Inetd가 시작시킨 서버 프로세스가 datagram이 끝날 때까지 datagram 처리 • wait(2) 시스템 호출이 inetd에게 서버 종료를 알릴 때까지 새로운 프로세스 시작하지 않음

  28. Wait와 nowait의 이해 • 시스템적 기술 • Inetd 서버에 들어온 datagram때문에 looping UDP 서버 프로세스 시작 • 다른 이벤트 기다림 • 첫번째 UDP datagram 처리 마침 • 표준 입력으로부터 다른 UDP datagram 읽기 시도 • 더 이상 도착한 datagram이 없어 서버에서 timeout 발생하고 exit(3) 호출에 의해 프로세스 종료 • inetd SIGCHLD 신호 발생 • inetd 서버가 프로세스 ID와 서버 프로세스 종료 상태 결정 • wait(2)가 반환하는 datagram 서버의 프로세스 ID기록 서비스를 기다리는 프로세스가 없음을 표시

  29. Wait와 nowait의 이해 • datagram 서비스 정의시 유의사항 • inetd daemon은 형성된 datagram 서버가 wait 또는 nowait 인수가 필요한지 알수 없다. • wait datagram 서버에 nowait를 지정하면 불필요한 서버 프로세스들이 복제된다. • nowait datagram 서버에 wait를 지정하면 서비스에 대한 실행력이 떨어진다.

  30. 요약

More Related