ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • health check에서 출발한 ping, telnet, curl 이야기
    Server/Linux 2021. 3. 8. 17:51

     

    이 서버는 죽은 걸까?
    이 컨테이너의 포트는 호스트와 제대로 매핑되어 돌아가고 있는 걸까? 를 확인하는 과정에서 시작된 포스팅.

     

    작년 우아한테크코스 과정을 진행하며, 따로 인프라나 리눅스를 공부하며, 여러 번 사용했던 명령어 삼총사가 있다. 바로 ping, telnet, curl이다. 사용할 때마다 각 명령이 어떤 기능이고 어떤 제한사항이 있는지 헷갈려서 항상 여러 번 시도하고 찾아봤던 경험이 있기에 이번 기회를 맞이하여 정리해볼까 한다. 지금 기억상으로는 어떤 명령어에는 포트를 지정할 수 있었고 다른 명령어는 불가능했다. 그리고 Transport 레이어까지 침투하지 않아서 4 계층 이상에 대해서는 테스트할 수 없는 명령어도 있다고 작년에 CU에게 들었던 기억이 있다. 이렇게 파편화되어있는 기억을 다듬어서 글을 작성해보자!

     

     

    ping

    ping-pong에서 따온 용어라 생각했다. 실제로 사용하는 레퍼런스도 있고.

    하지만! Packet Internet Groper의 약어란다. 여기서 Groper는 더듬다라는 의미로써 인터넷 패킷을 더듬어 네트워크 상태를 진단한다는 의미로 사용된듯하다. 진단하는 방법으로는 지정한 대상에게 패킷을 전송하고 대상이 보내는 응답을 분석한다. 이 과정에서 ICMP라는 프로토콜을 사용하여 통신하는데 프로토콜이란 한 지점에서 다른 지점으로 서로 통신할 때에 사용하는 규약이다. 즉 ping은 상태를 진단하려는 주체와 대상 간에 ICMP라는 규칙을 이용하여 소통하는 방법이다. 여기서 ICMP는 OSI 7 계층의 3 계층에 해당하는 Network 계층에 속하는 프로토콜이다. 그렇기에 4 계층에서 사용하는 port 정보를 이용하지 않는다. 글의 초반부에 가졌던 의문인 포트를 지정할 수 없는 명령어는 ping임을 알 수 있다. 이러한 ping의 특성 때문에 port 정보를 사용하기 위해서는 다른 명령어를 사용하라고 제안하는 글도 있다.

    ping을 사용하는 가장 기본적인 방법은 아래와 같다.
    ping [대상 목적지]

     

    로컬호스트로 ping을 보낸 예시, 종료 후 통계도 보여준다.

     

    추가적으로 목적지 뒤에 붙을 수 있는 옵션들은 아래와 같다.
    -i 패킷의 바이트 크기 지정
    -n 횟수
    -f 연속 수행

    더 자세한 내용은 링크를 참고하자

     


     

    telnet

    앞서 ping에 대해 살펴보았을 때 port 정보를 사용하기 위해서는 다른 명령어를 이용할 수 있다는 정보를 얻었다. 바로 telnet이다.

    결론부터 말하자면 telnet은 ping과 성격이 다른 명령어이다. ping이 단지 요청을 보내고 받아서 분석하는 명령어라면 telnet은 컴퓨터와 컴퓨터 사이를 연결해주는 명령어다. 많이 사용했던 ssh의 하위 호환이라고 생각하면 될까나. 기존에 telnet이 많이 사용되었지만 보안의 문제로 ssh로 대체되고 있고 실제로 나도 컴퓨터 간 통신을 할 때에 ssh를 사용했다.

    원격 터미널 접속 기능이 있는 telnet이지만 가볍게 endpoint의 health check를 할 수 있기에 나는 제한된 방식으로 사용했다고 할 수 있겠다.

    health check에 대한 사용법은 아래와 같다.
    telnet [대상 목적지] [대상 포트번호]

     

    칵테일픽 사이트에 연결한 후 GET 요청을 보냈다. 2.0 버전 적용을 해둔거 같은데 안된다고 한다.

     

    AWS  보안그룹으로 22번 포트는 ssh에만 열어줘서 protocol mismatch라는 오류가 발생한다.

     

    열려있지 않은 포트(1111)로 접속해보니 time out으로 실패한다.

     


     

    curl

    서버와 통신할 수 있는 커맨드 명령어 툴이라고 한다. 설명이 어렵지만 그냥 터미널 환경에서 웹 브라우저처럼 요청을 보내고 응답을 받는 도구라고 생각하면 된다. 즉 endpoint에 HTTP 프로토콜을 이용하여 PUT, POST 등의 요청을 보내고 그 결과를 확인하는 데에 활용할 수 있다. curl의 장점은 HTTP 프로토콜뿐 아니라 다양한 프로토콜을 이용할 수 있다는 점이다.

    curl 명령어로 서버의 상태를 확인하기도 했지만 블로그나 책을 통해 학습하며 상세한 서버의 요청을 확인하는 예시에서 활용했던 경험이 있다. (예를 들자면 "~~~~~로 curl을 보내서 반환되는 html을 확인해보아요"와 같은 문구)

    사용법은 아래를 참고.
    curl [대상 목적지] (디폴트는 GET 요청)

     

    칵테일픽 사이트에 get 요청을 보내니 이미 몇번 접속한지라 301을 응답한다.

     

    추가 옵션들도 아래를 참고.
    curl -X [HTTP method] [대상 목적지]
    curl -H ['헤더 타입: 헤더 값'] [대상 목적지]
    curl -d ['바디 타입: 바디 값'] [대상 목적지]

     


     

    마치며

    이렇게 세 가지 명령어를 정리하고 보니 셋은 다른 목적으로 만들어진 툴이었다. 물론 셋 다 외부 요청을 보내서 서버나 어플리케이션 헬스체크를 할 수는 있지만 각각의 명령이 가지는 핵심 기능이나 철학을 알고 사용하면 더 적절한 상황에 적절한 툴을 활용할 수 있을 거라 생각한다. 간만에 블로그 글을 작성했는데 재미있었다. 다음 주에도 새로운 글로 찾아오겠습니다!

    댓글

Toneyparky Blog