개요.

실무를 접하면서 포트 접근 요청을 보내는 일이 빈번한데, 매번 이 부분을 간과하고 헤맬때가 많다. 그래서 정리하기 위함.

  • ping
  • telnet

 

설명.

포트는 소프트웨어적인 관점에서 보면 어느 특정 프로세스에 대한 논리적인 단위 또는 주소라고 말할 수 있다. 사실 모든 컴퓨터에는 포트가 있으며. 포트는 약 65000개의 정도가 있다. 여기서 0번 ~ 1024번 까지의 포트는 잘 알려진 포트라고 부르고 있으며 범용적으로 해당 포트들을 약속해서 사용하고 있다. (예를들어, 22번, 80번, 443번 등등 : ssh, web server, https)

 

포트는 앞서 말했다시피 특정한 프로세스의 논리적 단위인데, 왜 이것이 논리적인 단위로 구분할 수 있을까.

  • 특정한 서버 호스트에 띄어져 있는 무수한 프로세스(=프로그램)들이 존재한다.
  • 해당 서버의 IP 를 통해 특정한 호스트로 접근할 수 있다.
  • 해당 호스트까지는 접근했지만, 어느 프로세스로 접근해야 하는데 그러한 정보가 없다.
  • 이 때 사용하는 것이 포트이다.

OSI 7 계층의 관점에서 살펴보면 레이어는 각기 다른 역할을 수행하는데, 네트워크 레이어의 계층의 IP 프로토콜을 통해 해당 호스트에 접근하고, 네트워크레이어를 거쳐 트랜스포트 레이어로 디캡슐레이션된다. 그리고 이후 사용하는 데이터는 세그먼트이며, 해당 계층에서 주로 사용하는 프로토콜이 흔히들 우리가 듣는 TCP/IP 인 것이다. 이 때 전송하는 데이터의 헤더를 살펴보면 포트가 있으며, 이 포트가 해당 가려고 하는 프로세스, 엔드포인트가 되며 우리는 해당 계층을 통해 해당 서버에 실행되고 있는 프로그램들을 구분할 수 있는 것이다.

 

  • 트랜스포트 레이어의 전송 데이터 단위 : 세그먼트 (헤더 + 페이로드) : 헤더에 포트가 있다.
  • 네트워크 레이어의 전송 데이터 단위 : 패킷 (헤더 + 페이로드) : 헤더에 IP 가 있다.

여기서 헤더를 살펴보면 해당 전송하는 데이터가 어떠한 목적을 지녔는지 파악할 수 있다.

 

결론적으로 포트를 개방한다는 것은 우리가 어느 특정한 원격지의 호스트에 접속을 하려고 하는데, 이를 개방해서 우리가 접근 또는 접속하기 위함인 것이다.

 

그렇다면 원격지 호스트의 인터넷 연결 그리고 포트가 열린 여부에 대한 파악을 어떻게 하는 것이 좋을까? 명령어를 통해서 확인할 수 있다.

 

인터넷을 살펴보면, nc -z {호스트 주소} {포트} 와 같은 명령어를 입력하라고 하는데 리눅스 서버에 따로 설치할 수 있는 권한이 없고, 주어진 설정에만 맞추기 때문에 제약사항이 있다면, 아래와 같이 확인하자.

 

첫번째

우선 해당 원격지 호스트(이하 서버) 의 연결상태를 점검하여야 한다. 패킷을 보내고 되돌아오는지 여부를 확인하여 연결상태를 진단한다.

 

ping 명령을 이용한다.

 

ping {IP 또는 도메인}

  • ping (bing.com | facebook.com | google.com}
  • 도메인 주소로 ping 명령을 실행하면 DNS서버에 질의하여 대상 호스트의 IP 를 알아내고 ping 을 수행한다. 
    • 도메인 주소로는 ping 이 날라가지 않고, ip 주소로 ping 이 날라간다. :: dns 등록이 되지 않은 상태이다.
  • ping naver.com 으로 하였을 때는 요청시간이 만료되었습니다.
    • 위의 내용처럼 뜬다면, 대상 컴퓨터가 작동불능이거나 또는 대상 컴퓨터까지 네트워크 연결이 불가능함을 의미한다. 또는 방화벽으로 막혀있는 경우가 있다.
    • 방화벽으로 차단한 이유는 무엇인가? ☞ ping 명령어를 열어두는 것만으로도 공격에 활용될 소지가 있기 때문에 관리자는 보안적인 요소와 더불어 트래픽 관리차원에서 ping 명령어를 막기도 한다고 한다. (e.g.블레이스웜)

 

두번째

서버에 접속여부를 체크한다. 포트 점검을 한다. (목적은 포트 점검이 아니지만 포트 점검을 위한 용도로 자주 쓰인다.)

 

telnet 명령을 이용한다.

 

telnet {IP} {Port}

  • Connection Time out 이 발생한다면, 네트워크에 해당 IP 를 찾지 못한 경우이다.
  • Trying 192.0.0.1 만 계속 나오면, 방화벽 오픈이 되지 않은 상태이다.
  • Connection refused 가 나오면 오픈은 되었으나, 프로세스가 올라가지 않은 상태이다.
    • acl 허용되고, 이후에 특정 포트로 프로세스가 올라갔는지 혹은 올라갔더라도 접속 호스트 권한이 막혀있는지 이거는 별도로 다시 한번 확인을 해줘야한다.
  • Connected to 192.0.0.1 이면, 방화벽 오픈이 정상적으로 되었고, 프로세스가 올라가서 접속이 된 경우이다.
  • Host {ip} is not allowed to connect to this {service-name} serverConnection closed by foreign host.
    • 해당 포트로 방화벽 미 오픈되어있는 상태이다. 접근할 수 없다.

추가적으로 아래와 같이 curl 과 telnet 을 조합해서 쓸 수 있는 방법도 있다.

 

curl -v telnet://{ip}:{port}

 

예전에 공부했던 네트워크 지식들이 실무를 접하면서, 막상 어떻게 해야할지 모르는 사실에 조금 민망스럽다. 그래도 이렇게나마 부족한 부분을 채워야 다음에 반복된 헤매임을 하지 않을 듯 하다.

 

 

관련링크

https://thebook.io/006718/part01/ch03/06/03/

https://zetawiki.com/wiki/%ED%85%94%EB%84%B7#cite_note-2

Posted by doubler
,