리눅스 통신 체크 - 서버 네트워크 통신 체크

정현우·2022년 5월 9일
3

Linux Basic to Advanced

목록 보기
10/16

리눅스 서버 네트워크 통신 체크

application layer, network layer 등의 다양한 형태의 네트워크 벽이 있다. 단순하게 타겟 서버로 네트워크 연결이 되는지, 서버 블랙리스트로 되어있진 않은지 등을 체크하기 위해 사용하는 명령어들을 체크해보자!

1. curl

  • 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구를 제공하는 컴퓨터 소프트웨어 프로젝트이고 libcurl와 cURL이라는 2개의 제품을 포함한다.

  • command line tool이다. HTTP, FTP, LDAP, TELNET, HTTPS, DICT와 같은 프로토콜을 지원하며, SSL을 가지는 각각의 프로토콜 역시 지원한다. 또한 HTTP기반의 upload, proxies, cookies, user+password 인증을 사용할 수도 있다.

1) libCURL

  • 깃허브

  • server <-> client 통신의 프로세스에서 중계역할을한다. 사용은 context 객체와 요청데이터 (URL, 인자)와 콜백(callback functions)형식의 response handler를 정의해 주면된다.

  • 이 객채를 라이브러리에 넘기게 되면, 라이브러리는 저수준에서 일어나는 네트워크 통신을 알아서 핸들하고 그 결과 값을 response handler를 통해서 넘겨주게 된다.

  • libCURL은 고수준의 라이브러리로 프로그래머는 프로토콜이 어떻게 생겨먹었는지에 대해서 신경쓸 필요 없이, 데이터만 넘겨주는 정도로 필요한 프로그램을 작성할수 있다. libCURL이 Application 계층아래를 완전히 추상화 시켜주기 때문이다.

2) curl 사용하기

> curl naver.com
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center> NWS </center>
</body>
</html>

# 그냥 naver.com에 redirect를 걸어놓았다. 

> curl https://www.naver.com
<중략>
...
# index.html에 해당하는 DOCS의 내용이 주르르륵 나온다
  • 다양한 통신 프로토콜을 Application 수준에서만 고민하고 바로 요청을 보낼 수 있다. 사용법은 기본적으로 위와같이 아주 간단하다. 하지만 우린 chrome등과 같은 브라우저들을 통해 curl을 더 손 쉽게 사용할 수 있다.

  • 브라우저를 naver.com 으로 들어가서 "개발자 도구 -> 네트워크 -> 문서탭" 에서 아래 사진과 같은 www.naver.com 문서의 응답을 확인해보자!

  • 그리고 "우클릭 -> 복사 -> cURL로 복사"를 눌러보자

  • 그러면 아래와 같은 curl 커멘드가 딱! 나온다. 이걸 그~대로 터미널(또는 cmd)에 붙여넣기 하면 똑같은 응답을 얻을 수 있다.
    • 백슬래시()는 줄띄움을 이어주기 위해 존재한다.
    • -H 옵션은 헤더 값을 추가해주는 것이다.
    • (아래 요청에서 쿠키는 임의로 지웠다.)
curl 'https://www.naver.com/' \
  -H 'authority: www.naver.com' \
  -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'accept-language: en,ko-KR;q=0.9,ko;q=0.8,en-US;q=0.7' \
  -H 'cache-control: no-cache' \
  -H 'pragma: no-cache' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  -H 'sec-fetch-dest: document' \
  -H 'sec-fetch-mode: navigate' \
  -H 'sec-fetch-site: none' \
  -H 'sec-fetch-user: ?1' \
  -H 'upgrade-insecure-requests: 1' \
  -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36' \
  --compressed
  • 이게 아주 기본적인 curl을 사용하는 방법이다. 아주 다방면으로 curl을 통해 요청을 주고 받을 수 있다.

2. 통신 체크

telnet, ping, traceroute, netstat, ss, nslookup 을 기본적으로 알아보자!

1) telnet

  • 텔넷(TELNET)은 인터넷이나 로컬 영역 네트워크 연결에 쓰이는 네트워크 프로토콜이다. RFC15를 시작으로 1969년에 개발되었으며 최초의 인터넷 표준들 가운데 하나로서 IETF STD 8로 표준화되었다.

    • IETF는 internet enginnering task force, 국제 인터넷 표준화 기구다.
  • telnet이라는 용어는 프로토콜의 클라이언트 일부 기능이 추가된 소프트웨어를 일컫는다. 텔넷 클라이언트는 대부분의 유닉스 시스템에서 여러 해 동안 사용할 수 있으며, 실질상 모든 플랫폼에서 사용할 수 있다. TCP/IP 스택을 갖춘 대부분의 네트워크 장비와 운영 체제들은 원격 구성(윈도 NT 기반)을 위해 몇 가지 종류의 텔넷 서비스 서버를 지원한다. 텔넷의 보안 문제 때문에 사용률이 감소하여, 원격 제어를 위해 SSH로 대체되기도 하였다.

    • 모든 데이터를 평문으로 전송한다. 데이터 유출시 모두 평문이라 보안상 이슈가 크다! 실 서버 대상으로는 사용하지 않는 것이 바람직하다.
  • 일반적으로 텔넷이 1973년 3월 5일까지 어떠한 공식적 정의도 없는 ad hoc 프로토콜이었으나, 이 이름은 실제로 RFC 206 (NIC 7176)로서 텔레타입 오버 네트워크 프로토콜(Teletype Over Network Protocol)을 가리키는 말이었다.

  • 과거에 "원격 터미널 접속서비스" 로써 많이 사용했다. TCP 23포트를 default로 사용한다. 물론 포트 변경은 가능하다.

  • 일종의 터미널 에뮬레이션 프로토콜로 NVT(Network Vortual Terminal), 네트워크 가상 단말기 라고 불리는 가상터미널 개념을 사용했다.

  • 송신 호스트로부터 수신 호스트로 데이터를 전송할 때 두 시스템에서의 데이터 양식이 다르기 때문에 데이터를 변환시키는 가상 장치이다. 텔넷 프로토콜은 네트워크 가상 단말기(NVT)를 포함하고 있으며, 클라이언트는 서버로부터 받은 NVT 코드를 화면 처리를 위한 적절한 코드로 바꾸고, 사용자 키보드로부터 받은 입력을 NVT 코드로 바꾸는 처리 등을 수행한다.

  • 통신 과정 살펴보기

2) telnet 활용해서 포트 확인하기

  • telnet의 성질을 활용해서 telnet 127.0.0.1 8080 와 같은 방법으로 포트 open 여부를 체크할 수 있다.

  • 원격접속도 가능하다. 하지만, 이제 ssh를 사용하는것이 바람직하다.

3) ping(Paket Internet Groper)

  • 핑은 IP 네트워크를 통해 특정한 호스트가 도달할 수 있는지의 여부를 테스트하는 데 쓰이는 컴퓨터 네트워크 도구 중 하나이다.

  • 기본적인 작동 원리는 네트워크 상태를 확인하려는 대상(target) 컴퓨터를 향해 일정 크기의 패킷(packet, 네트워크 최소 전송단위)을 보낸후(ICMP echo request) 대상 컴퓨터가 이에 대해 응답하는 메시지(ICMP echo reply)를 보내면 이를 수신, 분석하여 대상 컴퓨터가 작동하는지, 또는 대상 컴퓨터까지 도달하는 네트워크 상태가 어떠한지 파악할수 있다.

    • ICMP(Internet Control Message Protocol, RFC 792): 인터넷 프로토콜의 비신뢰적인 특성을 보완하기 위한 프로토콜로 IP 패킷 전송 중 에러 발생 시 에러 발생 원인을 알려주거나 네트워크 상태를 진단해주는 기능을 제공.
    • ps) 3계층과 4계층 사이에 있으며 TCP/IP가 계층화가 제대로 이루어지지 않았다는 예시로 언급되는 프로토콜이다. 출처: https://itwiki.kr/w/ICMP
  • ping 명령은 TCP/IP 프로토콜 중 ICMP(Internet Control Message Protocol)을 통해 동작하므로, 이 프로토콜을 지원하지 않는 기기를 대상으로 ping 수행할수 없습니다 또한 보안의 이유로 ICMP 사용을 차단하는 기기역시 ping 요청에 대응하지 않습니다

  • 그리고 Ping은 Port를 사용하지 않는다. ICMP는 OSI 7layer에서 "Internet" layer로 구분된다. 그래서 상위에 있는 TCP/UDP 의 포트와 상관이 없다! 단순하게 호스트와 메시지를 주고받기 위한 프로토콜이다.

