Điểm:0

chặn kết nối nginx sau nhiều lỗi 404 trên cùng một kết nối tcp

lá cờ de

Tôi muốn bảo vệ hai máy chủ khỏi những kẻ tấn công thăm dò các url một cách mù quáng.

ý tưởng của tôi là chặn các yêu cầu sau một lượng mã trạng thái 404 nhất định.

Tôi có thể làm điều này với fail2ban.

Tuy nhiên, một trong các máy chủ nằm sau proxy ngược mà tôi không kiểm soát và đó không giao tiếp địa chỉ IP ban đầu (và sẽ cần một thời gian rất dài trước khi yêu cầu chuyển tiếp địa chỉ IP ban đầu được xử lý), nghĩa là từ quan điểm của nginx, tất cả các yêu cầu đều bắt nguồn từ IP của proxy đáng kính và rõ ràng là tôi không muốn chặn tất cả lưu lượng truy cập đến nếu ai đó kích động quá nhiều lỗi 404.

Có cách nào không (không fail2ban, fail2ban hay tool nào khác) để phát hiện ít nhất 404 lỗi từ cùng một kết nối https và để chấm dứt kết nối này hoặc để nó 404 vô điều kiện cho bất kỳ yêu cầu tiếp theo nào?

Vui lòng cho tôi biết nếu câu hỏi của tôi không rõ ràng và tôi sẽ cố gắng viết lại câu hỏi đó để cung cấp thêm thông tin.

Điểm:1
lá cờ cn

Bạn có thể thiết lập Nginx để lưu các phản hồi vào bộ đệm, bao gồm các phản hồi có lỗi như 404. Tuy nhiên, theo như tôi biết, bạn không thể đếm số lượng lỗi (nhưng điều đó không quan trọng).

Vấn đề duy nhất ở đây là nếu bạn tạo một trang mới và trước đó nó đã được lưu trong bộ nhớ cache dưới dạng 404, thì nó sẽ không hoạt động. Ít nhất, không phải ngay lập tức (tùy thuộc vào thời gian chờ của bộ đệm của bạn).

Điều đó chắc chắn sẽ giúp rất nhiều, mặc dù. Nếu không, tất cả các lần truy cập sẽ chuyển đến chương trình phụ trợ của bạn và tạo lỗi 404 sẽ bị dừng ở phiên bản Nginx và lặp đi lặp lại chính xác lỗi 404 giống hệt nhau.

Một cách khác là xác định một vị trí và chạy một lệnh (sau đó có thể chạy ipset để thêm địa chỉ IP). Vì vậy, một cái gì đó như:

vị trí /phpmyadmin.php {
  content_by_lua_block {
    os.execute("/usr/bin/block-ip.sh")
  } 
}

Tuy nhiên, tôi không chắc làm thế nào bạn có thể xử lý nhiều đường dẫn.


kinh nghiệm của riêng tôi với fail2ban là nó khá chậm và "lạc hậu" (không chủ động). Tuy nhiên, nếu bạn thực sự muốn chặn hoàn toàn một địa chỉ IP, cách dễ nhất là có ứng dụng của bạn. gửi tin nhắn đến giao diện người dùng nơi bạn có thể chạy iptables để chặn IP. Để làm được điều đó, bạn cần chuyển tiếp IP gốc mà Nginx không làm theo mặc định, nhưng thật dễ dàng để thêm một X-Forwarded-For tiêu đề mà ứng dụng của bạn. sau đó có thể gửi lại cho công cụ nhỏ mà bạn đang sử dụng để thêm IP vào iptables. Cũng lưu ý rằng bạn không nên thêm nó trực tiếp vào iptables. Thay vào đó, bạn nên sử dụng một danh sách. Đối với cái nhìn đó ipset.

Nếu bạn không thể thay đổi ứng dụng của mình như vậy và muốn sử dụng fail2ban, bạn sẽ phải kiểm tra nhật ký Nginx và phát hiện những đường dẫn mà bạn không thích.

gelonida avatar
lá cờ de
Cảm ơn câu trả lời của bạn. vâng, bộ nhớ đệm 404 s có thể làm giảm các cuộc tấn công DOS nếu nhiều kẻ tấn công đang quét một máy chủ trong thời đại bộ đệm; Tuy nhiên, điều tôi thực sự muốn là ngăn ai đó đang cố đoán các url. Và trên các máy chủ mà tôi không thể làm điều đó do không có địa chỉ IP gốc mà ít nhất tôi muốn tránh, một kết nối SSL đó có thể thăm dò quá nhiều url Thoát khỏi sự tò mò: Điều gì sẽ là thiết lập để cache lỗi 404? Bộ nhớ đệm phải là phía máy chủ vì tôi muốn giảm thiểu các cuộc tấn công của bot chứ không phải các cuộc tấn công từ trình duyệt.
lá cờ cn
@gelonida Nghĩ về điều đó, bạn có thể chạy lệnh shell từ Nginx, vì vậy có thể sử dụng lệnh đó để chặn IP ngay lập tức (bạn vẫn có thể nhận được 2 hoặc 3 lần truy cập nữa, nhưng điều đó sẽ rất nhanh). Để thực hiện nhanh, hãy đảm bảo sử dụng quy tắc trỏ đến danh sách các IP do `ipset` quản lý.
gelonida avatar
lá cờ de
cảm ơn câu trả lời cập nhật của bạn. Tôi vẫn không chắc nó giúp ích như thế nào trong trường hợp hiện tại của tôi. Có lẽ tôi phải đợi cho đến khi proxy ngược có tiêu đề X-Forwarded-For được thêm vào, nhưng sau đó tôi vẫn phải xem cách chặn yêu cầu (Vui lòng xem câu hỏi liên quan: https://serverfault.com/questions/1094926/ can-fail2ban-add-deny-rules-to-nginx-instead-of-using-iptables )
Điểm:0
lá cờ il

Nginx có một giới hạn_req mô-đun, vì vậy bạn có thể sử dụng nó làm bộ lọc trước.

Nhìn thấy https://stackoverflow.com/questions/37877242/nginx-limit-req-based-on-http-header cho câu hỏi tương tự.

Ví dụ: bằng cách đếm và giới hạn các lần thử 404 (ví dụ: ở vị trí lỗi liên quan) và/hoặc lọc chúng bằng fail2ban sau đây nếu bạn chỉ đăng nhập các yêu cầu hạn chế. Bằng cách này bạn có thể giảm thử nghiệm tối đathời gian tìm kiếm để vào tù trong fail2ban và có thể tránh tải quá cao do nhiều thông báo trong nhật ký (xem fail2ban :: wiki / Phương pháp hay nhất).

Đối với ví dụ về bộ lọc (về cơ bản, bạn không cần bộ lọc mà bạn chỉ cần đặt thất bại vv trực tiếp trong tù), xem filter.d/nginx-limit-req.conf. Bạn cũng có thể định cấu hình nginx để đăng nhập X-Forwarded-For tiêu đề thay thế hoặc bổ sung cho IP thực. Và thậm chí cấm cả hai sử dụng khác nhau thử nghiệm tối đa/thời gian tìm kiếm kết hợp với các giới hạn và bùng nổ khác nhau trong giới hạn_req mô-đun.

gelonida avatar
lá cờ de
Tôi đã thay đổi tiêu đề và đánh dấu một số phần trong tin nhắn của mình. Trên thực tế, vấn đề chính là tôi muốn phát hiện lỗi 404 trên cùng một kết nối http. Tôi e rằng sẽ cần nhiều thời gian trước khi proxy ngược được thay đổi và cung cấp thông tin cho tôi. mà tôi thực sự cần.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.