들어가면서
서버가 외부 혹은 다른 서버와 통신이 되는지 테스트할 때 ping, telnet, curl 등의 명령어를 사용합니다. 그런데 각각이 어떤 역할을 가지고 있는지 잘 모르고 사용하고 있다보니까, ping을 날려봐도 결과를 봐도 어떤 의미를 가지는지를 잘 이해못하겠더라구요.
ping 때렸는데 어? 안되네? 막혀있나? 이정도 수준으로만 해석 가능했습니다.
ping은 잘 되도 그 서버와 접속이 안될 수도 있다는 것을 아시나요.
그래서 이번 기회에 함 정리해보고자 합니다.
네트워크 테스트에 사용하는 명령어
- ping
- telnet
- curl
- netstat
1. ping (ping 주소)
ping은 "상대 네트워크 장비가 살아있는지 확인하는 명령어" 입니다. 다만, ping이 된다고 그 서버와 통신이 가능하다는 의미는 아닙니다.
A서버에서 B서버에 ping을 날렸을 때 B서버가 살아있는지를 확인할 수 있는겁니다. 간단하게 말하자면 B서버가 켜져있으면 ping했을 때 정상적으로 응답이 오겠지요.
물론 서버가 켜져있다고 다 응답이 오는 건 아닙니다. 우선 응답해야 하는 서버가 ICMP 프로토콜 통신을 허용해놔야 합니다. ICMP는 ping이 사용하는 보조용 통신 프로토콜이라고 이해하면 될 것 같습니다.
AWS에 내가 EC2를 하나 띄어놨는데 인바운드(외부에서 들어오는 요청)을 다 막아두면 그 서버로 ping을 때려도 응답을 받지 못합니다.
궁금해서 알아봤는데, 제 친구집 공인 IP에 ping 때려도 보통 라우터단에서 ICMP를 차단해가지고 응답을 못받는다고 합니다. 대신에 같은 WiFi나 같은 LAN단에서는 내부 IP끼리 ping을 때리면 가능하다고 합니다.

2. telnet (telnet 주소 포트)
telnet은 특정 서버의 TCP 포트로 연결을 시도하는 프로토콜 및 명령어입니다. 즉, "포트 연결 확인용" 명령어입니다.
그러니깐, 그 서버에 내가 이 포트로 접속할건데 이 포트 뚫려있어?를 질문하는 명령어입니다. 참고로 포트가 뚫려있어도 그 포트에서 리슨중인 서비스가 없으면 telnet 통신을 실패합니다.


telnet 성공 결과는 제가 사용하고 있는 서버의 주소입니다. 22번 포트가 뚫려있는지 확인해본거고 성공한 걸 확인할 수 있습니다.
telnet 실패 결과는 구글 서버의 주소입니다. 당연히 22번 포트가 막혀있어서 접속 실패하는 것을 볼 수 있습니다.
A 서버에서 B 서버의 DB(MySQL, 3306 포트)에 접속하기 위해 telnet 명령어를 사용하여 해당 포트가 열려 있는지 확인할 수 있습니다. 만약 telnet B서버 3306이 실패한다면, A나 B 서버 측 방화벽 설정, 또는 네트워크 장비나 기관의 보안 정책에 따라 통신이 차단되었을 가능성을 확인해봐야 합니다.
(그나저나, ssh 전에는 telnet으로 서버에 원격 접속했다고 하더라구요. 보안이 안되는 등의 이슈로 ssh를 많이 사용한다고 합니다.)
3. curl
curl은 URL 기반의 요청을 보내고 응답을 받는 명령어입니다. HTTP/HTTPS 외에도 FTP, SCP 등의 전송 프로토콜을 지원합니다.
curl은 다양한 기능을 제공하긴 하지만, 네트워크 테스트를 하는 관점에선 적절한 명령어가 아닙니다.
예를 들어 B서버와 http 통신이 되는지 보려면 B서버의 http 통신용 포트(예를 들어 80)에 대하여 telnet을 날리는 것으로 충분합니다.
4. netstat (ss)
netstat은 현재 시스템의 네트워크 연결 상태, 포트 사용 현황, 라우팅 테이블 등을 출력해주는 명령어입니다. (Network Statistics)
최신 서버들은 netstat대신 ss를 사용한다고 합니다.
열려있는 포트, 라우팅 등을 볼 수 있다고 합니다.
포트 관련 명령어 (맥 기준)
현재 열려있는 포트 확인 :
netstat -anv | grep LISTEN
특정 포트 리슨중인지 확인:
netstat -anv | grep 포트번호


=> 근데 맥이면 `lsof -i :포트번호` 방식으로 확인할 것 같긴 하네요.
라우팅 관련 명령어 (맥 기준)
라우팅 테이블 보기:
netstat -nr

라우팅 테이블 실제로는 처음 보는데 신기하더라구요. 평소에는 거의 안쓸거같은데 궁금해서 찾아봤습니다.
default 172.30.1.254 UGScg en0
=> 모든 외부 트래픽의 기본 라우팅 경로 (내가 알지 못하는 모든 IP의 트래픽은 게이트웨이를 통해 나가라)
en0는 이더넷 네트워크 인터페이스 이름 (EtherNet)
127 127.0.0.1 UCS lo0
127.0.0.1 127.0.0.1 UH lo0
=> 루프백이 라우팅 테이블에 정의되어 있는 모습
lo0이 루프백 네트워크 인터페이스 이름
172.30.1.7/32 link#11 UCS en0 !
=> link#11: 시스템 내부에서 네트워크 인터페이스를 빠르게 참조하기위한 정수형 ID (ID 11의 정체는 en0)
172.30.1.7로 가는 트래픽은 link#11로 전송해라.