[기술컬럼] 네트워크 유틸리티 활용 방법

서버와 클라이언트 같은 네트워크 어플리케이션을 개발하고, 서로 연동을 하는 과정에서 발생하는 문제 중에는 코드만 들여다 봐서는 해결할 수 없거나, 그 이유를 찾기 힘든 문제들이 있습니다.

그런 경우, 외부 도구의 힘을 빌려서 문제 상황을 파악하고, 어떤 부분을 수정해야 하는지 파악하는 것이 도움이 되기도 합니다.

이번 글에서는 운영체제의 네트워크 유틸리티를 통해서 서버의 상태나 서버와 클라이언트간 연결 상태, 네트워크 상에서 주고받는 패킷의 정보를 이용해서 문제 상황을 파악하는 방법을 소개하고자 합니다.

  1. Netstat ( Windows, Linux )

가장 먼저 소개할 유틸리티는 Netstat 유틸리티인데요, Linux 계열 운영체제에서는 net-tools라는 네트워크 유틸리티 패키지에 포함되어 있으며, Windows NT 계열에서는 기본 설치되어 있어서 즉시 사용이 가능합니다.
이 유틸리티는 운영체제의 네트워크과 관련한 여러 정보들을 보여주는데요, 서버가 동작하는 데에 있어서 유용한 정보들을 포함합니다.

네트워크 어플리케이션을 작성하는 데 있어서 가장 많이 사용하는 경우는 포트 정보를 확인하기 위한 경우인데요, 아래 화면은 테스트 머신의 포트 정보를 출력한 화면입니다.
TCP 프로토콜을 사용하는 포트 정보를 출력했고, 가장 오른 쪽에 있는 PID와 Program name이 중요합니다.

주) 실행 옵션은 버전마다 약간의 차이가 있을 수 있습니다.
주) Program 정보를 보기 위해서는 루트 권한이 필요할 수 있습니다.

1.png

위 명령의 결과는 다음과 같이 해석 할 수 있습니다.

  • PID 1051인 mysqld 프로세스가 TCP 3306 포트를 사용하고 있다.
  • 결과 없는 TCP 포트를 현재 사용중이 아니다.
  • IP주소가 11.0.10인 호스트에서 TCP 22포트를 사용하는 sshd 프로세스와 연결되어 있다.

서버 어플리케이션을 실행했고, 위 명령의 결과 정상적으로 포트를 사용하고 있는 것으로 나온다면 네트워크 관점에서 프로세스는 정상 실행됐다고 볼 수 있습니다.

2. Telnet / Netcat

Telnet은 한 때, 가장 많이 쓰이던 원격 터미널 연결 프로그램이었지만, 보안에 취약한 단점으로 인해 SSH를 사용하게 되면서 최근에는 거의 사용하지 않게 되었지만 다른 방법으로 유용하게 사용되고 있습니다.
바로 ‘특정 포트로의 접속’을 통해서 특정 포트로의 접속 여부를 확인 할 수 있다는 것인데요, Netstat 명령을 통해서 서버가 정상적으로 포트를 열고 실행하고 있어도 병화벽 정책 등에 의해서 연결이 차단되는 경우를 확인하는 방법에 활용할 수 있습니다.

2

위의 화면은 저희 회사 홈페이지에 telnet으로 접속 해 본 화면인데요, 웹 서비스를 위한 TCP 80번 포트가 열려 있기 때문에 “Connected to ifunfactory.com.”이라는 메시지를 확인 하실 수 있습니다.
더 나아가 서버가 웹 서버처럼 텍스트를 기반으로 메시지를 주고 받는다면, 바로 메시지를 전송할 수도 있습니다.
다음 스크린샷은 위에 이어서 index.html 페이지를 요청 한 결과인데요, 404에러를 돌려주고, 연결이 끊겼습니다.

3

Telnet은 Windows에서도 보조 프로그램으로 지원하고 있어서 쉽게 사용할 수 있습니다.

한편, Telnet은 TCP 프로토콜만을 지원합니다만 UDP 프로토콜은 연결을 맺는 과정이 없기 때문에 위와 같은 테스트를 하기에 적합하지 않습니다.