사용하기 (리눅스기반 이며 계열마다 사용 옵션이 상이할 수 있음)

  • ping [목적지] [option] [전송되는 패킷] 이 가장 기본적인 형태며, 심플하게 ping naver.com 과 같이 사용 가능하다. 그리고 기본적으로 요청 서버 ip를 확인할때 쉽게 바로 사용이 가능하다. (아래 네이버는 ping을 막아 뒀다. google 을 보면 정상적으로 오는 핑이다.)

  • ping 명령에서 -l 옵션을 주면 ping 수행시 전송되는 패킷(데이터가 전송되는 단위)의 크기를 지정활수 있다. ping naver.com -l 100

  • ping 명령에서 -n 옵션을 주면 ping 수행시 지정된 횟수 만큼 실행할 수 있다. ping naver.com -n 10

4) traceroute

  • traceroute 혹은 tracert는 인터넷을 통해 거친 경로를 표시하고 그 구간의 정보를 기록하고 인터넷 프로토콜 네트워크를 통해 패킷의 전송 지연을 측정하기 위한 컴퓨터 네트워크 진단 유틸리티이다. OS 계열에 따라서 이용되는 프로토콜이 다르다.

  • 요청을 보내는 서버로 부터 목적지까지 경유하는 시스템 정보를 모두 체크하고 확인할 수 있다. 체크가능한 아래 항목을 보자.

  1. 경유하는 router의 개수
  2. 경유하는 router의 ip와 도착 시간
  3. filtering 유무
  4. border router 의 ip
  • 중요하게 체크해야 할 부분은, ping과 traceroute 모두 ICMP 프로토콜을 제한하는 라우터가 중간에 존재할때 해당 정보를 파악할 수 없다!

사용하기 (리눅스기반 이며 계열마다 사용 옵션이 상이할 수 있음)

  • 간단하게 traceroute [목적지] 로 사용이 가능하다.

  • 기본적으로 최대 30홉까지만 진행되기 때문에 짤릴 수 있다.

    • 홉은 출발지와 목적지 사이에 위치한 경로의 한 부분이다. 데이터 패킷은 브리지, 라우터, 게이트웨이를 거치면서 출발지에서 목적지로 경유한다. 패킷이 다음 네트워크 장비로 이동할 때마다 홉이 하나 발생한다. 홉 카운트(hop count)는 데이터가 출발지와 목적지 사이에서 통과해야 하는 중간 장치들의 개수를 가리킨다.
  • 사내 망 네트워크가 icmp가 모두 세팅이 되어 있다면, 어디 경로에서 문제가 있는지 체크가 가능하다.

5) netstat(network statistics)

  • 전송 제어 프로토콜, 라우팅 테이블, 수많은 네트워크 인터페이스(네트워크 인터페이스 컨트롤러 또는 소프트웨어 정의 네트워크 인터페이스), 네트워크 프로토콜 통계를 위한 네트워크 연결을 보여주는 명령 줄 도구이다. OS X, 리눅스, 솔라리스, BSD를 포함한 유닉스 계열 운영 체제와 윈도우 XP, 윈도우 비스타, 윈도우 7, 윈도우 8, 윈도우 10을 포함한 윈도우 NT 기반 운영 체제에서 이용이 가능하다. 네트워크의 문제를 찾아내고 성능 측정으로서 네트워크 상의 트래픽의 양을 결정하기 위해 사용된다.

  • 성능 측정보다는 문제점 판별에 더 많이 사용되어 왔다. netstat 명령을 사용하여 네트워크의 트래픽 양을 판별하면 성능의 문제가 네트워크 과잉으로 인한 것인지 여부를 판단할 수 있다.

