Tại sao SNMP thất bại khi mạng gặp sự cố lúc 2 giờ sáng
Lúc đó là 2 giờ sáng, và điện thoại của tôi rung liên hồi trên tủ đầu giường. Đường truyền core uplink đang báo động đỏ. Tôi mở biểu đồ SNMP trong Zabbix, và chúng xác nhận cuộc khủng hoảng: một đường thẳng băng ở mức 10Gbps. Nhưng SNMP là một công cụ thô sơ. Nó chỉ cho tôi biết bao nhiêu băng thông đang được sử dụng, chứ không hề cho biết ai đang sử dụng nó. Đó là một bản sao lưu (backup) bị quá giờ? Một cuộc tấn công DDoS quy mô lớn? Hay chỉ là một kỹ sư đang di chuyển cơ sở dữ liệu 5TB giữa các phân đoạn mạng?
Trước đây, để giải quyết vấn đề này nghĩa là phải đăng nhập vào từng router để chạy lệnh bắt gói tin (packet capture) thủ công hoặc quét bảng NAT. Cách này chậm chạp, tẻ nhạt và mang tính đối phó. Để khắc phục, tôi cần một hệ thống có thể nạp flow data—siêu dữ liệu (metadata) của mọi kết nối đơn lẻ—và cho phép tìm kiếm trong vài giây. Tôi đã triển khai bộ công cụ (stack) cụ thể này trong các môi trường xử lý hơn 50.000 flow mỗi giây. Nó không chỉ hoạt động tốt; nó còn duy trì sự ổn định ngay cả khi mạng ở tình trạng tồi tệ nhất.
Các ứng cử viên: NetFlow vs. sFlow vs. Packet Capture
Trước khi xây dựng hệ thống, bạn phải chọn nguồn dữ liệu. Router và switch thường sẽ không chuyển tiếp (mirror) toàn bộ gói tin tới bộ thu thập (collector) vì điều đó sẽ làm quá tải CPU. Thay vào đó, chúng gửi các bản tóm tắt được gọi là “flows”.
- NetFlow/IPFIX (Stateful): Router lưu bộ nhớ đệm cho mọi kết nối. Khi một phiên kết thúc, nó xuất ra một bản tóm tắt bao gồm IP nguồn, IP đích, Cổng (Port) và tổng số Byte. Nó cực kỳ chính xác cho việc tính cước nhưng có thể làm tăng tải CPU trên các phần cứng cũ.
- sFlow (Sampling): Phần cứng sẽ chụp một ảnh nhanh (snapshot) của 1 trong mỗi N gói tin (ví dụ: 1 trong 2048 gói). Vì việc này được xử lý bởi chip chuyển mạch ASIC, nó hầu như không tốn tài nguyên CPU. Đây là tiêu chuẩn vàng cho các đường trục (backbone) tốc độ cao 100Gbps.
- Packet Capture (Full): Hãy nghĩ đến
tcpdumphoặc Wireshark. Mặc dù hoàn hảo để gỡ lỗi bắt tay ứng dụng, nhưng việc cố gắng lưu trữ toàn bộ gói tin cho một đường truyền 10Gbps sẽ yêu cầu hàng petabyte dung lượng lưu trữ.
Bộ công cụ: Tại sao lại là Akvorado và ClickHouse?
Trong thập kỷ qua, tiêu chuẩn để phân tích flow là bộ ELK (Elasticsearch, Logstash, Kibana). Tuy nhiên, Elasticsearch nổi tiếng với việc tiêu tốn lượng RAM khổng lồ và gặp khó khăn với dữ liệu log có độ đa dạng cao (high-cardinality). Akvorado thay đổi cuộc chơi bằng cách sử dụng ClickHouse làm công cụ lưu trữ và xử lý.
ClickHouse là một cơ sở dữ liệu dạng cột (columnar database) được xây dựng để tối ưu tốc độ. Nó có thể nén log flow gấp 10 lần so với các cơ sở dữ liệu truyền thống và truy vấn hàng tỷ dòng trong chưa đầy một giây. Theo kinh nghiệm của tôi, một node ClickHouse đơn lẻ có thể đảm đương công việc của một cụm Elasticsearch năm node.
Ưu và nhược điểm của hệ sinh thái Akvorado
Ưu điểm
- Hiệu quả: Nó xử lý việc nạp dữ liệu tốc độ cao trên phần cứng khiêm tốn. Bạn không cần 128GB RAM chỉ để xem các đỉnh lưu lượng của mình.
- Tích hợp sẵn (Batteries Included): Akvorado đóng gói bộ nạp (ingester), giao diện web hiện đại và trình quản lý schema vào một gói thống nhất.
- Tự động làm giàu dữ liệu: Nó tự động ánh xạ các flow tới số hiệu mạng (ASN) và dữ liệu GeoIP. Bạn có thể biết ngay lập tức liệu lưu lượng của mình đang đi đến một ISP địa phương hay một trung tâm dữ liệu ở Frankfurt.
Đánh đổi
- Dung lượng ổ đĩa: Ngay cả với khả năng nén tuyệt vời, việc lưu giữ 90 ngày dữ liệu flow cho một mạng bận rộn cuối cùng sẽ yêu cầu vài terabyte lưu trữ NVMe hoặc SSD tốc độ cao.
- Thiết lập ban đầu: Bạn sẽ cần làm quen với các phân vùng (partitions) của ClickHouse nếu có kế hoạch mở rộng quy mô vượt ra ngoài một vài thiết bị.
Kiến trúc thiết lập khuyến nghị
Tôi ưu tiên sử dụng Docker Compose cho các triển khai nhỏ, mặc dù các thành phần có thể được tách ra trên nhiều máy chủ khi lưu lượng tăng lên:
- Exporters: Phần cứng Cisco, MikroTik hoặc Juniper của bạn được cấu hình để gửi NetFlow (UDP 2055) hoặc sFlow (UDP 6343).
- Akvorado Ingester: Dịch vụ này nhận các gói tin UDP, giải mã dữ liệu nhị phân, thêm ngữ cảnh GeoIP/BGP và ghi vào ClickHouse.
- ClickHouse: Trung tâm sức mạnh phân tích lưu trữ các bản ghi của bạn.
- Akvorado Console: Bảng điều khiển nơi bạn thực hiện các truy vấn thực tế.
Hướng dẫn triển khai
1. Triển khai bộ công cụ
Tạo một thư mục cho bộ công cụ của bạn và sử dụng cấu hình tối ưu này. Lưu ý các giới hạn nofile; ClickHouse cần chúng để xử lý hàng ngàn phần dữ liệu đồng thời.
# docker-compose.yml
version: '3.8'
services:
clickhouse:
image: clickhouse/clickhouse-server:latest
container_name: akvorado-clickhouse
volumes:
- ./ch-data:/var/lib/clickhouse
ulimits:
nofile:
soft: 262144
hard: 262144
akvorado:
image: akvorado/akvorado:latest
container_name: akvorado-orchestrator
ports:
- "2055:2055/udp" # NetFlow
- "6343:6343/udp" # sFlow
- "8080:8080" # Giao diện Web
environment:
- AKVORADO_CLICKHOUSE_SERVERS=clickhouse:9000
- AKVORADO_INGESTER_LISTEN_NETFLOW=0.0.0.0:2055
- AKVORADO_INGESTER_LISTEN_SFLOW=0.0.0.0:6343
depends_on:
- clickhouse
2. Cấu hình phần cứng
Trỏ thiết bị của bạn về bộ thu thập mới. Dưới đây là cách thực hiện trên hai nền tảng phổ biến.
MikroTik (Traffic Flow)
/ip traffic-flow
set enabled=yes interfaces=ether1 cache-entries=128k
/ip traffic-flow target
add dst-address=192.168.1.50 port=2055 version=9
Cisco (NetFlow v9)
interface GigabitEthernet0/1
ip flow ingress
ip flow egress
!
ip flow-export destination 192.168.1.50 2055
ip flow-export version 9
ip flow-cache timeout active 1
3. Phân tích kết quả
Truy cập giao diện web tại http://<ip-cua-server>:8080. Nếu các gói tin đã đến được máy chủ, các biểu đồ sẽ hiển thị trong vòng 60 giây. Bước đầu tiên của tôi luôn là kiểm tra “Top Talkers”. Bằng cách nhóm theo SrcIP và sắp xếp theo Bytes, những kẻ ngốn băng thông sẽ lộ diện ngay lập tức. Nếu một máy trạm nội bộ đang kết nối với một IP lạ ở quốc gia khác qua cổng 443, bạn có thể đi sâu vào các mốc thời gian cụ thể để xem đó là một vụ rò rỉ dữ liệu hay chỉ là một bản cập nhật Windows.
Bài học từ môi trường thực tế quy mô lớn
Khi tôi chuyển hệ thống này vào môi trường sản xuất với nhiều đường truyền 40Gbps, tôi đã gặp một vài điểm nghẽn. Dưới đây là cách để tránh chúng:
- Tinh chỉnh Kernel: Kernel Linux sẽ loại bỏ (drop) các gói tin UDP nếu bộ nạp đang bận. Chạy lệnh
sysctl -w net.core.rmem_max=26214400để cấp cho hệ thống bộ đệm 25MB. - Mạnh dạn lấy mẫu (Sampling): Đừng cố gắng lấy mẫu tỉ lệ 1:1 trên đường truyền 10Gbps. Hãy sử dụng 1:2000 hoặc 1:4000. Akvorado tự động nhân tỷ lệ các con số trở lại để tổng số liệu của bạn vẫn chính xác.
- Thiết lập chính sách lưu trữ: ClickHouse sẽ sẵn sàng tiêu tốn toàn bộ ổ cứng của bạn. Hãy thiết lập
retentioncủa Akvorado thành 14 hoặc 30 ngày để tự động xóa dữ liệu cũ.
Khả năng quan sát thay đổi mọi thứ. Thay vì đoán mò lý do tại sao mạng chậm, bạn đã có bằng chứng cần thiết để khắc phục vấn đề. Nó biến một cơn ác mộng lúc 2 giờ sáng thành một nhiệm vụ chẩn đoán trong 5 phút.

