Sử dụng IPtables hoặc null tuyến để đưa vào danh sách đen khoảng 1 triệu địa chỉ IP?


22

Tôi đã gặp một tình huống trong đó khách hàng cần đưa vào danh sách đen một bộ chỉ dưới 1 triệu địa chỉ IP riêng lẻ (không có mạng con) và hiệu suất mạng là một vấn đề đáng lo ngại. Mặc dù tôi sẽ phỏng đoán rằng các quy tắc IPTables sẽ có tác động hiệu suất ít hơn các tuyến đường, đó chỉ là phỏng đoán.

Có ai có bất kỳ bằng chứng chắc chắn hoặc biện minh nào khác cho việc ưu tiên IPTables hoặc định tuyến null làm giải pháp cho danh sách đen các danh sách dài các địa chỉ IP không? Trong trường hợp này, mọi thứ đều được tự động hóa, vì vậy việc sử dụng dễ dàng không thực sự là vấn đề đáng lo ngại.

EDIT 26-ngày 11 tháng 11

Sau một số thử nghiệm và phát triển, có vẻ như không có tùy chọn nào trong số này là khả thi. Dường như cả tra cứu tuyến đường và iptables đều thực hiện tìm kiếm tuyến tính thông qua bộ quy tắc và đơn giản là mất quá nhiều thời gian để xử lý nhiều quy tắc này. Trên phần cứng hiện đại, việc đưa các mục 1M vào danh sách đen iptables làm chậm máy chủ xuống còn khoảng 2 tá gói mỗi giây. Vì vậy, IPTables và các tuyến null được đưa ra.

ipset, như được đề xuất bởi Jimmy Hedman, sẽ rất tuyệt, ngoại trừ việc nó không cho phép bạn theo dõi hơn 65536 địa chỉ trong một bộ, vì vậy tôi thậm chí không thể thử sử dụng nó trừ khi có ai đó có ý tưởng.

Rõ ràng giải pháp duy nhất để chặn nhiều IP này là thực hiện tra cứu được lập chỉ mục trong lớp ứng dụng. Có phải vậy không?


Thêm thông tin:

Trường hợp sử dụng trong trường hợp này đang chặn danh sách "những kẻ phạm tội đã biết" các địa chỉ IP truy cập nội dung tĩnh trên máy chủ web. FWIW, thực hiện chặn thông qua Apache Deny fromcũng chậm không kém (nếu không phải như vậy) vì nó cũng thực hiện quét tuyến tính.


FYI: Giải pháp làm việc cuối cùng là sử dụng mod_rewrite của apache kết hợp với bản đồ DB ber để thực hiện tra cứu chống lại danh sách đen. Bản chất được lập chỉ mục của DB DB DB cho phép danh sách mở rộng theo hiệu suất O (log N).


5
Không phải ipset ( ipset.netfilter.org ) ít được thiết kế để xử lý loại vấn đề này sao?
Jimmy Hedman

@JimmyHedman: Bạn nên đưa ra câu trả lời. Và sau đó thêm một đề xuất để điểm chuẩn thực hiện theo cả 3 cách :)
MikeyB

Tôi tò mò liệu bạn có thể cung cấp thêm một chút thông tin về vấn đề bạn đang cố gắng giải quyết không? Có lẽ chặn địa chỉ IP 1M không phải là cách khắc phục sự cố?
SpacemanSpiff

Nó sẽ giúp rất nhiều để biết lý do tại sao bạn muốn chặn nhiều địa chỉ này và khi bạn muốn lọc lưu lượng INPUT hoặc FORWARD.
Juliano

Tại đây bạn có thể thấy cách ipset tạo quy tắc iptables nhanh hơn khoảng 11 lần so với quy tắc iptables thông thường. daemonkeeper.net/781/mass-blocking-ip-addresses-with-ipset Hy vọng sự giúp đỡ này.
Alien Torres

Câu trả lời:


15

hãy thử sử dụng iptables và xây dựng cây đa cấp để giảm số lần tra cứu.

iptables -N rules_0_0_0_0_2
iptables -N rules_64_0_0_0_2
iptables -N rules_128_0_0_0_2
iptables -N rules_192_0_0_0_2
iptables -N rules_0_0_0_0_4
iptables -N rules_16_0_0_0_4

iptables -A INPUT -p tcp --dport 80 -s 0.0.0.0/2 -j rules_0_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 64.0.0.0/2 -j rules_64_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 128.0.0.0/4 -j rules_128_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 192.0.0.0/4 -j rules_192_0_0_0_2

iptables -A rules_0_0_0_0_2 -s 0.0.0.0/4 -j rules_0_0_0_0_4
iptables -A rules_0_0_0_0_2 -s 16.0.0.0/4 -j rules_16_0_0_0_4

và như vậy - thêm các cấp độ lồng nhau; rõ ràng bạn sẽ cần một cách tự động để xây dựng các quy tắc và bạn nên có các chuỗi chỉ dành cho các mạng mà bạn có một hoặc nhiều người phạm tội - bằng cách này bạn có thể giảm số lần tra cứu phải được thực hiện khá đáng kể và tôi nghĩ nó có thể thực sự làm việc


Điều này nghe có vẻ như có thể hoạt động, giảm hiệu quả độ phức tạp thời gian của việc tìm kiếm quy tắc tường lửa từ O (n) đến O (log n), xây dựng cây tìm kiếm trong iptables một cách hiệu quả.
Per von Zweigbergk

Nếu bạn quyết định đi theo con đường này, có thể sẽ hữu ích khi sử dụng một số thuật toán để xây dựng cây tìm kiếm nhị phân cân bằng từ danh sách địa chỉ IP, sau đó chỉ cần bỏ cấu trúc của cây tìm kiếm đó thành một bộ quy tắc IPtables.
Per von Zweigbergk

@Per von Zweigbergk - thực sự ... hoặc chỉ cần tỉa cây sớm, nơi không cần phải tìm kiếm sâu hơn. mặc dù tải số lượng quy tắc vô duyên đó sẽ mất rất nhiều thời gian.
pQd

Đây là một cách tiếp cận rất tốt. Rõ ràng nó đòi hỏi một chút xử lý để duy trì, nhưng tôi nghĩ đó là ý tưởng đúng.
tylerl

3
@pQd sau những thất bại trước đó với iptables và cộng sự, tôi đã triển khai một giải pháp trong apache bằng cách sử dụng RewriteMap với cơ sở dữ liệu Berkeley. Nhưng cơ chế nhanh nhất của tôi bằng cách sử dụng iptables trong một vòng lặp đã tải khoảng 100 quy tắc mỗi giây, trong khi iptables-restore đã thực hiện toàn bộ trong khoảng 4 giây. Đây là trên một máy tính để bàn hàng đầu. Cơ chế RewriteMap có tác động thấp không thể phát hiện đến hiệu suất.
tylerl

11

Đây là chính xác những gì ipsetlà cho.

Từ trang web của mình http://ipset.netfilter.org/ :

Nếu bạn muốn

  • lưu trữ nhiều địa chỉ IP hoặc số cổng và khớp với bộ sưu tập bằng iptables tại một swoop;
  • tự động cập nhật các quy tắc iptables đối với các địa chỉ IP hoặc cổng mà không bị phạt hiệu năng;
  • thể hiện địa chỉ IP phức tạp và các quy tắc dựa trên cổng với một quy tắc iptables duy nhất và hưởng lợi từ tốc độ của các bộ IP

sau đó ipset có thể là công cụ thích hợp cho bạn.

Nó được viết bởi một thành viên nhóm nòng cốt mạng Jozsef Kadlecsik (người cũng đã viết mục tiêu DỰ ÁN) vì vậy đây là lựa chọn tốt nhất tôi có thể nghĩ đến.

Nó thậm chí được bao gồm trong các hạt nhân gần đây.


Theo như tôi thấy, ipset đứng đầu với 65k địa chỉ IP. Có loại thiết lập nào có thể xử lý các mục 1M không?
tylerl

7
Nếu bạn sử dụng kiểu băm: ip, bạn có thể có số lượng địa chỉ rất lớn. Tôi đã thử 1000000 và hiệu suất khá tốt. Nếu bạn thiết lập quy tắc -mate ESTABOUNDED trước khi kiểm tra bộ của mình, bạn có thể đảm bảo bạn chỉ kiểm tra bộ trên các kết nối mới sẽ tăng hiệu suất khi xử lý một số lượng lớn các gói.
Matthew Ife

Đáng nói là mặc dù việc sử dụng bộ nhớ của một ipset có địa chỉ 1M bắt đầu lớn. Theo bài đăng này trên danh sách gửi thư của bộ lọc mạng, công thức 2015 hiện tại cho kích thước băm ipset là H * 40byte + (N/4 + N%4) * 4 * element sizekhoảng 64 MB cho các địa chỉ 1M trong hàm băm 1,5m. Sử dụng giải pháp apache / berkdb lưu trữ dữ liệu trên đĩa và chỉ tải các trang của các địa chỉ hoạt động.
M Conrad

5

Tôi chưa tự mình kiểm tra điều này, nhưng khi nghe mô tả vấn đề của bạn, tôi nghĩ ngay đến " pf" (như từ OpenBSD).

pfcó khái niệm về bảng địa chỉ có thể là thứ bạn đang tìm kiếm.

Theo một số nghiên cứu rất khó hiểu mà tôi đã làm, có vẻ như điều này có khả năng mở rộng tốt hơn ipset. Theo chương Câu hỏi thường gặp của PF về Tùy chọn thời gian chạy , ngoài hộp mà không điều chỉnh, pf hỗ trợ tổng cộng 1.000 bảng, với tổng số 200.000 mục trên tất cả các bảng theo mặc định. (100.000 nếu hệ thống có <100 MB bộ nhớ vật lý). Điều này khiến tôi tin rằng ít nhất là đáng để xem xét thử kiểm tra điều này để xem liệu nó có hoạt động ở bất kỳ mức độ hữu ích nào không.

Tất nhiên, tôi giả sử bạn đang chạy các máy chủ của mình trên Linux, vì vậy bạn phải có một hộp tường lửa riêng biệt chạy một số HĐH với pf (như OpenBSD hoặc FreeBSD). Bạn cũng có thể cải thiện thông lượng bằng cách loại bỏ bất kỳ loại lọc gói trạng thái nào.


Chuyển đổi kiến ​​trúc máy chủ của khách hàng sang BSD không thực sự là một lựa chọn. Dù vậy, suy nghĩ ra khỏi hộp ít nhất.
tylerl

2
Bạn sẽ không phải chuyển đổi toàn bộ kiến ​​trúc máy chủ sang BSD, việc xây dựng một tường lửa để đặt trước máy chủ thực sự là đủ. (Đủ dễ để thực hiện trong VM.)
Per von Zweigbergk

2

Bạn đã điều tra bằng cách sử dụng FIB_TRIE thay vì FIB_HASH.

FIB_TRIE sẽ mở rộng quy mô tốt hơn nhiều cho số lượng tiền tố của bạn. (Các tuyến null / 32 giây vẫn là tiền tố, rất cụ thể)

Bạn có thể cần phải biên dịch kernel của riêng mình để sử dụng nó, nhưng nó giúp.

Ghi chú FIB_TRIE


2

Đối với hậu thế: theo ipsettài liệu kích thước mặc định của một bộ là 65536, điều này có thể được thay đổi bởi các tùy chọn.

maxelem Tham số này hợp lệ cho lệnh tạo của tất cả các bộ kiểu băm. Nó xác định số lượng phần tử tối đa có thể được lưu trữ trong tập hợp, mặc định 65536. Ví dụ:ipset create test hash:ip maxelem 2048.

Tôi đặt cái này ở đây vì tôi chưa thể bình luận.


1

Một số lưu ý hữu ích cho bất kỳ ai tình cờ gặp phải vấn đề này trong tương lai:

Trước hết, đừng phân tích bất kỳ lưu lượng truy cập nào mà bạn không cần. Ví dụ: nếu bạn đang chặn lưu lượng TCP, chỉ lọc các gói SYN, theo cách đó bạn chỉ nhấn bộ lọc một lần cho mỗi kết nối. Bạn có thể sử dụng -m statenếu bạn muốn, nhưng theo dõi kết nối có chi phí riêng mà bạn có thể muốn tránh nếu hiệu suất là một vấn đề.

Thứ hai, việc đưa một triệu quy tắc vào iptables mất nhiều thời gian: vài phút. Nếu bạn cần theo dõi nhiều thực thể đó, tốt nhất bạn có thể tránh xa netfliter. Kích thước tuyệt đối của bộ quy tắc sẽ tạo ra sự khác biệt.

Thứ ba, mục tiêu là tránh quét tuyến tính; nhưng thật không may, cả iptables và iproute2 đều là tuyến tính. Bạn có thể chia quy tắc của mình ra theo kiểu cây nhị phân thành một số lượng lớn các chuỗi giới hạn số lượng quy tắc bạn phải tham khảo, nhưng ngay cả, iptables vẫn không phù hợp với quy mô của vấn đề này. Nó sẽ hoạt động , nhưng nó lãng phí tài nguyên quý giá.

Thứ tư, và quan trọng nhất, đẩy khối lượng công việc của bạn lên không gian người dùng là một ý tưởng không tồi. Điều này cho phép bạn viết mã chặt chẽ của riêng bạn hoặc sử dụng giải pháp sẵn có được điều chỉnh theo bộ vấn đề của bạn. Giải pháp của riêng tôi cho vấn đề này, như đã đề cập, là sử dụng tra cứu BDB được kích hoạt thông qua hệ thống mod_rewrite của apache. Điều này có thêm lợi ích là chỉ kích hoạt một lần tra cứu mỗi phiên và chỉ sau khi yêu cầu hợp lệ được gửi. Trong trường hợp này, hiệu suất cực kỳ nhanh và chi phí của danh sách chặn gần như không đáng kể.

Bạn có thể thực hiện thao tác không gian người dùng tương tự với iptables bằng cách sử dụng -j QUEUEmục tiêu kết hợp với libnetfilter_queue. Công cụ này là mạnh mẽ, đơn giản và tài liệu kém. Tôi khuyên bạn nên đọc càng nhiều càng tốt từ nhiều nguồn bạn có thể tìm thấy, vì có rất nhiều tài liệu thú vị nằm rải rác trên web không phải là một phần của bất kỳ tài liệu chính thức nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.