0
0
Lập trình
Admin Team
Admin Teamtechmely

ipasnmatcher - Gói Python cho Đối Chiếu IP đến ASN Nhanh

Đăng vào 2 ngày trước

• 3 phút đọc

Chủ đề:

#python#asn

Giới thiệu

Gần đây, một ý tưởng thú vị đã nảy ra trong đầu tôi về việc phát triển một website dành riêng cho sinh viên của BRACU. Một trong những tính năng quan trọng là giới hạn quyền truy cập vào các chức năng đặc biệt chỉ dành cho sinh viên kết nối với WiFi của trường. Tuy nhiên, làm thế nào để thực hiện điều này khi tôi không thể lưu trữ dữ liệu trên mạng nội bộ của trường?

Giải pháp tôi nghĩ đến là phân biệt các địa chỉ IP từ mạng của BRACU. Mỗi tổ chức kết nối Internet đều có một số ASN (Autonomous System Number) - giống như một ID duy nhất cho tổ chức đó. Mỗi ASN sẽ được phân bổ một dải địa chỉ IP nhất định. Ví dụ,

  • Tổ chức A với ASN 1234 có dải IP 192.168.0.9–27, tức là các địa chỉ từ 192.168.0.9 đến 192.168.0.27 là hợp lệ.

Thông tin về các số ASN và dải IP tương ứng của từng tổ chức đều là thông tin công khai. Bạn chỉ cần tìm kiếm “BRACU ASN” trên Google là có thể dễ dàng tìm thấy.

Dựa trên logic này, tôi đã tạo ra một gói Python đơn giản cho phép bạn kiểm tra xem một địa chỉ IP nào đó có thuộc dải IP của một ASN cụ thể hay không.

Tính năng

  • Đối chiếu IP đến ASN nhanh với dải mạng tối ưu
  • Bộ nhớ cache tích hợp để giảm thiểu các yêu cầu API
  • Chế độ nghiêm ngặt tùy chọn chỉ xem xét các prefix đang hoạt động
  • Sử dụng dữ liệu chính xác từ RIPE NCC

Cài đặt

bash Copy
pip install ipasnmatcher

Cách sử dụng

python Copy
from ipasnmatcher import ASN

# Tạo một đối tượng ASN sẽ lấy dữ liệu prefix từ API RIPEstat và lưu cache cục bộ
asn = ASN(asn="AS151981")

# Kiểm tra xem một IP có thuộc ASN này hay không
print(asn.match("153.53.148.45"))  # True hoặc False

Sử dụng nâng cao

python Copy
asn = ASN(
    asn="AS15169",      # ASN (ví dụ: Google)
    strict=True,        # Chỉ xem xét các prefix đang hoạt động
    cache_max_age=7200  # Thời gian lưu cache trong giây (2 giờ)
)

Kết hợp các đối tượng ASN

Kết hợp nhiều ASN bằng + để kiểm tra IP với tất cả các prefix của chúng:

python Copy
from ipasnmatcher import ASN

google = ASN("AS15169")      # Google
cloudflare = ASN("AS13335")  # Cloudflare

combined = google + cloudflare
print(combined.match("8.8.8.8"))   # True (Google)
print(combined.match("1.1.1.1"))   # True (Cloudflare)

repr() cho thấy sự kết hợp đầy đủ:

python Copy
ASN(asn='AS15169', strict=False, cache_max_age=3600) + ASN(asn='AS13335', strict=False, cache_max_age=3600)

Tham số

python Copy
ASN(asn: str, strict: bool = False, cache_max_age: int = 3600)
  • asn: Định danh ASN theo định dạng "AS12345"
  • strict: Nếu True, chỉ xem xét các prefix đang hoạt động (mặc định: False)
  • cache_max_age: Thời gian sống của cache tính bằng giây (mặc định: 3600)

Cách hoạt động

  • Khi khởi tạo, đối tượng ASN sẽ lấy các prefix được thông báo từ API RIPEstat và lưu vào cache cục bộ trong .ipasnmatcher_cache/{asn}.json.
  • Các lần sử dụng tiếp theo sẽ tải dữ liệu từ cache nếu nó còn mới (không quá tuổi thọ cache_max_age).
  • Việc kiểm tra IP với các prefix của ASN được thực hiện hiệu quả bằng cách sử dụng module ipaddress của Python.

Các trường hợp sử dụng

  • Bảo mật mạng và xác thực lưu lượng truy cập
  • Định tuyến lưu lượng CDN dựa trên quyền sở hữu ASN
  • Phân loại IP bởi các nhà điều hành mạng
  • Giám sát tuân thủ các kết nối mạng

Các thực tiễn tốt nhất

  • Luôn đảm bảo cập nhật gói ipasnmatcher của bạn để có dữ liệu chính xác nhất.
  • Sử dụng chế độ nghiêm ngặt khi bạn chỉ muốn làm việc với các prefix đang hoạt động.

Những cạm bẫy thường gặp

  • Không kiểm tra kỹ lưỡng các dải IP có thể dẫn đến việc bỏ sót một số IP hợp lệ.
  • Quá phụ thuộc vào cache mà không làm mới dữ liệu thường xuyên có thể gây ra lỗi trong việc xác định IP.

Mẹo hiệu suất

  • Giảm thiểu số lượng yêu cầu API bằng cách tăng thời gian sống cache.
  • Kết hợp các ASN khi cần thiết để tối ưu hóa kiểm tra IP.

Kết luận

Hy vọng bạn sẽ thích gói ipasnmatcher này! Tôi rất trân trọng nếu bạn có thể sao chép hoặc đánh giá trên GitHub để giúp dự án phát triển hơn.

GitHub

Hãy sao chép hoặc đánh dấu dự án này trên GitHub.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào