Hướng dẫn python cidr to ip range - python cidr đến dải ip

Tạo tất cả các địa chỉ IP công cộng được cung cấp một CIDR

https://github.com/stephenlb/geo-ip sẽ tạo một danh sách các địa chỉ công khai IP hợp lệ bao gồm các địa phương.

for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
1 đến
for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
2 là phạm vi địa chỉ IP công cộng hợp lệ không bao gồm các địa chỉ IP riêng dành riêng.
are the valid public IP Address range exclusive of the reserved Private IP Addresses.

Máy phát điện IP

Tạo một kết xuất JSON của các địa chỉ IP và thông tin địa lý liên quan. Lưu ý rằng phạm vi địa chỉ IP công cộng hợp lệ là từ

for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
1 đến
for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
2 không bao gồm các phạm vi địa chỉ IP riêng được dành riêng được hiển thị thấp hơn trong README này.

docker build -t geo-ip .
docker run -e IPRANGE='54.0.0.0/30' geo-ip               ## a few IPs
docker run -e IPRANGE='54.0.0.0/26' geo-ip               ## a few more IPs
docker run -e IPRANGE='54.0.0.0/16' geo-ip               ## a lot more IPs
docker run -e IPRANGE='0.0.0.0/0'   geo-ip               ## ALL IPs ( slooooowwwwww )
docker run -e IPRANGE='0.0.0.0/0'   geo-ip > geo-ip.json ## ALL IPs saved to JSON File
docker run geo-ip 

Một tùy chọn nhanh hơn một chút để quét tất cả các địa chỉ công cộng hợp lệ:

for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done

Điều này in ít hơn 4.228.250.625 dòng JSON cho stdout. Dưới đây là một ví dụ về một trong các dòng:

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}

Phạm vi IP riêng và dành riêng

Dockerfile trong repo ở trên sẽ loại trừ các địa chỉ IP không thể sử dụng theo hướng dẫn từ bài viết Wikipedia: https://en.wikipedia.org/wiki/Reserved_ip_addresseses

MaxMind Geo IP

Dockerfile nhập khẩu cơ sở dữ liệu công cộng miễn phí do https://www.maxmind.com/en/home cung cấp

Cập nhật vào ngày 26 tháng 7 năm 2022 trong #Deployment, #Flask

Hướng dẫn python cidr to ip range - python cidr đến dải ip

Chúng tôi sẽ tạo ra logic cho danh sách trắng, một danh sách được miễn trừ tùy chọn, làm việc với các khối CIDR và ​​điểm chuẩn một vài giải pháp.

Nhảy nhanh: Hiểu vấn đề | Hack một bằng chứng về khái niệm | Hỏi một nhà phát triển cho ý kiến ​​của họ | Bắt đầu với 10.x hoặc thêm vào hỗ trợ CIDR? | Mã và điểm chuẩn | Video hướng dẫn Understanding the Problem | Hacking Up a Proof of Concept | Asking a Developer for Their Opinion | Starts with 10.X or Add in CIDR Support? | The Code and Benchmarks | Video Walkthrough

Nếu bạn thích video, tôi đã ghi lại một video quảng cáo bằng không về điều này trên YouTube.

Trước khi chúng tôi đi sâu vào mã, tôi nghĩ rằng tại sao, hoặc bối cảnh xung quanh vấn đề là thực sự quan trọng. Nếu bạn không quan tâm đến điều đó thì hãy thoải mái nhảy thẳng vào mã.

Bài đăng này sẽ là một hỗn hợp các chi tiết kỹ thuật, tìm ra cách tối đa hóa giá trị kinh doanh dựa trên các vấn đề hiện tại của bạn và cách đặt câu hỏi có thể định hình một tính năng.

Hiểu vấn đề

Gần đây, đối với một số công việc của khách hàng, tôi đã chuyển một công việc cron vào Kubernetes và nó được gọi là API dịch vụ sử dụng danh sách địa chỉ IP cho phép danh sách bảo mật thêm để ngăn chặn người gọi không mong muốn.

Trước khi nó ở trong Kubernetes, công việc cron ________ 15‘d miền bên ngoài của dịch vụ nên nó đã chảy qua internet công cộng, chẳng hạn như

