Linux 에서 tcpdump 를 사용하여 이더넷 프레임 분석하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 강력한 tcpdump 명령줄 도구를 사용하여 Linux 시스템에서 네트워크 트래픽 분석의 기초를 배우게 됩니다. 주요 목표는 데이터 링크 계층에서 이더넷 프레임을 캡처하고 검사하여 로컬 네트워크를 통한 전송을 위해 데이터가 어떻게 구조화되는지에 대한 실습 경험을 제공하는 것입니다. 저수준 네트워크 통신을 식별하고 해석하는 실질적인 기술을 습득하게 됩니다.

먼저 tcpdump를 설치하고 활성 네트워크 인터페이스를 식별하는 환경 준비부터 시작합니다. 다음으로 실시간 네트워크 활동을 모니터링하기 위해 라이브 패킷 캡처를 시작합니다. 다양한 통신 패턴을 이해하기 위해 ping 명령을 사용하여 유니캐스트 트래픽을 생성하고 ARP 를 통해 브로드캐스트 트래픽을 생성합니다. 캡처된 출력을 검사하여 이더넷 프레임 헤더를 분석하고 유니캐스트 및 브로드캐스트 MAC 주소를 구별하는 방법을 배우게 됩니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 98%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

tcpdump 설치 및 네트워크 인터페이스 식별

이 단계에서는 네트워크 분석 환경을 준비합니다. 여기에는 강력한 명령줄 패킷 스니퍼인 tcpdump를 설치하고 기본 네트워크 인터페이스의 이름을 식별하는 두 가지 주요 작업이 포함됩니다. 패킷 스니퍼를 사용하면 네트워크를 통해 이동하는 데이터를 "볼" 수 있으며, tcpdump는 모니터링할 특정 네트워크 연결을 알아야 합니다.

먼저 tcpdump가 설치되었는지 확인합니다. 표준 도구이지만 존재 여부를 확인하는 것이 좋습니다. apt 패키지 관리자를 사용합니다. sudo apt update 명령은 패키지 목록을 소프트웨어 저장소와 동기화하고, sudo apt install tcpdump -y 명령은 -y 옵션을 사용하여 설치를 자동으로 확인하면서 도구를 설치합니다.

터미널에서 다음 명령을 실행합니다.

sudo apt update
sudo apt install tcpdump -y

설치가 완료된 후 tcpdump 버전을 확인하여 설치를 확인할 수 있습니다.

tcpdump --version

다음과 유사한 출력이 표시되어 도구를 사용할 준비가 되었음을 확인할 수 있습니다. 버전 번호는 다를 수 있습니다.

tcpdump version 4.99.x
libpcap version 1.10.x
OpenSSL 3.0.x [Date]

다음으로 모니터링할 네트워크 인터페이스의 이름을 찾아야 합니다. 컴퓨터에는 여러 인터페이스 (예: 유선 이더넷, Wi-Fi 또는 가상 네트워크용) 가 있을 수 있습니다. ip addr 명령을 사용하여 사용 가능한 모든 네트워크 인터페이스와 해당 구성을 나열합니다.

이 명령을 실행합니다.

ip addr

출력에는 여러 인터페이스가 나열됩니다. 기본 활성 인터페이스를 찾아야 합니다. 종종 eth0 또는 enp0s3으로 명명됩니다. inet 주소 (IP 주소) 가 있고 UP 상태인 항목을 찾습니다.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:be:b3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.8/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159786sec preferred_lft 1892159786sec
    inet6 fe80::216:3eff:fe01:beb3/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:8a:88:cd:da brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

위의 예시 출력에서 인터페이스 이름은 eth0입니다. 다음 단계에서 필요하므로 특정 인터페이스 이름을 기록해 두십시오.

광범위한 캡처 시작 및 트래픽 관찰

이 단계에서는 실시간 네트워크 트래픽 캡처를 시작합니다. 데이터 링크 계층 (계층 2) 의 기본 데이터 단위는 이더넷 프레임입니다. 각 프레임은 전송되는 데이터뿐만 아니라 소스 및 대상 MAC 주소와 같은 중요한 주소 정보를 포함하는 디지털 봉투 역할을 합니다. 이 계층 2 세부 정보를 구체적으로 보기 위해 -e 옵션과 함께 tcpdump를 사용할 것입니다. 이 초기 캡처는 네트워크의 모든 활동을 파악할 수 있도록 필터링되지 않은 상태로 진행됩니다.