Telnet과 비슷한 유틸리티로 Netcat이 있는데요, UDP 프로토콜도 지원할 뿐 아니라 좀 더 다양한 기능을 제공합니다.

사용법은 비슷하기 때문에 따로 다루지는 않겠습니다.  다만, Windows에서 기본 제공하지 않기 때문에 직접 설치해서 사용해야 합니다.

3. Tcpdump

Tcpdump는 패킷 분석을 위한 유틸리티인데요, Windows나 Linux desktop처럼 GUI가 지원되는 환경에서는 Wireshark같은 오픈소스부터 사용 프로그램까지 트래픽을 분석하는 툴이 많이 있습니다만, Command line을 사용해야 하는 Linux server 환경에서 사용할 수 있는 가장 기본적이면서도 매우 강력한 유틸리티입니다.

자세한 사용법에 대해서는 다음 기회에 다뤄보기로 하고, 이번에는 몇 가지 기본적인 사용법과 함께 네트워크 어플리케이션 개발 시 어떻게 활용 할 수 있는지에 대해서 설명하도록 하겠습니다.

4

먼저, 테스트 환경입니다. 빨간 박스에 있는 TCP 8013 포트를 사용하는 서버 프로세스를 띄워 놓은 상태입니다.
이 서버는 저희 아이펀 엔진의 기본 프로젝트를 빌드하면 바로 실행할 수 있는 상태이며, 클라이언트가 보낸 문자열을 그대로 돌려주는 echo 메시지 핸들러를 가지고 있습니다.
Tcpdump를 실행한 상태에서 클라이언트는 서버에 접속해서 “Hi, this is first message.”라는 문자열을 주고받고 실행을 종료하게 되고, 이 때에 Tcpdump의 패킷 정보를 보도록 하겠습니다.

A. 패킷 캡처하기

Tcpdump는 다양한 룰 설정을 통해서 패킷을 필터링 할 수 있습니다.

먼저, 테스트 환경에 맞는 필터링 룰을 실행 옵션으로 주고 실행 해 봤습니다.

5

패킷 단위로 TCP 수준의 헤더정보를 보여주고 있습니다.
이 정보만으로도 서버와 클라이언트 사이에 TCP 연결을 맺는 과정(3-Way Handshake)이나 접속 종료가 이루어지는 과정(4-Way Handshake), 그리고, 데이터를 주고 받는 등의 기본적인 정로를 확인 할 수 있습니다.

다음은 TCP 세그먼트의 데이터까지 확인 해 보도록 하겠습니다.

B. Tcpdump를 실행할 때에, 출력 옵션 ( –XX ) 을 조정하면 패킷 정보를 Hex값과 Ascii 두 가지 포맷으로 보여주는데요, 다음 두 화면으로 나눠서 결과를 확인 해 보겠습니다.

6

저희 아이펀 엔진에서 클라이언트 연결 직후 세션 아이디를 발급하는 과정을 보여주고 있습니다. Ascii값으로 표현할 수 없는 값은 점(.)으로 표현하고 있지만, Text 형태로 전송하는 “VER”, “LEN” 값은 물론 session id도 확인할 수 있습니다.

7

세션이 맺어진 후에 echo 메시지를 주고받을 때의 패킷 정보입니다.
클라이언트가 전송한 “Hi, this is first message.”라는 문구를 확인 가능합니다.

알아보기 쉬운 Ascii값만 확인 해 봤습니다만, JSON 문자열의 문자열의 경우 Ascii로 표현되지 않는 줄 바꿈 문자나 공백 문자로 인해서 JSON 파서에서 오류가 발생하는 일도 있기 때문에 네트워크 상에 전송되는 패킷의 정보를 분석할 줄 알면 문제 상황을 해결하는 데에 큰 도움이 될 수 있습니다.

이상으로 알아두면 의외로 요긴하게 써 먹을 수 있는 네트워크 유틸리티 세 가지에 대해서 알아봤습니다.

 

아이펀팩토리 이재원 테크니컬디렉터

답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.