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
đến192.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
pip install ipasnmatcher
Cách sử dụng
python
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
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
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
ASN(asn='AS15169', strict=False, cache_max_age=3600) + ASN(asn='AS13335', strict=False, cache_max_age=3600)
Tham số
python
ASN(asn: str, strict: bool = False, cache_max_age: int = 3600)
asn
: Định danh ASN theo định dạng"AS12345"
strict
: NếuTrue
, 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.