이제 캡처 프로세스를 시작해 보겠습니다. 이전 단계에서 식별한 인터페이스 이름 (예: eth0) 이 필요합니다. 네트워크 패킷을 캡처하려면 관리자 권한이 필요하므로 sudo를 사용합니다. 또한 tcpdump가 IP 주소를 호스트 이름으로 확인하는 것을 방지하기 위해 -n 플래그를 추가하고 출력을 더 깔끔하게 만들기 위해 -q를 추가합니다.

터미널에서 tcpdump 명령을 실행합니다. eth0을 실제 인터페이스 이름으로 바꾸는 것을 잊지 마십시오.

## 1단계에서 식별한 실제 인터페이스 이름으로 eth0을 바꾸세요.
sudo tcpdump -i eth0 -e -n -q

이 명령을 자세히 살펴보겠습니다.

  • sudo: 네트워크 인터페이스에 이러한 방식으로 액세스하는 데 필요한 슈퍼유저 권한으로 명령을 실행합니다.
  • tcpdump: 패킷 캡처 도구 자체입니다.
  • -i eth0: -i 플래그는 수신 대기할 네트워크 interface 를 지정합니다.
  • -e: 이 옵션은 저희 실습에 매우 중요합니다. tcpdump에 각 패킷에 대한 링크 수준 (이더넷) 헤더를 인쇄하도록 지시하며, 여기에는 소스 및 대상 MAC 주소가 포함됩니다.
  • -n: 호스트 이름 확인을 방지하여 원시 IP 주소를 표시합니다.
  • -q: "조용한" 모드로, 프로토콜별 출력 양을 줄입니다.

명령을 실행한 후 tcpdump가 수신 대기를 시작합니다. 초기 메시지가 표시된 다음 터미널에서 캡처하는 모든 패킷을 표시하기 시작합니다. 네트워크에 따라 원하는 작업과 관련 없는 많은 트래픽이 표시될 수 있습니다. 여기에는 ARP 요청, 백그라운드 서비스 등이 포함될 수 있습니다.

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:00.123456 ARP, Request who-has 172.16.50.1 tell 172.16.50.254, length 28
10:24:01.567890 IP6 fe80::... > ff02::...: ICMP6, router advertisement, length 80

몇 초 동안 실행하여 활동을 관찰한 다음 Ctrl+C를 눌러 캡처를 중지합니다. 이는 바쁜 환경에서 특정 정보를 찾는 데 따르는 어려움을 보여줍니다.

ICMP 필터로 캡처 정제하기

지난 단계에서 보았듯이 필터링되지 않은 캡처는 노이즈가 많을 수 있습니다. 분석하려는 특정 트래픽에 집중하기 위해 캡처 필터를 사용할 수 있습니다. ping 명령은 ICMP 프로토콜을 사용하므로 tcpdump에 ICMP 패킷만 캡처하도록 지시할 것입니다. 또한 tcpdump가 IP 주소를 호스트 이름으로 확인하는 것을 중지하기 위해 -n 플래그를 추가하고 출력을 더 깔끔하게 만들기 위해 -q를 추가합니다. 이렇게 하면 출력을 훨씬 더 쉽게 분석할 수 있습니다.

이제 tcpdump를 다시 시작하되 이번에는 icmp 필터와 새 플래그를 추가합니다.

## 1단계에서 식별한 실제 인터페이스 이름으로 eth0을 바꾸세요.
sudo tcpdump -i eth0 -e -n -q 'icmp'

명령의 'icmp' 부분이 필터입니다. 이는 ICMP 프로토콜을 사용하는 패킷을 제외한 모든 패킷을 무시하도록 tcpdump에 지시합니다.

이 명령을 실행한 후 tcpdump가 다시 수신 대기하지만, ICMP 트래픽을 특별히 기다리고 있으므로 터미널은 이제 조용해야 합니다.

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

중요: 이 터미널을 계속 실행하십시오! tcpdump는 다음 단계에서 생성할 트래픽을 캡처하기 위해 활성 상태를 유지해야 합니다. 후속 명령을 위해 새 터미널 탭 또는 창을 열어야 합니다. 터미널 패널의 + 아이콘을 클릭하여 이 작업을 수행할 수 있습니다.

'ping'으로 유니캐스트 트래픽 생성 및 프레임 헤더 분석

이 단계에서는 유니캐스트 트래픽을 생성하고 관찰합니다. 유니캐스트는 프레임이 네트워크의 단일 소스에서 단일 대상으로 전송되는 일대일 통신 방식입니다. 이를 위해 일반적인 ping 유틸리티를 사용하여 대상 호스트에 ICMP(Internet Control Message Protocol) 패킷을 보내 연결 상태를 확인합니다. 이러한 패킷은 전송을 위해 이더넷 프레임으로 캡슐화됩니다.

