Khi các công cụ mạng cơ bản ‘đầu hàng’
Dân DevOps hay System Admin chắc chẳng lạ gì cảnh ping vẫn thông, telnet báo port mở, nhưng ứng dụng thì vẫn chập chờn. Những lúc như vậy, các công cụ truyền thống như curl hay nmap thường không đủ sâu để soi thấu chân tướng sự việc. Chúng hoạt động theo các kịch bản định sẵn, thiếu đi sự linh hoạt khi gặp lỗi dị.
Mình từng xử lý một ca khó khi cụm K8s bị mất gói tin ngẫu nhiên lúc traffic chạm ngưỡng 800Mbps. Dùng mtr hay tcpdump chỉ thấy gói tin ‘bốc hơi’ không dấu vết. Sau cùng, mình phải dùng Scapy giả lập gói tin TCP có kích thước 1460 bytes (sát nút MTU) kèm flag ECN (Explicit Congestion Notification). Kết quả? Một con switch cũ bị lỗi buffer khi xử lý ECN đã lộ diện. Đó là lúc mình nhận ra: Muốn trị bệnh khó, bạn phải tự tay tạo ra ‘mẫu thử’ theo ý mình.
Cân nhắc giữa các phương pháp can thiệp mạng
Trước khi bắt đầu với Scapy, hãy nhìn lại những món đồ nghề chúng ta thường có trong túi:
1. Công cụ dòng lệnh (Ping, Hping3, Nmap)
Nhóm này cực nhanh và tiện lợi cho các bài test cơ bản. Tuy nhiên, chúng rất cứng nhắc. Bạn gần như không thể can thiệp vào từng bit trong IP Header hay tạo ra một checksum sai để test Firewall. Hping3 có thể tùy biến đôi chút nhưng vẫn bị giới hạn trong các template có sẵn.
2. Lập trình Socket (C/Python)
Cách này cho phép bạn can thiệp sâu nhất và hiệu năng cực cao. Đổi lại, nó cực kỳ tốn thời gian. Viết một đoạn code C để thực hiện cú bắt tay 3 bước (3-way handshake) thủ công là một cực hình nếu bạn đang cần fix bug gấp trong đêm.
3. Scapy – ‘Lego’ của giới Network
Scapy kết hợp được sự linh hoạt của lập trình và tính tiện dụng của công cụ CLI. Viết bằng Python, Scapy cho phép bạn chồng các lớp giao thức lên nhau như lắp ghép Lego. Bạn muốn gói HTTP nằm trong ICMP? Scapy làm được chỉ với một dòng code. Điểm yếu duy nhất là tốc độ không đủ nhanh để stress test hàng triệu gói tin mỗi giây.
Triết lý ‘chồng lớp’ độc bản của Scapy
Scapy không chỉ gửi gói tin; nó lắng nghe, phân tích và phản hồi một cách thông minh. Điểm ăn tiền nhất chính là toán tử /. Trong Scapy, dấu gạch chéo dùng để xếp chồng các lớp giao thức từ thấp đến cao. Ví dụ: Ether()/IP()/TCP(). Cách tiếp cận này trực quan đến mức bạn nhìn vào code là hiểu ngay cấu trúc gói tin đang định gửi.
Cài đặt nhanh trên Linux
Bạn có thể cài Scapy qua trình quản lý gói của hệ điều hành hoặc pip. Nếu chỉ dùng để debug nhanh, cài trực tiếp vào hệ thống là cách lẹ nhất.
# Trên Ubuntu/Debian
sudo apt update && sudo apt install python3-scapy -y
# Hoặc dùng pip cho mọi distro
pip3 install scapy
Gõ sudo scapy để vào console. Đừng quên sudo, vì việc can thiệp raw socket yêu cầu quyền root để ‘nói chuyện’ trực tiếp với card mạng.
3 kỹ thuật debug thực tế với Scapy
1. Chèn ‘mật thư’ vào gói tin ICMP
Thay vì ping nhàm chán, hãy thử chèn một chuỗi dữ liệu vào payload để kiểm tra xem hệ thống IDS/IPS có lọc nội dung hay không.
# Tạo gói tin có payload tùy chỉnh
pkt = IP(dst="192.168.1.1")/ICMP()/"Test_IDS_Signature_001"
# Gửi và đợi 1 phản hồi duy nhất
reply = sr1(pkt, timeout=2)
if reply:
reply.show()
2. Kiểm tra Firewall với TCP SYN
Để check xem Firewall có drop các gói tin có flag lạ hay không, bạn có thể giả lập bước đầu của TCP Handshake với các tùy chọn đặc biệt:
# Gửi gói SYN vào port 443 với tùy chọn MSS
syn_pkt = IP(dst="10.0.0.5")/TCP(dport=443, flags="S", options=[('MSS', 1460)])
ans = sr1(syn_pkt, timeout=2)
# Nếu nhận được flags='SA' (SYN-ACK) nghĩa là port đang mở
if ans: print(f"Phản hồi từ: {ans.src} với flags: {ans.getlayer(TCP).flags}")
3. Traceroute ‘thủ công’ để tìm nút thắt
Khi lệnh traceroute thông thường bị chặn, bạn có thể tự điều khiển TTL (Time To Live). Cách này giúp xác định chính xác router nào đang âm thầm drop gói tin của bạn.
for i in range(1, 10):
pkt = IP(dst="8.8.8.8", ttl=i)/UDP(dport=33434)
reply = sr1(pkt, timeout=1, verbose=0)
if reply:
print(f"Hop {i}: {reply.src}")
else:
print(f"Hop {i}: * ")
Lưu ý ‘xương máu’: Tránh đụng độ với Kernel
Một vấn đề kinh điển khi dùng Scapy là sự can thiệp của Kernel Linux. Khi Scapy gửi một gói SYN, Server sẽ trả về SYN-ACK. Tuy nhiên, Kernel không hề biết về session này (vì Scapy gửi bypass kernel). Ngay lập tức, Kernel sẽ gửi gói RST để đóng kết nối ‘lạ’ này lại.
Để Scapy hoạt động mượt mà, bạn nên tạm thời chặn Kernel gửi gói RST bằng iptables:
sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
Lời kết
Scapy không phải là công cụ để check mạng hàng ngày. Nó là món vũ khí hạng nặng dành cho những tình huống ‘ngàn cân treo sợi tóc’. Khi mọi công cụ báo xanh nhưng hệ thống vẫn lỗi, đó là lúc Scapy tỏa sáng. Nắm vững cách cấu trúc gói tin từ Layer 2 đến Layer 7 sẽ đưa tư duy Network của bạn lên một tầm cao mới. Hãy cứ mạnh dạn vọc vạch, vì đó là cách nhanh nhất để giỏi hệ thống.

