
tcpdump คืออะไร? ทำไมต้องรู้?
tcpdump คือเครื่องมือ Command-line สำหรับจับ (capture) และวิเคราะห์ Network Packet บน Linux/Unix เป็นหนึ่งในเครื่องมือที่สำคัญที่สุดสำหรับ Network Administrator, System Administrator และ Security Engineer ในปี 2026 แม้จะมีเครื่องมือ GUI อย่าง Wireshark แต่ tcpdump ยังคงเป็นตัวเลือกอันดับ 1 สำหรับการ Troubleshoot บน Server ที่ไม่มี GUI
ทำไมต้อง tcpdump?
- ติดตั้งง่าย: มีในทุก Linux Distribution แทบทุกตัว
- ใช้งานบน Server ที่ไม่มี GUI: ไม่ต้องการ Desktop Environment
- เบามาก: ใช้ Resource น้อย ไม่กระทบ Server Performance
- ทรงพลัง: Filter ได้ละเอียด จับ Packet ได้ทุกประเภท
- Export เป็น PCAP: เก็บไว้วิเคราะห์ด้วย Wireshark ภายหลังได้
ติดตั้ง tcpdump
# Ubuntu/Debian
sudo apt update && sudo apt install tcpdump -y
# CentOS/RHEL/Rocky
sudo dnf install tcpdump -y
# Alpine
apk add tcpdump
# ตรวจสอบเวอร์ชัน
tcpdump --version
# ดู Network Interfaces ที่มี
tcpdump -D
การใช้งาน tcpdump พื้นฐาน
จับ Packet ทั้งหมด
# จับ Packet ทั้งหมดบน Interface eth0
sudo tcpdump -i eth0
# จับ Packet บน Interface ใดก็ได้ (ทุก Interface)
sudo tcpdump -i any
# จำกัดจำนวน Packet (จับ 100 Packet แล้วหยุด)
sudo tcpdump -i eth0 -c 100
# จับ Packet พร้อมแสดง Timestamp แบบละเอียด
sudo tcpdump -i eth0 -tttt
Capture Filters — กรอง Packet ที่ต้องการ
Filter ตาม Host
# จับเฉพาะ Traffic จาก/ไปหา IP ที่ระบุ
sudo tcpdump -i eth0 host 192.168.1.100
# จับเฉพาะ Traffic ที่มาจาก (Source)
sudo tcpdump -i eth0 src host 192.168.1.100
# จับเฉพาะ Traffic ที่ไปหา (Destination)
sudo tcpdump -i eth0 dst host 192.168.1.100
# จับ Traffic ระหว่าง 2 Hosts
sudo tcpdump -i eth0 host 192.168.1.100 and host 192.168.1.200
Filter ตาม Port
# จับเฉพาะ Port 80 (HTTP)
sudo tcpdump -i eth0 port 80
# จับเฉพาะ Port 443 (HTTPS)
sudo tcpdump -i eth0 port 443
# จับหลาย Port
sudo tcpdump -i eth0 port 80 or port 443
# จับ Port Range
sudo tcpdump -i eth0 portrange 8000-8100
# จับ Source Port
sudo tcpdump -i eth0 src port 22
# จับ Destination Port
sudo tcpdump -i eth0 dst port 3306
Filter ตาม Protocol
# จับเฉพาะ TCP
sudo tcpdump -i eth0 tcp
# จับเฉพาะ UDP
sudo tcpdump -i eth0 udp
# จับเฉพาะ ICMP (ping)
sudo tcpdump -i eth0 icmp
# จับเฉพาะ ARP
sudo tcpdump -i eth0 arp
# รวม Filter (TCP Port 80 จาก Host ที่ระบุ)
sudo tcpdump -i eth0 tcp and port 80 and host 192.168.1.100
Display Options — แสดงผลแบบต่าง ๆ
# -n: ไม่ Resolve ชื่อ (แสดง IP แทน Hostname) — เร็วกว่ามาก
sudo tcpdump -i eth0 -n
# -nn: ไม่ Resolve ทั้ง Hostname และ Port Name
sudo tcpdump -i eth0 -nn
# -v: Verbose (แสดงรายละเอียดเพิ่ม เช่น TTL, ID, Length)
sudo tcpdump -i eth0 -v
# -vv: Very Verbose
sudo tcpdump -i eth0 -vv
# -X: แสดง Packet Content เป็น Hex + ASCII
sudo tcpdump -i eth0 -X
# -A: แสดง Packet Content เป็น ASCII (อ่านง่ายสำหรับ HTTP)
sudo tcpdump -i eth0 -A
# -e: แสดง Ethernet Header (MAC Address)
sudo tcpdump -i eth0 -e
# -S: แสดง Absolute Sequence Number (ไม่ใช่ Relative)
sudo tcpdump -i eth0 -S
# รวมกัน (แนะนำสำหรับ Troubleshooting)
sudo tcpdump -i eth0 -nn -v -X
เขียนลงไฟล์ PCAP (-w) และอ่านกลับ (-r)
# บันทึก Packet ลงไฟล์ PCAP
sudo tcpdump -i eth0 -w /tmp/capture.pcap
# บันทึกพร้อม Filter
sudo tcpdump -i eth0 -w /tmp/http_traffic.pcap tcp port 80
# จำกัดขนาดไฟล์ (Rotate ทุก 100MB, เก็บ 5 ไฟล์)
sudo tcpdump -i eth0 -w /tmp/capture.pcap -C 100 -W 5
# บันทึกพร้อม Timestamp ในชื่อไฟล์
sudo tcpdump -i eth0 -w /tmp/capture_%Y%m%d_%H%M%S.pcap -G 3600
# อ่าน PCAP File กลับมาวิเคราะห์
sudo tcpdump -r /tmp/capture.pcap
# อ่าน PCAP File พร้อม Filter
sudo tcpdump -r /tmp/capture.pcap tcp port 443 -nn
# อ่าน PCAP พร้อมแสดง Content
sudo tcpdump -r /tmp/capture.pcap -A -nn
Common tcpdump Recipes — สูตรที่ใช้บ่อย
จับ HTTP Traffic
# จับ HTTP Request/Response (อ่าน Content)
sudo tcpdump -i eth0 -A -nn tcp port 80 | grep -E "GET|POST|HTTP/"
# จับ HTTP Headers เท่านั้น
sudo tcpdump -i eth0 -A -nn 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# จับเฉพาะ HTTP GET
sudo tcpdump -i eth0 -A -nn 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
จับ DNS Queries
# จับ DNS Traffic ทั้งหมด
sudo tcpdump -i eth0 -nn port 53
# จับ DNS Queries แบบละเอียด
sudo tcpdump -i eth0 -vv -nn port 53
# จับเฉพาะ DNS Query (ไม่รวม Response)
sudo tcpdump -i eth0 -nn 'udp port 53 and udp[10] & 0x80 = 0'
จับ DHCP Traffic
# จับ DHCP (Port 67 = Server, 68 = Client)
sudo tcpdump -i eth0 -nn port 67 or port 68 -v
# จับ DHCP Discover/Offer/Request/Ack
sudo tcpdump -i eth0 -vv -nn 'udp and (port 67 or port 68)'
จับ ARP Traffic
# จับ ARP ทั้งหมด
sudo tcpdump -i eth0 -nn arp
# จับ ARP เฉพาะ IP ที่สนใจ
sudo tcpdump -i eth0 -nn arp and host 192.168.1.1
ตรวจจับ SYN Flood
# จับเฉพาะ SYN Packet (TCP Flag)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) = 0'
# นับ SYN Packets ต่อวินาที
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] == tcp-syn' -c 1000 | awk '{print $1}' | cut -d. -f1 | sort | uniq -c | sort -rn
# จับ RST Packets (อาจบ่งชี้ปัญหา)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-rst) != 0'
tcpdump บน Docker Containers
# วิธี 1: เข้าไปใน Container แล้วรัน tcpdump
docker exec -it container_name bash
apt update && apt install tcpdump -y
tcpdump -i eth0 -nn
# วิธี 2: ใช้ nsenter เข้าไปใน Network Namespace ของ Container
# หา PID ของ Container
docker inspect --format '{{.State.Pid}}' container_name
# เข้าไปใน Network Namespace
sudo nsenter -t -n tcpdump -i eth0 -nn
# วิธี 3: ใช้ Docker Network (จับที่ Bridge)
# หา Bridge Interface
docker network inspect bridge | grep "com.docker.network.bridge.name"
# จับ Traffic บน Bridge
sudo tcpdump -i docker0 -nn
# วิธี 4: ใช้ tcpdump Container (nicolaka/netshoot)
docker run --rm --net=container:target_container nicolaka/netshoot tcpdump -i eth0 -nn -c 100
tcpdump บน Kubernetes Pods
# วิธี 1: kubectl exec เข้าไปใน Pod
kubectl exec -it pod-name -- tcpdump -i eth0 -nn -c 100
# ถ้า Pod ไม่มี tcpdump → ใช้ Debug Container (K8s 1.25+)
kubectl debug -it pod-name --image=nicolaka/netshoot --target=container-name -- tcpdump -i eth0 -nn
# วิธี 2: ใช้ ksniff (kubectl plugin)
# ติดตั้ง ksniff
kubectl krew install sniff
# จับ Packet จาก Pod → เปิดใน Wireshark อัตโนมัติ
kubectl sniff pod-name -n namespace
# วิธี 3: จับบน Node ที่ Pod รันอยู่
# หา Node ที่ Pod อยู่
kubectl get pod pod-name -o wide
# SSH เข้า Node แล้วหา veth interface
ip link | grep
sudo tcpdump -i -nn
tcpdump + Wireshark Workflow
ขั้นตอนที่ 1: จับ Packet บน Server ด้วย tcpdump
# จับ Packet แล้วบันทึกเป็น PCAP
sudo tcpdump -i eth0 -w /tmp/analysis.pcap -nn -c 10000
# จับเฉพาะ Traffic ที่สนใจ (ลดขนาดไฟล์)
sudo tcpdump -i eth0 -w /tmp/analysis.pcap tcp port 443 and host 10.0.0.50 -nn
ขั้นตอนที่ 2: ส่งไฟล์กลับมาที่เครื่อง Desktop
# ใช้ scp
scp user@server:/tmp/analysis.pcap ~/Desktop/
# ใช้ rsync
rsync -avz user@server:/tmp/analysis.pcap ~/Desktop/
ขั้นตอนที่ 3: เปิดด้วย Wireshark
เปิดไฟล์ .pcap ด้วย Wireshark บนเครื่อง Desktop จะได้ GUI ที่สวยงาม สามารถ Filter, Follow TCP Stream, ดู Statistics, Protocol Hierarchy, Flow Graph และอื่น ๆ ได้สะดวกกว่า tcpdump CLI มาก
Security Considerations
ข้อควรระวังเรื่องความปลอดภัย
- ต้องมีสิทธิ์ root/sudo: tcpdump ต้องการ CAP_NET_RAW capability ปกติต้องรันด้วย sudo
- อย่าจับ Packet บน Production นานเกินไป: ไฟล์ PCAP อาจใหญ่มาก กิน Disk Space
- ข้อมูลใน Packet อาจเป็นความลับ: HTTP (ไม่ Encrypt) จะเห็น Username, Password, Cookies อย่าแชร์ PCAP File โดยไม่ Sanitize
- HTTPS Packet จะ Encrypt: จะเห็นแค่ Metadata (IP, Port, Timing) ไม่เห็นเนื้อหา
- อย่าลืมลบ PCAP File: หลังวิเคราะห์เสร็จ ลบไฟล์ออกจาก Server
- การจับ Packet ของคนอื่นอาจผิดกฎหมาย: ในไทย พ.ร.บ. คอมพิวเตอร์ ห้ามดักจับข้อมูลของผู้อื่นโดยไม่ได้รับอนุญาต
tcpdump Cheat Sheet
| คำสั่ง | หน้าที่ |
|---|---|
tcpdump -i eth0 |
จับ Packet บน eth0 |
tcpdump -i any |
จับ Packet บนทุก Interface |
tcpdump -i eth0 -c 100 |
จับ 100 Packet แล้วหยุด |
tcpdump -i eth0 -nn |
ไม่ Resolve Name (เร็วกว่า) |
tcpdump -i eth0 -v |
Verbose Output |
tcpdump -i eth0 -X |
แสดง Hex + ASCII |
tcpdump -i eth0 -A |
แสดง ASCII |
tcpdump -i eth0 host 1.2.3.4 |
Filter ตาม Host |
tcpdump -i eth0 port 80 |
Filter ตาม Port |
tcpdump -i eth0 tcp |
Filter ตาม Protocol |
tcpdump -i eth0 -w file.pcap |
เขียนลงไฟล์ PCAP |
tcpdump -r file.pcap |
อ่าน PCAP File |
tcpdump -i eth0 src port 22 |
Filter Source Port |
tcpdump -i eth0 dst port 3306 |
Filter Destination Port |
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn' |
จับ SYN Packet |
สรุป
tcpdump เป็นเครื่องมือที่ทรงพลังและจำเป็นสำหรับทุกคนที่ทำงานด้าน Network และ System Administration ไม่ว่าจะ Troubleshoot ปัญหา Network, ตรวจจับ Security Incident, หรือ Debug Application ที่สื่อสารผ่าน Network
คำแนะนำสำหรับผู้เริ่มต้น: เริ่มจากการจับ Packet บนเครื่อง Lab ก่อน ทดลอง Filter ต่าง ๆ จนคุ้นเคย แล้วค่อยใช้บน Production Server เมื่อต้อง Troubleshoot ปัญหาจริง อย่าลืมเซฟ PCAP File ไว้วิเคราะห์ด้วย Wireshark เพื่อความสะดวก