첫 번째 터미널에서 tcpdump(ICMP 필터 포함) 가 계속 실행되는 동안 네트워크 활동을 생성해야 합니다.

터미널 패널의 + 아이콘을 클릭하여 새 터미널을 엽니다. 이 새 터미널에서 ping 명령을 사용하여 google.com으로 몇 개의 패킷을 보냅니다. -c 4 옵션을 사용하여 정확히 네 개의 패킷을 자동으로 보내고 중지합니다.

ping -c 4 google.com

두 번째 터미널에서 다음과 유사한 출력을 볼 수 있으며, Google 서버의 응답을 보여줍니다.

PING google.com (142.250.191.174) 56(84) bytes of data.
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=1 ttl=115 time=1.58 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=2 ttl=115 time=1.55 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=3 ttl=115 time=1.62 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=4 ttl=115 time=1.51 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.510/1.565/1.621/0.040 ms

이제 tcpdump가 실행 중인 첫 번째 터미널로 돌아갑니다. ping 을 하는 동안 캡처된 몇 줄의 새 출력을 볼 수 있습니다.

나가는 "echo request" 패킷 중 하나를 분석해 보겠습니다. 시스템에 따라 MAC 및 IP 주소가 다르겠지만 다음과 유사하게 보일 것입니다.

10:25:01.123456 00:16:3e:01:be:b3 > de:ad:be:ef:00:01, ethertype IPv4 (0x0800), length 98: 172.16.50.8 > 142.250.191.174: ICMP echo request, id 123, seq 1, length 64

이 줄의 의미는 다음과 같습니다.

  • 10:25:01.123456: 프레임이 캡처된 시간입니다.
  • 00:16:3e:01:be:b3: 소스 MAC 주소 (VM 의 MAC) 입니다.
  • >: 트래픽 방향 (소스에서 대상으로) 을 나타내는 구분 기호입니다.
  • de:ad:be:ef:00:01: 대상 MAC 주소입니다. 이는 Google 서버가 아니라 로컬 네트워크의 게이트웨이 (라우터) 일 가능성이 높습니다. VM 은 프레임을 게이트웨이로 보내고, 게이트웨이는 이를 인터넷으로 전달합니다.
  • ethertype IPv4: 이 필드는 이더넷 프레임의 데이터 페이로드가 IPv4 패킷임을 나타냅니다.
  • 172.16.50.8 > 142.250.191.174: 이는 계층 3(IP) 정보로, 소스 및 대상 IP 주소를 보여줍니다.
  • ICMP echo request: 이는 패킷이 ping 요청의 일부임을 식별합니다.

해당하는 "echo reply" 프레임이 돌아오는 것도 볼 수 있습니다. 소스 및 대상 MAC 주소가 어떻게 바뀌는지 주목하십시오.

마지막으로 tcpdump 터미널로 돌아가 Ctrl+C를 눌러 캡처를 중지합니다.

ARP 를 통한 브로드캐스트 트래픽 생성 및 브로드캐스트 MAC 주소 식별

이 단계에서는 유니캐스트 트래픽과 브로드캐스트 트래픽을 대조합니다. 유니캐스트는 일대일 메시지인 반면, 브로드캐스트는 로컬 네트워크 세그먼트의 모든 장치로 전송되는 일대다 메시지입니다. 이의 주요 예는 특정 IP 주소와 관련된 MAC 주소를 찾기 위해 사용되는 **주소 결정 프로토콜 (ARP)**입니다. 이를 위해 장치는 "이 IP 주소를 가진 사람은 누구인가?"라고 묻는 브로드캐스트 프레임을 보냅니다.

먼저 새 tcpdump 캡처를 시작합니다. 이번에는 ARP 패킷만 표시하도록 필터를 추가합니다. 또한 tcpdump가 IP 주소를 호스트 이름으로 확인하는 것을 방지하기 위해 -n 플래그를 사용하고 출력을 더 깔끔하게 만들기 위해 -q를 사용합니다.

터미널에서 다음 명령을 실행하고, 1 단계에서 사용한 인터페이스 이름으로 eth0을 바꾸는 것을 잊지 마십시오.

## 실제 인터페이스 이름으로 eth0을 바꾸세요.
sudo tcpdump -i eth0 -e -n -q 'arp'

tcpdump가 이제 수신 대기하지만 ARP 트래픽만 대상으로 합니다.

