패킷 생성 실습

허가된 localhost/lab 환경에서 UDP/TCP 송수신과 Scapy ICMP 패킷을 실습하는 가이드입니다. tcpdump 확인, UDP/TCP 차이, 안전한 실습 범위를 정리했습니다.

패킷 생성 실습은 프로토콜 구조를 이해하기 위한 학습입니다. 실습 대상은 반드시 127.0.0.1, 개인 VM, 허가된 랩 네트워크로 제한해야 합니다. 외부 시스템을 대상으로 임의 패킷을 보내거나 대량 전송하는 행위는 장애와 법적 문제를 만들 수 있습니다.

UDP 송수신 실습

먼저 수신 서버를 하나 띄웁니다.

# udp_server.py
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("127.0.0.1", 5005))

print("udp server listening on 127.0.0.1:5005")
data, addr = sock.recvfrom(2048)
print(f"from={addr} data={data!r}")

다른 터미널에서 UDP 클라이언트를 실행합니다.

# udp_client.py
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b"hello udp", ("127.0.0.1", 5005))
sock.close()
python3 udp_server.py
python3 udp_client.py

TCP 송수신 실습

TCP는 연결을 만든 뒤 데이터를 주고받습니다.

# tcp_server.py
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("127.0.0.1", 5006))
server.listen(1)

print("tcp server listening on 127.0.0.1:5006")
conn, addr = server.accept()
with conn:
 data = conn.recv(2048)
 print(f"from={addr} data={data!r}")
 conn.sendall(b"ack")
# tcp_client.py
import socket

with socket.create_connection(("127.0.0.1", 5006), timeout=3) as sock:
 sock.sendall(b"hello tcp")
 print(sock.recv(2048))

tcpdump로 확인

패킷이 실제로 어떻게 보이는지 loopback 인터페이스에서 확인합니다.

sudo tcpdump -ni lo udp port 5005
sudo tcpdump -ni lo tcp port 5006

Scapy로 ICMP 패킷 만들기

Scapy 공식 문서에서 설명하듯 send()는 layer 3 패킷을 보내고, sendp()는 layer 2 패킷을 보냅니다. 여기서는 localhost ICMP echo만 보냅니다.

# scapy_icmp_local.py
from scapy.all import IP, ICMP, sr1

packet = IP(dst="127.0.0.1") / ICMP()
reply = sr1(packet, timeout=2, verbose=False)

if reply:
 reply.show()
else:
 print("no reply")
python3 -m pip install scapy
sudo python3 scapy_icmp_local.py

UDP와 TCP 차이

  • UDP는 연결 없이 datagram을 보냅니다. 수신자가 없어도 클라이언트 send 자체는 성공할 수 있습니다.
  • TCP는 3-way handshake 후 데이터를 보냅니다. 서버가 없으면 connect 단계에서 실패합니다.
  • 패킷 생성 라이브러리는 학습에는 유용하지만 운영 통신에는 표준 클라이언트와 프로토콜 라이브러리를 쓰는 것이 안전합니다.

문서 링크

BGM EVER