for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
6. Ứng dụng được lưu trữ một danh sách các địa chỉ IP được phân tách bằng dấu phẩy trong cơ sở dữ liệu đóng vai trò là danh sách cho phép.

Trên mọi yêu cầu, nó sẽ nhận được yêu cầu IP IP, thực hiện tra cứu DB, chia các IPS trên dấu phẩy, lặp qua từng cái và thực hiện kiểm tra để xem IP chính xác có khớp không. Ban đầu, nó được tạo ra để xử lý so sánh chính xác 1 địa chỉ IP với một địa chỉ IP khác và vì chỉ có một vài người gọi từ các IP tĩnh đã biết, đây không phải là vấn đề.

Tôi đã không phải là người xung quanh cho mã đó nhưng nó không quan trọng. Giải pháp đã hoạt động và đây là một công ty rất thành công trong kế hoạch lớn của mọi thứ.

Tôi biết điều này cũng có thể được giải quyết ở nhiều lớp khác nhau. Ví dụ: tại tường lửa, nginx hoặc lớp ứng dụng. Họ đã đi cho lớp ứng dụng để quản trị viên có thể dễ dàng điều chỉnh danh sách cho phép mà không cần xử lý các thay đổi cơ sở hạ tầng.

Nó thời gian Kubernetes

Tôi đã sử dụng Kubernetes

for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
7 và cấy cùng một lệnh Curl. Tuy nhiên, tôi thích ý tưởng nâng cấp thay vì các lớp bên nếu tôi có thể.

Cụm Kubernetes nằm trên EKS (AWS) và có 2 cổng NAT có nghĩa là lưu lượng ngoài ra khỏi cụm của chúng tôi đều có cùng một bộ địa chỉ IP. Về cơ bản, chúng tôi có thể có 15 nút trong cụm của mình với hàng trăm dịch vụ và khối lượng công việc nhưng tất cả lưu lượng truy cập sẽ là 1 trong 2 địa chỉ IP.

Nếu chúng tôi muốn giữ mọi thứ giống hệt nhau và cuộn tròn miền bên ngoài như trước thì DB cho phép DB cho phép chỉ cần thêm 2 địa chỉ IP và chúng tôi sẽ rất tốt.

Nhưng như đã đề cập trước đây, tôi thích nâng cấp. Kết nối qua internet công khai cho điều này trong một thế giới Kubernetes có vẻ lý tưởng. Nó sẽ giống như đi 100 dặm ra khỏi đường chỉ để băng qua đường của bạn.

Đi qua Internet công khai sẽ chậm hơn vì nó liên quan đến Internet. Nó cũng cần phải đi qua AWS Route 53 (DNS), AWS ALB (Bộ cân bằng tải ứng dụng) và Cổng NAT. Tất cả những điều này có chi phí trực tiếp bằng tiền cũng như thời gian.

Trong sơ đồ lớn của những thứ có lẽ điều này mất thêm 10-15m cho một cái gì đó được gọi là vài lần mỗi phút. Đó không phải là một vấn đề lớn nhưng nếu chúng ta có thể tránh nó khá dễ dàng tại sao không làm điều đó?

Bám sát mạng Kubernetes nội bộ

Điều này là tốt đẹp vì Kubernetes cung cấp cho chúng tôi DNS nội bộ theo mặc định. Bạn có thể kết nối với tên dịch vụ của bạn trực tiếp, chẳng hạn như

for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
8 Giả sử bạn có một dịch vụ có tên
for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
9. Không có TLD (.com, v.v.) và nó trên HTTP vì lưu lượng không bao giờ rời khỏi cụm của bạn. Tuyến đường 53 và một alb aren được sử dụng, Internet công cộng cũng không bao giờ được truy cập.

Đối với lưu lượng nội bộ trong cụm của chúng tôi, chúng tôi có một khối CIDR là

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
0, điều đó có nghĩa là có 65.536 địa chỉ IP có thể mà một nhóm có thể chạy. Đó là
{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
1 đến
{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
2. Bạn có thể tìm thấy một máy tính CIDR ở đây.

Không cần phải nói thêm tất cả các địa chỉ IP 65K vào danh sách cho phép của chúng tôi không phải là một giải pháp khả thi.

Về cơ bản, chúng tôi có 2 tùy chọn, chúng tôi có thể chọn cập nhật mã kiểm tra IP để hỗ trợ các khối CIDR hoặc đi tắt và thay vì thực hiện so sánh chuỗi chính xác của toàn bộ IP, bạn có thể thực hiện một chuỗi bắt đầu với so sánh với so sánh.

Hack một bằng chứng về khái niệm

Tại thời điểm này, tôi đã nói chuyện với bất kỳ ai khác về tính năng này. Tại nơi này, tôi đã khá nhiều kỹ sư solo sre / bục / kỹ sư DevOps / bất cứ điều gì bạn muốn để phân loại dòng công việc này là.

Dù sao, tôi biết công việc cron sẽ thất bại khi sử dụng mạng nội bộ và nó đã làm. Ứng dụng đã báo cáo chính xác rằng địa chỉ IP

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
3 không được phép.

Tùy chọn sử dụng bắt đầu với các trò chơi bắt đầu với cảm thấy một chút hacky nhưng mã cho phép IP cho phép mã danh sách được phân lập thành 1 hàm. Ở đây, một phiên bản đơn giản hóa của mã đó:

def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False

Tôi hình dung tôi có thể sửa đổi điều kiện đó để kiểm tra tiền tố IP, một cái gì đó như:

    if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
        return True

Điều này sẽ xảy ra trước khi cơ sở dữ liệu được chạm vào vì Python có thể ngắn mạch

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
4 điều kiện. Nó cảm thấy hacky bởi vì có một số nổi ở giữa một hàm. Tôi biết chúng tôi không có trường hợp sử dụng thực sự để cần kiểm tra CIDR thích hợp nhưng vẫn làm tôi cảm thấy hơi bẩn khi xem xét vận chuyển điều đó để sản xuất.

Nhưng có những khía cạnh của giải pháp này mà tôi thích, chẳng hạn như không cần phải tra cứu DB.

Hỏi một nhà phát triển cho ý kiến ​​của họ

Trong khi tôi ở hầu hết là một vị trí solo, tôi tiếp xúc trực tiếp với một loạt các nhà phát triển.

Anh ấy đọc vé mà tôi đã tạo ra giải thích vấn đề và cũng so sánh các ưu và nhược điểm của cả hai giải pháp (bắt đầu với kiểm tra VS CIDR).

Họ nói rằng họ nghĩ rằng sự khởi đầu với giải pháp sẽ hoạt động nhưng anh ấy ngay lập tức hỏi tôi một câu hỏi về địa chỉ 10,0 mà 10,0 đã thay đổi?he immediately asked me a question of “Will that 10.0 address ever change?”.

Vì một số lý do đã lật một cái gì đó trong não của tôi. Trong vòng 1 giây, cảm giác như cả một thế giới đã tự làm sáng tỏ. Bằng chứng của tôi về khái niệm rung chuông cảnh báo nội bộ và cảm thấy hacky vì việc triển khai là giòn, có các số nổi ở giữa một chức năng và nó đã giúp bạn dễ dàng kiểm tra các tiền tố IP khác nhau.

Việc thực hiện là hacky nhưng ý tưởng sử dụng bắt đầu với trường hợp sử dụng của chúng tôi là không.

Dù sao,

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
5 sẽ không bao giờ thay đổi trừ khi chúng tôi xây dựng lại hoàn toàn VPC và cụm của mình và quyết định sử dụng một cái gì đó khác nhưng một nhà phát triển trong nhóm sẽ không biết chi tiết đó. Trong đầu, ban đầu tôi cảm thấy thoải mái khi mã hóa cứng
{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
5 trực tiếp vì tôi biết có hiệu quả là 0% cơ hội sẽ thay đổi.

Nhưng trở lại thế giới 1 thứ hai. Điều đó đã thay đổi toàn bộ mô hình tinh thần của tôi về vấn đề bằng cách suy nghĩ về những gì nếu nó đã thay đổi? Và điều đó khiến tôi nghĩ rằng ít nhất giá trị này sẽ là một tùy chọn cấu hình. Nó đã không dừng lại ở đó vì sau đó tôi nghĩ về việc muốn hỗ trợ thêm hơn 1 IP hoặc phạm vi có vẻ hợp lý.

Sau đó, giải pháp trở nên rõ ràng hơn. Những gì tôi thực sự muốn là một danh sách miễn trừ danh sách màu trắng IP. Về cơ bản, một danh sách các địa chỉ IP hoặc phạm vi sẽ luôn được phép truy cập.

Một khi điều đó trở thành một khái niệm thì thật có ý nghĩa khi tránh được sự tra cứu DB vì nó được miễn trừ. Chi tiết sử dụng bắt đầu với hoặc một khối CIDR là một quyết định thứ yếu.

Bắt đầu với 10.x hoặc thêm vào hỗ trợ CIDR?

Trong gần một thập kỷ, không bao giờ có yêu cầu khách hàng hỗ trợ khối CIDR hoặc phạm vi địa chỉ IP vào danh sách trắng. Nó không có cảm giác như nó đáng để thêm sự hỗ trợ đó cho cái quái của nó.

API là lưu lượng truy cập siêu cao, vì vậy tốc độ thực hiện của chức năng này là rất quan trọng. Tôi đã có một linh cảm, một chức năng xác nhận CIDR sẽ mất nhiều thời gian hơn để chạy nhưng tôi đã không để điều đó đóng một vai trò lớn trong quyết định này.

Hóa ra chậm hơn ~ 50 lần để tính phạm vi IP trong CIDR bằng cách sử dụng Python, được xây dựng trong các chức năng để thực hiện điều này nhưng điểm chuẩn đó là lừa đảo. Phải mất 15 micro giây để tính toán nó khi kiểm tra xem một chuỗi bắt đầu bằng một chuỗi khác có thể lấy 0,3 micro giây.

Điều đó có nghĩa là khoảng ~ 67K so với ~ 3,5 triệu lần thực hiện mỗi giây. Điều đó có vẻ như là một sự khác biệt lớn và sẽ rất liên quan nhưng nếu nó đã mất 30 mili giây để đáp ứng phản hồi, thì sự khác biệt của micro giây ~ 14,5 không phải là không có gì cho trường hợp sử dụng của chúng tôi.

Cuối cùng tôi đã bắt đầu với giải pháp vì nó đáp ứng các yêu cầu kinh doanh của chúng tôi. Nó nhanh hơn chỉ là một phần thưởng thêm. Thêm vào đó, mọi thứ hiện được mã hóa theo cách mà việc triển khai chuyển đổi sẽ dễ dàng vì logic được bỏ đi trong một chức năng

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
7 dễ dàng để kiểm tra.

Mã và điểm chuẩn

Trong cả 3 trường hợp, chúng tôi sẽ sử dụng thư viện tiêu chuẩn Python, không cần sự phụ thuộc của bên thứ ba.

Tôi đã tách 3 giải pháp khác nhau thành 3 tệp khác nhau để dễ dàng thể hiện từng giải pháp trong một bài đăng và video trên blog. Tôi cũng đã loại bỏ ý tưởng chia danh sách IPS trên dấu phẩy để tập trung nhiều hơn vào chính mã danh sách cho phép.

Tất cả 3 ví dụ có cùng hàm

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
8. Đây là bản đọc danh sách được miễn trừ của IPS hoặc tìm kiếm cơ sở dữ liệu trên địa chỉ IP với một đoạn ngắn. Tất cả chức năng này là trả về
{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
9 hoặc
def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False
0 tùy thuộc vào việc địa chỉ IP có được phép không.

Chuỗi bắt đầu với

# startswith.py

exempt_ips = ["127.0.0.1", "10.0"]
fake_db_allowed_ips = ["42.42.42.42", "1.2.3.4"]


def allow_ip_address(ipaddress):
    if always_allow_ip_address(ipaddress) or ipaddress in fake_db_allowed_ips:
        return True

    return False


def always_allow_ip_address(ipaddress):
    if ipaddress.startswith(tuple(exempt_ips)):
        return True

    return False

Điểm lấy nét của mã trên là

def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False
1 trong hàm thứ hai. Trước cuộc phiêu lưu này, tôi đã không biết rằng bạn có thể chuyển một tuple vào chức năng Python từ ____32 và nó sẽ kiểm tra tất cả các mục. Điều này làm cho mã khá ngắn gọn và có thể đọc được theo ý kiến ​​của tôi.

Nó khá nhiều đọc to chính xác những gì nó làm. Nếu địa chỉ IP bắt đầu với bất kỳ một trong số

def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False
3 thì chúng tôi đã tìm thấy một trận đấu và chúng tôi có thể cho phép nó.

Không có hỗ trợ CIDR ở đây, đó là lý do tại sao

def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False
3 có
{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
5. Nó có nghĩa là
def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False
6 sẽ khớp nhưng
def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False
7 sẽ không. Điều đó làm việc cho trường hợp sử dụng của tôi!

Sử dụng thư viện tiêu chuẩn của Python với IP_ADDRESS và IP_NETWORK

# net.py

from ipaddress import ip_address
from ipaddress import ip_network


exempt_ips = ["127.0.0.1", "10.0.0.0/16"]
fake_db_allowed_ips = ["42.42.42.42", "1.2.3.4"]


def allow_ip_address(ipaddress):
    if always_allow_ip_address(ipaddress) or ipaddress in fake_db_allowed_ips:
        return True

    return False


def always_allow_ip_address(ipaddress):
    for ip in exempt_ips:
        if ip_address(ipaddress) in ip_network(ip):
            return True

    return False

Điều này hỗ trợ CIDR, đó là lý do tại sao chúng tôi có

{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
 "continent": "North America", "continent_code": "NA",
 "state": "California", "country": "United States", "latitude": 37.418,
 "iso_code": "US", "state_code": "CA", "aso": "PubNub",
 "asn": "11404", "zip_code": "94107"}
0 trong
def allow_ip_address(ipaddress):
    # allowed_ips is really a database query that returned the results.
    if ipaddress in allowed_ips.split(","):
        return True

    return False
3. Điều này có nghĩa là bất kỳ địa chỉ IP
    if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
        return True
0 nào cũng sẽ được cho phép nhưng
    if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
        return True
1 sẽ không.

Dưới đây, một biểu đồ nhanh về những gì IP bao gồm một CIDR cụ thể hỗ trợ:

  •     if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
            return True
    
    2 chỉ hỗ trợ
    {"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
     "continent": "North America", "continent_code": "NA",
     "state": "California", "country": "United States", "latitude": 37.418,
     "iso_code": "US", "state_code": "CA", "aso": "PubNub",
     "asn": "11404", "zip_code": "94107"}
    
    1 (1 máy chủ)
  •     if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
            return True
    
    4 hỗ trợ
        if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
            return True
    
    5 (256 máy chủ)
  • {"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
     "continent": "North America", "continent_code": "NA",
     "state": "California", "country": "United States", "latitude": 37.418,
     "iso_code": "US", "state_code": "CA", "aso": "PubNub",
     "asn": "11404", "zip_code": "94107"}
    
    0 Hỗ trợ
        if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
            return True
    
    0 (65,536 máy chủ)
  •     if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
            return True
    
    8 hỗ trợ
        if ipaddress.startswith("10.0") or ipaddress in allowed_ips.split(","):
            return True
    
    9 (16.777.216 máy chủ)

Hàm

# startswith.py

exempt_ips = ["127.0.0.1", "10.0"]
fake_db_allowed_ips = ["42.42.42.42", "1.2.3.4"]


def allow_ip_address(ipaddress):
    if always_allow_ip_address(ipaddress) or ipaddress in fake_db_allowed_ips:
        return True

    return False


def always_allow_ip_address(ipaddress):
    if ipaddress.startswith(tuple(exempt_ips)):
        return True

    return False
0 rất tiện dụng. Ở đây, một vài ví dụ về việc sử dụng nó:

>>> ipaddress.ip_address("10.0.8.42") in ipaddress.ip_network("10.0.0.0/16")
True

>>> ipaddress.ip_address("10.0.8.42") in ipaddress.ip_network("10.0.0.2")
False

>>> ipaddress.ip_address("10.0.8.42") in ipaddress.ip_network("10.0.8.42")
True

Nó hỗ trợ khớp trên khối CIDR hoặc địa chỉ IP chính xác làm cho nó khá linh hoạt.

Sử dụng thư viện tiêu chuẩn Python với IPv4Network

# netlist.py

from ipaddress import IPv4Network


exempt_ips = ["127.0.0.1", "10.0.0.0/16"]
fake_db_allowed_ips = ["42.42.42.42", "1.2.3.4"]


def allow_ip_address(ipaddress):
    if always_allow_ip_address(ipaddress) or ipaddress in fake_db_allowed_ips:
        return True

    return False


def always_allow_ip_address(ipaddress):
    for exempt_ip in exempt_ips:
        all_ips = [str(ip) for ip in IPv4Network(exempt_ip)]

        if ipaddress in all_ips:
            return True

    return False

Đây là loại giòn vì nó rõ ràng chỉ hỗ trợ IPv4 chứ không phải IPv6. Nó cũng thực sự chậm vì sự hiểu biết với

# startswith.py

exempt_ips = ["127.0.0.1", "10.0"]
fake_db_allowed_ips = ["42.42.42.42", "1.2.3.4"]


def allow_ip_address(ipaddress):
    if always_allow_ip_address(ipaddress) or ipaddress in fake_db_allowed_ips:
        return True

    return False


def always_allow_ip_address(ipaddress):
    if ipaddress.startswith(tuple(exempt_ips)):
        return True

    return False
1 sẽ tạo ra một danh sách các địa chỉ IP ~ 65K.

Tôi chỉ bao gồm cái này bởi vì nếu bạn google xung quanh để kiểm tra xem một địa chỉ IP có nằm trong CIDR với Python, bạn sẽ tìm thấy một vài kết quả của StackOverflow xếp hạng cao ở gần đầu đề xuất sử dụng giải pháp này.

# startswith.py

exempt_ips = ["127.0.0.1", "10.0"]
fake_db_allowed_ips = ["42.42.42.42", "1.2.3.4"]


def allow_ip_address(ipaddress):
    if always_allow_ip_address(ipaddress) or ipaddress in fake_db_allowed_ips:
        return True

    return False


def always_allow_ip_address(ipaddress):
    if ipaddress.startswith(tuple(exempt_ips)):
        return True

    return False
2 rất tốt khi có sẵn nhưng theo tôi, nó không phải là công cụ phù hợp để công việc chạy nó theo mọi yêu cầu để so sánh các địa chỉ IP.

Kết quả điểm chuẩn

Sự khác biệt tương đối là điều quan trọng nhất ở đây nhưng tôi đã chạy điều này trên một máy trạm hơn 7 tuổi có CPU I5-4460 3.2GHz với bộ nhớ 16GB và SSD chạy trong WSL 2 bằng Python 3.8.10.

[allow_ip_address_startswith]
Time per run in seconds: 0.00000028869998641312 (0.29 microseconds)
Executions per second:   3,463,803

[allow_ip_address_net]
Time per run in seconds: 0.00001484379998873919 (14.84 microseconds)
Executions per second:   67,368

[allow_ip_address_netlist]
Time per run in seconds: 0.10794336000108159523 (107943.36 microseconds)
Executions per second:   9

Nếu bạn theo dõi và muốn chạy mọi thứ cục bộ, thì đây là tệp gọi tất cả các giải pháp trên và điểm chuẩn chúng:

for i in $(seq 1 191); do \
    docker run -e IPRANGE="$i.0.0.0/8" geo-ip; \
    sleep 1; \ 
done
0

Giả sử bạn có tất cả 4 tệp (3 ví dụ mã + tệp này) trong cùng một thư mục bạn có thể chạy nó với

# startswith.py

exempt_ips = ["127.0.0.1", "10.0"]
fake_db_allowed_ips = ["42.42.42.42", "1.2.3.4"]


def allow_ip_address(ipaddress):
    if always_allow_ip_address(ipaddress) or ipaddress in fake_db_allowed_ips:
        return True

    return False


def always_allow_ip_address(ipaddress):
    if ipaddress.startswith(tuple(exempt_ips)):
        return True

    return False
3 và nó sẽ xuất nếu địa chỉ IP được phép và cũng chạy các điểm chuẩn.

Video hướng dẫn

Dấu thời gian

  • 0:48 - Hiểu vấn đề
  • 2:51 - Thời gian của Kubernetes và giữ nó nội bộ
  • 7:29 - Hack một bằng chứng về khái niệm
  • 10:16 - Yêu cầu một nhà phát triển cho ý kiến ​​của họ
  • 12:46 - Chúng ta nên đi với chuỗi bắt đầu bằng hoặc thêm vào hỗ trợ CIDR?
  • 15:14 - Bắt đầu xem mã và chạy các điểm chuẩn
  • 16:23 - Đi qua mã và mẫu phổ biến cho cả 3 giải pháp
  • 17:40 - Nhìn vào mã cho chuỗi bắt đầu bằng giải pháp
  • 19:50 - Chuẩn bị xem xét giải pháp thứ 2 với hỗ trợ khối CIDR
  • 22:03 - Nhận hỗ trợ khối CIDR thích hợp với giải pháp ròng
  • 24:45 - Nhìn vào giải pháp NetList thứ ba
  • 26:39 - Chủ đề phụ, hãy để quay lại bài đăng trên blog cho 2 giải pháp đầu tiên
  • 30:36 - Quay lại giải pháp NetList thứ ba
  • 32:02 - Đi qua kết quả điểm chuẩn và mã để sản xuất nó

Nếu bạn phải thực hiện tính năng này, bạn sẽ làm gì? Hãy cho tôi biết dưới đây!

Giống như bạn, tôi siêu bảo vệ hộp thư đến của mình, vì vậy đừng lo lắng về việc bị spam. Bạn có thể mong đợi một vài email mỗi tháng (nhiều nhất) và bạn có thể nhấp 1 lần hủy đăng ký bất cứ lúc nào. Xem những gì khác bạn cũng sẽ nhận được.

Làm thế nào để bạn tính toán CIDR từ phạm vi IP?

Công thức để tính toán số lượng địa chỉ IP có thể gán cho các mạng CIDR tương tự như mạng lưới lớp. Trừ số lượng bit mạng từ 32.RAISE 2 vào sức mạnh đó và trừ 2 cho mạng và địa chỉ phát sóng. Ví dụ: mạng A /24 có sẵn 232-24 - 2 địa chỉ để gán máy chủ.Subtract the number of network bits from 32. Raise 2 to that power and subtract 2 for the network and broadcast addresses. For example, a /24 network has 232-24 - 2 addresses available for host assignment.

Làm cách nào để gán một địa chỉ IP cho một phạm vi?

Nhấp vào Trình quản lý địa chỉ IP> Địa chỉ IP> Quản lý Subnets & Địa chỉ IP.Trong khung Tree Tree ở bên trái, nhấp vào mạng con mà bạn muốn thêm phạm vi địa chỉ IP mới của bạn.Nhấp vào Thêm phạm vi IP.Nhập địa chỉ IP bắt đầu và địa chỉ IP kết thúc của phạm vi địa chỉ IP của bạn.

IPaddr trong Python là gì?

iPaddr.py là một thư viện để làm việc với các địa chỉ IP, cả IPv4 và IPv6.a library for working with IP addresses, both IPv4 and IPv6.

Làm thế nào để bạn tăng một địa chỉ IP trong Python?

Làm thế nào để bạn tăng một địa chỉ IP trong Python ?..
# Nhập mô -đun ..
Nhập iPaddress ..
# Hoạt động số học trên địa chỉ IPv4 ..
In (iPaddress. IPv4Address (U'129.117.0.0 ')-6).
In (iPaddress. IPv4Address (U'175.199.42.211 ')+55).
In (iPaddress. IPv4Address (u'0.0.0.0 ')-1).
In (iPaddress. IPv4Address (U'255.255.255.255 ')+1).