다음으로 ARP 요청을 트리거해야 합니다. 이를 수행하는 확실한 방법은 시스템의 ARP 캐시를 지운 다음 로컬 네트워크의 다른 장치 (예: 게이트웨이 라우터) 에 연결을 시도하는 것입니다. 캐시를 지우면 시스템이 ARP 를 사용하여 게이트웨이의 MAC 주소를 다시 찾아야 합니다.

새 터미널을 엽니다. 먼저 ip route 명령으로 게이트웨이의 IP 주소를 찾습니다.

ip route | grep default

출력에는 기본 경로가 표시되며, "via" 뒤에 나열된 IP 주소가 게이트웨이입니다.

default via 172.16.50.1 dev eth0

참고: 게이트웨이 IP 주소는 다를 가능성이 높습니다. 아래 단계에서는 명령의 IP 주소를 사용하는 것이 중요합니다. 일반적인 실수는 종종 로컬 Docker 네트워크의 게이트웨이인 172.17.0.1과 같은 다른 IP 를 사용하는 것인데, 이는 이 연습에서 올바른 결과를 생성하지 않습니다.

이 예에서 게이트웨이는 172.16.50.1입니다. 이제 ip neigh flush 명령을 사용하여 ARP 캐시를 지웁니다. 이렇게 하면 알려진 MAC 주소 매핑이 제거되어 시스템이 다시 찾기 위해 ARP 를 사용하도록 강제합니다.

sudo ip -s -s neigh flush dev eth0

삭제된 항목을 확인하는 출력이 표시될 수 있습니다. 마지막으로 게이트웨이를 한 번만 ping하여 ARP 조회를 트리거합니다.

## 실제 게이트웨이 IP로 172.16.50.1을 바꾸세요.
ping -c 1 172.16.50.1

이제 tcpdump가 실행 중인 첫 번째 터미널로 돌아갑니다. 생성된 ARP 트래픽을 볼 수 있습니다. "Request" 줄을 찾으십시오.

10:30:01.123456 00:16:3e:01:be:b3 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: ARP, Request who-has 172.16.50.1 tell 172.16.50.8, length 28

이 브로드캐스트 프레임을 분석해 보겠습니다.

  • 00:16:3e:01:be:b3: 소스 MAC 주소 (VM) 입니다.
  • ff:ff:ff:ff:ff:ff: 이것은 특수한 브로드캐스트 MAC 주소입니다. 스위치가 이 대상 주소가 있는 프레임을 보면 모든 포트에서 모든 연결된 장치로 전달합니다.
  • ethertype ARP: 프레임의 페이로드가 ARP 패킷임을 나타냅니다.
  • ARP, Request who-has 172.16.50.1 tell 172.16.50.8: 이것은 ARP 메시지 자체로, 전체 네트워크에 172.16.50.1의 MAC 주소를 묻는 브로드캐스트 질문입니다.

게이트웨이에서 VM 의 MAC 주소로 직접 전송되는 유니캐스트 프레임인 "Reply" 패킷도 볼 수 있습니다.

이제 해당 터미널에서 Ctrl+C를 눌러 tcpdump 캡처를 중지할 수 있습니다.

요약

이 실습에서는 Linux 환경에서 tcpdump를 사용하여 이더넷 프레임을 분석하는 기본적인 과정을 배웠습니다. apt 패키지 관리자를 사용하여 tcpdump 유틸리티를 설치하고 ip addr 명령을 사용하여 기본 네트워크 인터페이스를 식별하는 시스템 준비부터 시작했습니다. 그런 다음 패킷 캡처를 시작하는 방법을 배웠는데, 처음에는 필터링되지 않은 캡처를 실행하여 모든 네트워크 트래픽을 관찰하고 필터링의 필요성을 이해했습니다. 초기 캡처를 중지한 후 sudo tcpdump -i eth0 -e -n -q 'icmp'를 사용하여 icmp 필터를 적용하여 분석하려는 트래픽에만 집중하는 방법을 배웠습니다.

이후 실습에서는 두 가지 주요 유형의 네트워크 트래픽을 생성하고 분석했습니다. ping 명령을 사용하여 유니캐스트 트래픽을 생성하고 필터링된 tcpdump 출력을 검사하여 이더넷 프레임 헤더의 특정 소스 및 대상 MAC 주소를 식별했습니다. 이후 별도의 arp 필터링 캡처로 ARP 요청을 시작하여 브로드캐스트 트래픽을 생성하고, 로컬 네트워크 세그먼트의 모든 장치에 대한 프레임임을 나타내는 고유한 브로드캐스트 MAC 주소인 ff:ff:ff:ff:ff:ff를 인식하는 방법을 배웠습니다.