사용하기

  • 옵션부터 살짝 살펴보자

    • a : 현재다른PC와 연결(Established)되어 있거나 대기(Listening)중인 모든 포트 번호를 확인
    • r : 라우팅 테이블 확인 및 커넥션되어 있는 포트번호를 확인
    • n : 현재 다른PC와 연결되어 있는 포트번호를 확인
    • e : 랜카드에서 송수한 패킷의 용량 및 종류를 확인
    • s : IP, ICMP, UDP프로토콜별의 상태 확인
    • t : tcp protocol
    • u : udp protocol
    • p : 프로토콜 사용 Process ID 노출
    • c : 1초 단위로 보여줌
    • 더 자세하게 옵션 체크하기
  • 간단하게 netstat -antplF 로 체크 가능하다. (아래 사진은 ubuntu OS)

  • Local Address column은 현재 열려있거나 혹은 리스닝하고있는 ip, port를 나타낸다. 즉 0.0.0.0:8000은 Foreign Address가 0.0.0.0:* 로 표시되어 있는데, all interface를 받는다는 의미이며, 모든 ip에 대해 열려있다는 뜻이다.

  • 출력되는 컬럼들은 아래와 같다.

    • Proto : 프로토콜 종류. TCP / UDP / RAW
    • Recv-Q : 해당 process가 현재 받는 바이트 표기
    • Send-Q : 해당 process가 현재 보내는 바이트 표기
    • Local Address : 출발지 주소 및 포트. 자신의 주소 및 포트
    • Foreign Address : 목적지 주소 및 포트
    • State : 포트의 상태 표기.
      • CLOSED
      • CLOSED_WAIT
      • CLOSING
      • ESTABLISHED : 연결 완료
      • FIN_WAIT1
      • FIN_WAIT2
      • LAST_ACK
      • LISTEN : 대기 포트. 포트 open
      • SYN_RECV
      • SYN_SENT
      • TIME_WAIT
      • UNKNOWN
  • 리눅스에서 net-tools의 일부인 netstat은 시대에 뒤쳐진 것으로 간주되며, iproute2의 일부인 ss를 대신 사용하여야 한다.

6) ss

  • ss 명령은 Linux 시스템에서 네트워크 소켓 관련 정보를 표시하는 데 사용되는 도구이다. 이 도구는 활성 소켓 연결을 표시하는 데 사용되는 netstat 명령보다 자세한 정보를 표시한다. 그래서 netstat를 대체해서 사용하며, 대채 사용이 장려된다.

사용하기 (리눅스기반 이며 계열마다 사용 옵션이 상이할 수 있음)

  • 옵션 없이 ss 만 사용하면 상태 관계 없이 모든 연결을 나열한다.

  • 출력되는 컬럼 State, Recv-Q, Send-Q, Local Address:Port 는 netstat와 동일하다.

  • 모든 수신 TCP 연결은 ss -lt 로, 모든 UDP 연결은 ss -la로 가능하다. 그리고 카운팅, 요약 통계로 ss -s 사용이 가능하다.

  • ss -p 는 프로세스 명을 표시하기 때문에 특정 포트에서 실행되는 프로그램을 찾을 때 매우 유용하다. 위 명령어와 섞어서 ss -ltp로 사용 가능하다.

7) nslookup(name server lookup)

  • 도메인 네임을 얻거나 IP주소 매핑 또는 다른 DNS 레코드를 DNS에 질의할 때 사용한다. 네트워크 유틸리티, 툴로써 많은 컴퓨터 OS에서 지원한다.

  • nslookup [목적지] 로 간단하게 사용이 가능하다.

  • 상세한 옵션이 존재한다. 전체적으로 살펴보자

  • DNS이 세팅이 잘 되었는지 체크할때 유용하게 사용한다.


마무리

  1. telnet 사용이 가능한 환경이며, 포트 open 여부만 빠르게 체크 하고 싶다 -> telnet [목적지주소] port 활용하기. 즉 로컬 포트 체크라면 127.0.0.1을 사용하면 된다.
  2. 목적지의 ip 주소와 패킷 전송이 되는지, 통신 자체는 되는지 빠르게 체크하고 싶으면 -> ping [목적지주소] 활용하기.
  3. 사내 망 네트워크 flow 체크를 하고 싶다 -> traceroute [목적지주소] / 나의 요청이 특정 서버에 계속 어딘가에서 막히는 것 같을 때도 우선 사용해봄직 하다.
  4. netstat는 지양하고 ss로 대체해서 사용하자. 현재 서버의 open(리스닝)된 포트와 outbound를 보고 싶으며 process도 같이 체크하고 싶다 -> ss -ltp
  5. 도메인 세팅이 잘 되었는지 체크하고 시다 -> nslookup www.steelboso.com
profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글