0

[Open Source] #52 - AdGuard Home: Hệ thống DNS Filtering toàn mạng hiệu năng cao với Golang và kiến trúc Single-Binary

Việc kiểm soát an ninh mạng gia đình thường yêu cầu những kiến thức chuyên sâu về networking và phần cứng. Tuy nhiên, AdGuard Home đã thay đổi cuộc chơi bằng cách cung cấp một giải pháp "tất cả trong một", biến những kỹ thuật phức tạp như DNS Filtering, DHCP Management thành một trải nghiệm mượt mà, dễ dàng triển khai trên các thiết bị cấu hình thấp như Raspberry Pi hay Router.

Dưới góc độ kỹ thuật, AdGuard Home là một ví dụ điển hình về việc tối ưu hóa hiệu suất với Golang và sự sáng tạo trong việc đóng gói sản phẩm (packaging) để mang lại trải nghiệm DevOps tối giản.

Github: https://github.com/AdguardTeam/AdGuardHome


🛠️ 1. Nền tảng công nghệ: Sức mạnh của Golang và React

AdGuard Home tận dụng sự kết hợp hoàn hảo giữa hiệu năng xử lý mạng của Go và tính trực quan của React:

  • DNS Engine (Golang): Xử lý hàng nghìn yêu cầu DNS mỗi giây với độ trễ tối thiểu nhờ mô hình Goroutines. Hỗ trợ tất cả các giao thức bảo mật mới nhất: DoH (HTTPS), DoT (TLS), DoQ (QUIC)DNSCrypt.
  • Embedded UI: Toàn bộ giao diện quản trị React sau khi build sẽ được nén và nhúng trực tiếp vào tệp thực thi Go bằng go:embed. Điều này giúp người dùng chỉ cần chạy một file duy nhất mà không cần cài thêm Web Server (Nginx/Apache).
  • Hệ thống lọc (Filter-Chain): Sử dụng các thuật toán đối khớp chuỗi hiệu năng cao (Aho-Corasick hoặc Bitap) để kiểm tra tên miền với hàng triệu quy tắc Adblock mà không làm chậm tốc độ duyệt web.

🏗️ 2. Tư duy Kiến trúc: Pipeline Lọc dữ liệu đa tầng

Kiến trúc của AdGuard Home hoạt động như một bộ lọc thông minh (Interceptor) nằm giữa thiết bị của bạn và Internet:

  1. Sơ đồ hóa Pipeline: Một yêu cầu DNS đi qua 3 tầng kiểm soát:
    • Access Control: Kiểm tra quyền truy cập của thiết bị.
    • Static Filtering: Đối khớp với danh sách chặn (DNS Sinkholing).
    • Dynamic Security: Gọi các API bảo mật (Safe Browsing) bằng cơ chế hash prefix để bảo vệ quyền riêng tư (không gửi trực tiếp domain của bạn lên server).

🔄 3. Workflow: Luồng xử lý một yêu cầu DNS (Sequence Diagram)

Dưới đây là sơ đồ chi tiết cách AdGuard Home xử lý một yêu cầu từ thiết bị người dùng:

image.png

⚡ 4. Các kỹ thuật "Pro-level" tối ưu hiệu năng

  1. Optimistic Caching (Cache lạc quan): Khi một bản ghi DNS hết hạn (TTL = 0), AdGuard Home sẽ trả kết quả cũ ngay lập tức cho người dùng, sau đó mới cập nhật cache ngầm. Kỹ thuật này giúp giảm độ trễ về 0ms cho các domain thường xuyên truy cập.

  2. Fastest IP Algorithm: AGH gửi yêu cầu DNS đến nhiều Upstream (Google, Cloudflare, Quad9) cùng lúc. Nó đo tốc độ bắt tay TCP/ICMP và chọn kết quả từ server có đường truyền nhanh nhất tới người dùng.

  3. Anonymization (Ẩn danh hóa): Trước khi lưu log vào database, hệ thống xóa các bit cuối của địa chỉ IP khách hàng (Client IP), đảm bảo quyền riêng tư và tuân thủ các quy định khắt khe như GDPR.


⚖️ 5. So sánh chiến lược

Tiêu chí AdGuard Home Pi-hole DNS của nhà mạng (ISP)
Giao thức bảo mật DoH, DoT, DoQ, DNSCrypt Giới hạn (DoH cần cài thêm) Không có (Plain DNS)
Cài đặt Single Binary (Cực dễ) Shell Script (Phức tạp hơn) Có sẵn
Giao diện Hiện đại (React), tích hợp sẵn Cơ bản (PHP) Không có
Tính năng kèm theo DHCP, Parental Control DHCP Không

✅ Kết luận: Tại sao AdGuard Home là hình mẫu lý tưởng?

AdGuard Home không chỉ là một công cụ chặn quảng cáo; nó là một bài học về việc đóng gói phần mềm phức tạp thành một sản phẩm tiêu dùng. Việc sử dụng Go giúp hệ thống cực kỳ nhẹ (chỉ tốn ~20-30MB RAM), trong khi việc nhúng UI vào binary giúp xóa bỏ rào cản về triển khai (deployment).

Đối với các kỹ sư backend, nghiên cứu AdGuard Home sẽ giúp bạn hiểu sâu về:

  • Cách viết Network Proxy hiệu năng cao.
  • Kỹ thuật Concurrency control trong Go để xử lý hàng vạn kết nối UDP/TCP.
  • Tư duy Privacy-first khi thiết kế hệ thống lưu trữ log và dữ liệu người dùng.

Hy vọng bản phân tích này mang lại cho bạn những góc nhìn giá trị về cách xây dựng hệ thống mạng an toàn và hiệu quả. Đừng quên Upvote để ủng hộ series "Kỳ quan mã nguồn" này nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí