네트워크는 어떻게 동작하나요 ?: ping 동작과정 전격해부
오늘은 실제 업무에서 많이 사용하는 네트워크 상태 확인 방법 중 하나인 `핑(Ping)` 명령어에 대해 알아보겠습니다.
1. 핑(Ping) 명령어란?
핑(Ping)은 네트워크 상태를 확인하기 위한 기본적인 명령어입니다. 웹사이트에 접속할 때 브라우저를 이용해 직접 확인할 수도 있지만, 터미널에서 핑 명령어를 사용하면 더 간편하게 네트워크 연결 상태를 확인할 수 있습니다.
$ ping google.com
또는
$ ping 8.8.8.8
첫 번째 예시는 도메인 이름을 사용하고, 두 번째 예시는 IP 주소를 사용합니다. 구글의 경우, `8.8.8.8`은 구글에서 운영하는 공용 DNS 서버의 IP 주소입니다.
google.com 와 같은 도메인 주소를 기준으로 ping 을 시도한다면 DNS 서버를 통해서 먼저 google.com 에 대한 실제 구글 웹서버 IP 주소를 가져오는 동작이 선행되고 그 후에 ping 명령어의 본래 동작인 ICMP 패킷 전송을 합니다.
2. ICMP 패킷 추적 실습
ICMP(Internet Control Message Protocol)는 네트워크 장치 간의 오류 메시지와 운영 정보를 전달하기 위해 사용되는 프로토콜입니다. ICMP 패킷은 TCP/IP 통신처럼 로그인이나 결제같이 유저의 의미있는 데이터를 포함하지않고 주로 네트워크 상태를 확인하거나 문제를 해결하기 위해 사용됩니다. 대표적인 명령어로는 `ping`이 있습니다. 예를 들어서 구글 웹서버 IP 주소가 216.58.203.68 라면 아래와 같이 ICMP 패킷추적을 할수 있습니다.
$ ping google.com PING google.com (216.58.203.68) 56(84) bytes of data. 64 bytes from kix06s11-in-f14.1e100.net (216.58.203.68): icmp_seq=1 ttl=57 time=35.9 ms 64 bytes from kix06s11-in-f14.1e100.net (216.58.203.68): icmp_seq=2 ttl=57 time=36.0 ms
$ sudo tshark -i eth0 -f icmp -Y "ip.dst == 216.58.203.68 or ip.src == 216.58.203.68" Capturing on 'eth0' 1 0.000000000 10.0.2.15 → 216.58.203.68 ICMP 98 Echo (ping) request id=0x43a3, seq=1/256, ttl=64 2 0.029950553 216.58.203.68 → 10.0.2.15 ICMP 98 Echo (ping) reply id=0x43a3, seq=1/256, ttl=57 (request in 1)
하지만 예를 들어 네이버 웹서버 IP 주소가 223.130.200.219 라면 네이버 웹서버에서는 아래와 같이 ICMP 에 대한 응답을 안할 수 있습니다.
$ ping naver.com PING naver.com (223.130.200.219) 56(84) bytes of data
아래와 같이 ICMP 송신패킷만 추적되고 ICMP 수신패킷은 추적이 안되는것을 확인할 수 있습니다.
$ sudo tshark -i eth0 -f icmp -Y "ip.dst == 223.130.200.219 or ip.src == 223.130.200.219" Capturing on 'eth0' 1 0.000000000 10.0.2.15 → 223.130.200.219 ICMP 98 Echo (ping) request id=0x4425, seq=14/3584, ttl=64 2 1.024042876 10.0.2.15 → 223.130.200.219 ICMP 98 Echo (ping) request id=0x4425, seq=15/3840, ttl=64 ...
3. DNS 패킷 추적 실습
현재 리눅스 서버에 저장된 DNS 서버 IP 주소는 아래와 같이 확인 할 수 있습니다.
# DNS IP 주소 확인하기 $ sudo nmcli dev show $ sudo resolvectl status $ sudo systemd-resolve --status
DNS 통신과정을 추적하기 위해서 tshark 명령어를 사용할 수 있고 ping 동작과정에서 내부적으로 DNS 통신을 통해 google.com 의 IP 주소를 얻어 옵니다.
# DNS 동작과정 추적하기 $ sudo tshark -i eth0 -Y dns # 다른 터미널에서 $ ping www.google.com
4. ARP 패킷 추적 실습
ARP는 IP 주소를 MAC 주소로 변환하는 프로토콜입니다. 네트워크에서 데이터를 전송할 때, 송신 장치는 수신 장치의 IP 주소를 알고 있지만, 실제 데이터를 전달하기 위해서는 해당 IP 주소에 대응하는 MAC 주소를 알아야 합니다. 이때 ARP가 사용됩니다.
# ip neigh 명령을 통해서 ARP table 확인하기 $ ip neigh 192.168.0.18 dev enp0s3 lladdr 3c:6a:a7:c4:5a:8b REACHABLE 192.168.0.1 dev enp0s3 lladdr 88:36:6c:ec:ae:42 REACHABLE # arp 명령을 통해서 ARP table 확인하기 $ arp Address HWtype HWaddress Flags Mask Iface 192.168.0.18 ether 3c:6a:a7:c4:5a:8b C enp0s3 _gateway ether 88:36:6c:ec:ae:42 C enp0s3
ARP 패킷은 브로드캐스트를 통해 현재 네트워크 내부망에 모두 전송되고 내부망 IP 주소라면 "이 IP 주소의 MAC 주소는 무엇인가요?"라고 묻고
외부망 IP 주소라면 "게이트 웨이의 MAC 주소는 무엇인가요 ?" 라고 패킷을 전체적으로 뿌리게 됩니다.
# ARP 패킷 보내는 과정 추적하기 $ sudo tcpdump -xxi eth0 arp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
목적지 IP 주소가 내부망 IP 주소인지 외부망 IP 주소인지는 현재 사용중인 나의 IP 주소와 서브넷 마스크를 통해서 판단할 수 있고 예를 들어 google.com 의 실제 IP 주소가 216.58.203.68 일때 해당 IP 주소는 외부망 주소 이기 때문에 ARP 패킷 전송시 게이트웨이의 MAC 를 요청하는 패킷을 브로드 캐스크 하게 됩니다.
5. ping 동작과정 최종정리
아래와 같이 ping google.com 명령어를 실행하면 다음과 같은 단계로 정리 할 수 있습니다.
ping google.com
가장 최초에는 ICMP 통신을 하기위해서 목적지 IP 주소가 필요하고 google.com 도메인 주소를 IP 주소로 변환해야하기 때문에 DNS 서버와의 외부망 통신이 필요합니다. 따라서 외부망 통신을 위해서 ARP 패킷을 브로드 캐스트 하고 게이트 웨이의 MAC 주소를 구한후에 DNS 서버를 통해서 google.com 의 IP 주소를 얻어오고 해당 목적지 IP 주소를 기반으로 ICMP 통신을 할 수 있습니다.
1단계: ARP 통한 게이트 웨이 MAC 주소 획득
2단계: DNS 서버를 통한 google.com 의 IP 주소 획득
3단계: 해당 목적지 IP 주소 기준으로 ICMP 통신
위와 같은 내용의 대한 리얼리눅스 추천강의는 네트워크 완전정복입니다.
https://reallinux.co.kr/course/se_network