
네트워크를 공부하다 보면 "도대체 데이터가 어떻게 전달되는 거지?"라는 궁금증이 생기기 마련입니다. 와이어샤크(Wireshark)는 바로 그 궁금증을 눈으로 직접 확인할 수 있게 해주는 도구입니다. 마치 택배 상자를 열어서 안에 든 물건과 주소 스티커를 직접 보는 것처럼, 네트워크를 오가는 데이터 패킷의 내부를 들여다볼 수 있습니다. 이 글에서는 와이어샤크를 처음 접하는 분들도 쉽게 이해할 수 있도록 L2(데이터 링크 계층)와 L3(네트워크 계층) 헤더를 중심으로 설명해 드리겠습니다.
1. 와이어샤크란 무엇인가? — 네트워크의 X-레이 기계
와이어샤크는 네트워크 인터페이스를 통해 오가는 패킷(데이터 묶음)을 실시간으로 캡처하고 분석하는 오픈소스 프로그램입니다. 병원에서 X-레이를 찍으면 뼈 구조가 보이듯, 와이어샤크를 켜면 컴퓨터가 주고받는 데이터의 내부 구조가 그대로 드러납니다. 1998년 Gerald Combs가 처음 개발했으며, 현재는 전 세계 수백만 명의 네트워크 엔지니어, 보안 전문가, 학생들이 사용하는 표준 도구가 되었습니다.
와이어샤크가 캡처하는 데이터는 크게 헤더(Header)와 페이로드(Payload)로 나뉩니다. 헤더는 택배 상자의 겉면에 붙은 주소 스티커처럼, 데이터가 어디서 왔고 어디로 가야 하는지, 어떤 종류인지를 담고 있습니다. 페이로드는 상자 안에 들어 있는 실제 내용물이고요. 와이어샤크를 통해 우리는 이 헤더의 모든 필드를 계층별로 분해해서 볼 수 있습니다.
와이어샤크는 특히 OSI 7계층 모델과 함께 이해하면 더욱 빛을 발합니다. L2는 같은 네트워크 안에서 기기끼리 통신할 때 사용하는 규칙이고, L3는 서로 다른 네트워크 사이를 오갈 때 사용하는 규칙입니다. 처음 와이어샤크를 설치했을 때 수천 개의 패킷이 쏟아지는 모습을 보고 당황했던 기억이 납니다. 회사 서버실에서 트래픽 이상을 감지했다는 알람이 떴을 때, 어디서 문제가 생겼는지 도무지 알 수 없어서 막막했습니다. 선임이 와이어샤크를 켜더니 불과 5분 만에 특정 IP에서 비정상적인 양의 ARP 요청이 쏟아지고 있다는 것을 찾아냈습니다. 그 모습이 마치 마법처럼 느껴졌고, 그때부터 와이어샤크를 제대로 배워야겠다고 결심했습니다. 처음에는 필터 문법을 하나도 몰라서 패킷 목록을 그냥 스크롤만 했는데, 그게 얼마나 비효율적인 방법인지 나중에 알게 됐습니다. 와이어샤크는 단순히 패킷을 보여주는 것을 넘어서, 통계 기능과 그래프 기능까지 갖추고 있어서 네트워크 성능 분석에도 매우 유용합니다. 다만 한 가지 중요한 점은, 와이어샤크는 어디까지나 분석 도구이지 문제를 직접 해결해 주는 도구는 아닙니다. 데이터를 읽을 줄 아는 눈을 먼저 길러야 와이어샤크가 진정한 무기가 됩니다. 많은 입문자들이 도구를 먼저 배우려 하는데, 사실 OSI 계층 개념과 프로토콜 기초를 먼저 이해하는 것이 훨씬 중요합니다. 그 기반 없이 와이어샤크를 배우면 숫자와 16진수의 홍수 속에서 아무것도 건지지 못하고 포기하게 됩니다.
[와이어샤크 기본 화면 구성]
┌─────────────────────────────────────────────┐
│ 패킷 목록 창 (Packet List Pane) │
│ No. | Time | Source | Destination | Protocol│
│ 1 | 0.000| 192.168.1.1 | 8.8.8.8 | DNS │
│ 2 | 0.001| 8.8.8.8 | 192.168.1.1 | DNS │
├─────────────────────────────────────────────┤
│ 패킷 상세 창 (Packet Details Pane) │
│ ▼ Frame 1: 74 bytes on wire │
│ ▼ Ethernet II (L2) │
│ ▼ Internet Protocol Version 4 (L3) │
│ ▼ User Datagram Protocol (L4) │
│ ▼ Domain Name System (Application) │
├─────────────────────────────────────────────┤
│ 패킷 바이트 창 (Packet Bytes Pane) │
│ 0000 ff ff ff ff ff ff 00 1a ... │
└─────────────────────────────────────────────┘
2. L2 헤더 — 이더넷 프레임의 구조와 MAC 주소 읽기
L2, 즉 데이터 링크 계층에서 사용하는 가장 대표적인 프로토콜이 바로 이더넷(Ethernet)입니다. 이더넷 프레임은 같은 네트워크(같은 스위치에 연결된) 장비들끼리 데이터를 주고받을 때 사용하는 포장 방식입니다. 학교 교실 안에서 학생들끼리 쪽지를 돌릴 때, 쪽지에 "보내는 사람: 3번 자리"와 "받는 사람: 7번 자리"라고 쓰는 것과 비슷합니다.
이더넷 프레임의 주요 필드는 다음과 같습니다. 먼저 목적지 MAC 주소(Destination MAC Address)는 6바이트(48비트)로 구성되며, 데이터를 받을 장비의 물리적 주소입니다. 출발지 MAC 주소(Source MAC Address)는 데이터를 보내는 장비의 물리적 주소입니다. EtherType은 2바이트로, 상위 계층 프로토콜이 무엇인지 알려줍니다. 예를 들어 0x0800이면 IPv4, 0x86DD이면 IPv6, 0x0806이면 ARP입니다. MAC 주소는 제조사에서 장비에 고정적으로 부여하는 고유 번호로, 앞 3바이트는 제조사 코드(OUI), 뒤 3바이트는 장비 고유 번호입니다.
와이어샤크에서 이더넷 헤더를 보면 패킷 상세 창에서 "Ethernet II" 항목을 클릭하면 됩니다. 그러면 목적지 MAC과 출발지 MAC이 XX:XX:XX:XX:XX:XX 형식으로 표시됩니다. 처음으로 ARP 스푸핑 공격이 들어왔을 때를 생각해 보면, ARP 테이블을 확인했을 때 동일한 IP에 서로 다른 MAC 주소가 두 개 매핑되어 있는 것을 발견했던 기억이 납니다. 와이어샤크로 패킷을 캡처해서 이더넷 헤더의 출발지 MAC을 분석했더니 공격자의 장비 MAC이 정상 게이트웨이의 MAC인 척 위장하고 있었습니다. 그때 MAC 주소 필드 하나하나의 의미를 제대로 이해하고 있었기 때문에 빠르게 원인을 찾을 수 있었습니다. 반대로 함께 일하던 동료는 MAC 주소 개념이 불분명해서 ARP 테이블만 보고 IP 충돌로 잘못 판단해 시간을 낭비했습니다. L2 헤더를 제대로 읽는 능력이 얼마나 중요한지 실감한 사건이었습니다. MAC 주소가 물리적으로 고정된 주소라고 알려져 있지만, 실제로는 소프트웨어적으로 변경(MAC 스푸핑)이 가능하다는 점은 보안 측면에서 반드시 알아야 할 취약점입니다. 많은 교재가 "MAC 주소는 바꿀 수 없다"고 단정적으로 설명하는데, 이는 잘못된 정보이며 초보자에게 잘못된 보안 인식을 심어줄 수 있습니다.
[와이어샤크 이더넷 헤더 출력 예시]
Frame 1: 74 bytes on wire (592 bits), 74 bytes captured
Ethernet II, Src: HuaweiTe_5a:3b:2c (00:e0:fc:5a:3b:2c),
Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Destination: ff:ff:ff:ff:ff:ff (Broadcast)
Source: 00:e0:fc:5a:3b:2c
Type: ARP (0x0806)
[이더넷 프레임 구조]
7bytes 1byte 6bytes 6bytes 2bytes 46~1500bytes 4bytes
┌──────┬──────┬───────┬───────┬──────┬────────────┬──────┐
│Pream-│ SFD │ Dst │ Src │ Type │ Payload │ FCS │
│ble │ │ MAC │ MAC │ │ (Data) │(CRC) │
└──────┴──────┴───────┴───────┴──────┴────────────┴──────┘
[EtherType 주요 값]
0x0800 → IPv4
0x0806 → ARP
0x86DD → IPv6
0x8100 → VLAN 태그 (802.1Q)
3. L3 헤더 — IP 패킷의 구조와 주요 필드 해석
L3, 즉 네트워크 계층에서는 IP(Internet Protocol)가 핵심입니다. IP는 서로 다른 네트워크를 넘어서 데이터를 전달하는 역할을 합니다. 앞서 L2가 같은 교실 안의 쪽지 전달이라면, L3는 전국 어디로든 편지를 보내는 우편 시스템에 해당합니다. 편지 봉투에는 보내는 사람 주소, 받는 사람 주소, 우편번호 등이 적혀 있는데, 이것이 바로 IP 헤더의 역할입니다.
IPv4 헤더의 주요 필드를 살펴보겠습니다. 버전(Version)은 4비트로 IPv4(4) 또는 IPv6(6)를 나타냅니다. 헤더 길이(IHL)는 IP 헤더의 크기를 알려주며, 기본값은 20바이트입니다. TTL(Time To Live)은 패킷이 라우터를 몇 개까지 거칠 수 있는지를 나타내는 값으로, 라우터를 지날 때마다 1씩 감소하며 0이 되면 폐기됩니다. 프로토콜(Protocol) 필드는 상위 계층 프로토콜을 나타내며, 6이면 TCP, 17이면 UDP, 1이면 ICMP입니다. 출발지 IP(Source IP)와 목적지 IP(Destination IP)는 각각 4바이트(32비트)입니다.
TTL 값은 네트워크 트러블슈팅에서 매우 유용합니다. 예를 들어 ping을 보냈을 때 응답이 돌아오는 TTL이 64라면 리눅스 서버일 가능성이 높고, 128이면 윈도우 서버일 가능성이 높습니다. 실제로 서버 OS를 모르는 상태에서 패킷을 분석해서 TTL 값으로 운영체제를 유추했던 경험이 있습니다. 네트워크 장애 대응 중에 특정 목적지로 패킷이 도달하지 못하는 문제가 생겼는데, 와이어샤크로 캡처해 보니 TTL이 라우터 한 홉 건너가면서 0이 되어 버리는 것을 발견했습니다. 라우터에서 TTL을 너무 작게 설정한 것이 원인이었고, 이를 수정해서 해결했습니다. 단순히 "핑이 안 된다"고만 알고 있었다면 어디서부터 확인해야 할지 몰랐을 것입니다. 그때 IP 헤더의 TTL 필드 하나가 얼마나 중요한 단서가 되는지 배웠습니다. IP 단편화(Fragmentation) 관련 필드도 자주 문제를 일으키는데, MTU 크기를 초과하는 패킷이 단편화되지 않고 Drop 처리되는 경우를 여러 번 목격했습니다. IP 헤더만 제대로 읽을 줄 알아도 트러블슈팅 시간이 절반 이상 줄어듭니다. 반면 IP 헤더를 모르면 tcpdump나 와이어샤크 출력 결과를 봐도 아무 의미를 읽지 못합니다. 헤더 공부는 지루해 보여도 반드시 선행되어야 하는 과정입니다.
[와이어샤크 IPv4 헤더 출력 예시]
Internet Protocol Version 4, Src: 192.168.1.100, Dst: 8.8.8.8
Version: 4
Header Length: 20 bytes (5)
Differentiated Services Field: 0x00
Total Length: 60
Identification: 0x1234 (4660)
Flags: 0x40, Don't fragment
Fragment Offset: 0
Time to Live: 64
Protocol: TCP (6)
Header Checksum: 0xb861 [validation disabled]
Source Address: 192.168.1.100
Destination Address: 8.8.8.8
[IPv4 헤더 구조 (20바이트 기본)]
4비트 4비트 8비트 16비트
┌──────┬──────┬────────┬──────────────────┐
│Ver. │ IHL │ ToS │ Total Length │
├──────┴──────┴────────┴──────────────────┤
│ Identification │Flags│ Frag Offset │
├───────────────────┴─────┴────────────────┤
│ TTL │ Protocol │ Header Checksum │
├──────────┴──────────┴───────────────────┤
│ Source IP Address │
├──────────────────────────────────────────┤
│ Destination IP Address │
└──────────────────────────────────────────┘
[Protocol 필드 주요 값]
1 → ICMP (ping)
6 → TCP
17 → UDP
89 → OSPF
4. 와이어샤크 캡처 필터와 디스플레이 필터 활용법
와이어샤크에서 필터를 모르면 수천 개의 패킷 속에서 원하는 패킷을 찾는 것이 사막에서 바늘 찾기와 같습니다. 필터에는 두 종류가 있습니다. 캡처 필터(Capture Filter)는 처음부터 특정 패킷만 잡아내는 필터이고, 디스플레이 필터(Display Filter)는 이미 잡힌 패킷들 중에서 보고 싶은 것만 골라서 보여주는 필터입니다. 캡처 필터는 BPF(Berkeley Packet Filter) 문법을 사용하고, 디스플레이 필터는 와이어샤크만의 고유한 문법을 사용합니다.
가장 많이 사용하는 디스플레이 필터 예시를 살펴보겠습니다. ip.addr == 192.168.1.1은 해당 IP가 출발지 또는 목적지인 패킷만 보여줍니다. ip.src == 10.0.0.1은 해당 IP에서 출발한 패킷만, eth.addr == 00:11:22:33:44:55는 해당 MAC 주소가 포함된 패킷만 보여줍니다. tcp.port == 80은 HTTP 트래픽, icmp는 ping 패킷, arp는 ARP 패킷만 필터링합니다. 논리 연산자 and, or, not을 조합하면 더 정교한 필터를 만들 수 있습니다.
현장에서 보안 이슈를 분석할 때 필터 하나가 얼마나 중요한지 절실히 느꼈습니다. 한번은 내부 네트워크에서 알 수 없는 브로드캐스트 폭풍이 발생했는데, 처음에는 수만 개의 패킷 속에서 원인을 찾기 힘들었습니다. eth.dst == ff:ff:ff:ff:ff:ff 필터 하나를 적용하니 브로드캐스트 패킷만 걸러졌고, 출발지 MAC을 추적해서 루프가 발생한 스위치 포트를 정확히 특정할 수 있었습니다. 필터를 몰랐다면 수만 개의 패킷을 하나하나 확인해야 했을 것입니다. 필터 문법을 처음 배울 때는 마치 새로운 언어를 배우는 것 같아서 어렵게 느껴지지만, 자주 쓰는 패턴 20~30개만 익혀 두면 대부분의 상황에 대응할 수 있습니다. 와이어샤크의 필터 입력창에 색상이 바뀌는 것을 잘 활용하면 좋은데, 초록색이면 문법이 맞는 것이고 빨간색이면 틀린 것입니다. 처음에는 이 색상 힌트를 무시하고 계속 오류를 냈던 기억이 납니다. 또 캡처 필터와 디스플레이 필터를 구분하지 않고 잘못 입력해서 왜 패킷이 안 잡히는지 한참 고민했던 경험도 있습니다. 이 두 가지 필터의 차이를 반드시 구분해서 이해해야 합니다.
[자주 쓰는 디스플레이 필터 모음]
# 특정 IP 관련 패킷
ip.addr == 192.168.1.1
ip.src == 192.168.1.1
ip.dst == 8.8.8.8
# 특정 MAC 주소
eth.src == aa:bb:cc:dd:ee:ff
eth.dst == ff:ff:ff:ff:ff:ff ← 브로드캐스트만
# 프로토콜 필터
arp
icmp
tcp
udp
dns
http
https
# TTL 필터 (라우팅 이슈 분석)
ip.ttl == 1
ip.ttl < 10
# 조합 예시
ip.addr == 192.168.1.1 and tcp.port == 80
ip.src == 10.0.0.0/8 and not icmp
[캡처 필터 (BPF 문법) 예시]
host 192.168.1.1
net 192.168.1.0/24
port 80
arp
icmp
not port 22
5. ARP 프로토콜 분석 — L2와 L3를 연결하는 다리
ARP(Address Resolution Protocol)는 IP 주소(L3)를 MAC 주소(L2)로 변환하는 프로토콜입니다. 우리가 알고 있는 IP 주소로 데이터를 보내려 할 때, 실제 이더넷 프레임을 만들려면 MAC 주소가 필요합니다. ARP는 바로 이 IP-MAC 주소 매핑을 처리합니다. "192.168.1.1 쓰는 사람 누구야? MAC 주소 알려줘!"라고 네트워크 전체에 방송(브로드캐스트)하면, 해당 IP를 가진 장비가 "나야 나! 내 MAC은 00:11:22:33:44:55야!"라고 답하는 방식입니다.
와이어샤크에서 ARP 패킷을 보면 ARP Request(요청)와 ARP Reply(응답) 두 가지가 보입니다. Request는 브로드캐스트(ff:ff:ff:ff:ff:ff)로 전송되고, Reply는 유니캐스트로 직접 응답합니다. ARP 캐시 테이블은 운영체제 명령어로 확인할 수 있습니다. 윈도우에서는 arp -a, 리눅스에서는 arp -n 또는 ip neigh show 명령어를 사용합니다.
ARP는 보안에서 매우 취약한 프로토콜입니다. 인증 메커니즘이 전혀 없기 때문에 누구든 ARP Reply를 위조해서 보낼 수 있습니다. 이것이 ARP 스푸핑의 원리입니다. 실제로 내부 침투 테스트를 수행할 때 ARP 스푸핑을 이용해서 게이트웨이와 클라이언트 사이의 트래픽을 중간에서 가로채는 데 성공한 경험이 있습니다. 당시 와이어샤크로 캡처된 ARP 패킷을 보면, 동일한 IP에 대한 ARP Reply가 두 곳에서 동시에 오고 있었습니다. 클라이언트는 나중에 온 Reply를 신뢰하기 때문에 공격자의 MAC 주소로 게이트웨이 IP가 매핑되어 버렸습니다. 이처럼 ARP는 설계 자체에 보안 결함이 있는 프로토콜이며, 이를 보완하기 위한 Dynamic ARP Inspection(DAI) 같은 기술이 필요합니다. ARP가 30년 전에 설계된 프로토콜이라는 점을 감안해도, 현대 네트워크에서 아직도 이 취약한 프로토콜에 의존한다는 것은 비판받아 마땅합니다. IPv6에서는 ARP를 대체하는 NDP(Neighbor Discovery Protocol)를 사용하지만, 이 역시 완벽하지는 않습니다. 네트워크 보안을 공부하는 사람이라면 ARP의 동작 원리와 취약점을 반드시 이해해야 합니다.
[와이어샤크 ARP 패킷 출력 예시]
ARP Request (브로드캐스트):
Address Resolution Protocol (request)
Hardware type: Ethernet (1)
Protocol type: IPv4 (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (1)
Sender MAC address: 00:11:22:33:44:55
Sender IP address: 192.168.1.100
Target MAC address: 00:00:00:00:00:00 (Unknown)
Target IP address: 192.168.1.1
ARP Reply (유니캐스트):
Address Resolution Protocol (reply)
Opcode: reply (2)
Sender MAC address: aa:bb:cc:dd:ee:ff
Sender IP address: 192.168.1.1
Target MAC address: 00:11:22:33:44:55
Target IP address: 192.168.1.100
[ARP 캐시 확인 명령어]
Windows: arp -a
Linux: arp -n
ip neigh show
[출력 예시]
192.168.1.1 ether aa:bb:cc:dd:ee:ff C eth0
192.168.1.2 ether 00:11:22:33:44:55 C eth0
6. 실전 패킷 분석 — ping 패킷으로 L2-L3 헤더 종합 실습
이제 지금까지 배운 내용을 종합해서 실제 ping 패킷을 분석해 보겠습니다. ping은 ICMP(Internet Control Message Protocol)를 사용하는 가장 단순한 네트워크 테스트 도구입니다. ping 한 번에 여러 계층의 프로토콜이 동시에 동작하기 때문에 L2-L3 헤더를 종합적으로 이해하기에 최적의 예제입니다.
실습 순서는 이렇습니다. 와이어샤크를 열고 캡처를 시작합니다. 필터에 icmp를 입력합니다. 커맨드 창에서 ping 8.8.8.8을 실행합니다. 그러면 ICMP Echo Request(요청)와 ICMP Echo Reply(응답) 패킷이 캡처됩니다. 각 패킷을 클릭해서 이더넷 헤더(L2)와 IP 헤더(L3), ICMP 헤더(L4)를 펼쳐 보면 됩니다. 이더넷 헤더에서 출발지 MAC, 목적지 MAC을 확인하고, IP 헤더에서 출발지 IP, 목적지 IP, TTL, 프로토콜 번호를 확인합니다.
처음 이 실습을 해봤을 때 신기했던 점이 있었습니다. 8.8.8.8(구글 DNS)로 ping을 보냈는데, 이더넷 헤더의 목적지 MAC 주소가 8.8.8.8의 MAC이 아니라 게이트웨이(공유기)의 MAC 주소라는 것이었습니다. 처음에는 "왜 다른 곳 MAC이 들어가 있지?"라고 의아했는데, 생각해 보면 당연한 일입니다. L2는 같은 네트워크 안에서만 통신하기 때문에, 다른 네트워크로 나가려면 게이트웨이를 거쳐야 합니다. 즉 L2 헤더의 MAC은 홉(hop)마다 바뀌지만, L3 헤더의 IP는 목적지까지 변하지 않습니다. 이것이 L2와 L3의 근본적인 차이입니다. 많은 사람들이 이 차이를 이론으로만 배우고 제대로 이해하지 못하는데, 와이어샤크로 직접 확인하면 단번에 이해됩니다. 이처럼 직접 손으로 실습하는 것이 수십 페이지의 이론 공부보다 훨씬 효과적입니다. 와이어샤크 실습을 교육 과정에 더 적극적으로 포함해야 한다고 생각합니다.
[ping 8.8.8.8 패킷 분석 예시]
▼ Frame 1 (74 bytes)
▼ Ethernet II
Dst MAC: aa:bb:cc:dd:ee:ff ← 게이트웨이 MAC (L2는 홉마다 변경)
Src MAC: 00:11:22:33:44:55 ← 내 컴퓨터 MAC
Type: IPv4 (0x0800)
▼ Internet Protocol Version 4
Version: 4
Header Length: 20 bytes
TTL: 64 ← 출발 시 TTL
Protocol: ICMP (1)
Src IP: 192.168.1.100 ← 내 IP (L3는 종단 간 유지)
Dst IP: 8.8.8.8 ← 목적지 IP
▼ Internet Control Message Protocol
Type: 8 (Echo Request)
Code: 0
Sequence Number: 1
[L2 vs L3 핵심 차이]
L2 MAC 주소: 홉(라우터)을 넘어갈 때마다 변경됨
L3 IP 주소: 출발지에서 목적지까지 변경되지 않음
[ping 실습 명령어]
Windows: ping 8.8.8.8
Linux: ping -c 4 8.8.8.8
와이어샤크 필터: icmp
출처 및 참고 경로
- Wireshark 공식 문서: https://www.wireshark.org/docs/
- Wireshark 사용자 가이드: https://www.wireshark.org/docs/wsug_html_chunked/
- Wireshark Display Filter Reference: https://www.wireshark.org/docs/dfref/
- RFC 826 - ARP: https://datatracker.ietf.org/doc/html/rfc826
- RFC 791 - IPv4: https://datatracker.ietf.org/doc/html/rfc791
- IEEE 802.3 Ethernet Standard: https://standards.ieee.org/ieee/802.3/7071/
- Wireshark Wiki: https://wiki.wireshark.org/
- BPF 필터 문법 참고: https://biot.com/capstats/bpf.html
'IT적응기' 카테고리의 다른 글
| 기초 보안의 ACL(Access Control List)로 특정 IP 차단 설정법 (0) | 2026.04.16 |
|---|---|
| 트래픽 병목 현상 LACP(Link Aggregation)로 대역폭을 확장방법 (0) | 2026.04.15 |
| ARP 테이블 분석 IP와 MAC 매칭 주소 오류를 해결 (0) | 2026.04.14 |
| 네트워크 장애 1순위 케이블 불량 포트 설정 오류 확인법 (0) | 2026.04.14 |
| L3 스위치 - 라우터 우리 회사엔 어떤 장비가 더 적합할까? 4가지 기준 (0) | 2026.04.14 |