Điểm:1

nftables - hành vi tỷ lệ giới hạn (lỗi hoặc sử dụng sai?)

lá cờ nl

Tôi đang cố gắng thiết lập tường lửa bằng nftables nhưng tôi không hiểu và không triển khai giới hạn tốc độ đơn giản dựa trên tài liệu mà tôi đã tìm thấy.

  • Hệ điều hành: Ubuntu 20.04 LTS
  • phiên bản nftables: 0.9.3 (Topsy)
  • phát hành kernel: 5.8.0-53-generic

Tôi đã xây dựng tường lửa thử nghiệm với chuỗi lệnh bên dưới:

nft 'thêm bảng inet testnetwork'
nft 'thêm chuỗi inet testnetwork INPUT { loại bộ lọc hook ưu tiên đầu vào 0; giảm chính sách; }'
nft 'thêm bộ inet testnetwork SSH { gõ ipv4_addr; cờ động, thời gian chờ; kích thước 65536; }'
nft 'thêm quy tắc inet testnetwork Trạng thái INPUT ct liên quan,chấp nhận bộ đếm đã thiết lập'
nft 'thêm quy tắc inet testnetwork INPUT ip saddr @SSH ct state new tcp dport 22 counter drop'
nft 'thêm quy tắc inet testnetwork INPUT trạng thái ct mới tốc độ giới hạn tcp dport 22 trên 10/phút thêm bộ đếm @SSH {ip saddr timeout 60s}'
nft 'thêm quy tắc kiểm tra mạng inet ĐẦU VÀO ct trạng thái tcp mới dport 22 tcp sport 1024-65535 bộ đếm chấp nhận'

Khi tôi liệt kê bộ quy tắc ban đầu, tôi nhận được:

bảng inet testnetwork {
    đặt SSH {
        gõ ipv4_addr
        kích thước 65536
        cờ động, thời gian chờ
    }

    chuỗi INPUT {
        loại bộ lọc hook bộ lọc ưu tiên đầu vào; giảm chính sách;
        Trạng thái ct được thiết lập, gói truy cập liên quan 0 byte 0 chấp nhận
        ip saddr @SSH ct trạng thái mới tcp dport 22 gói truy cập 0 byte 0 drop
        trạng thái ct mới tốc độ giới hạn tcp dport 22 trên 10/phút thêm @SSH { ip saddr hết thời gian 1 phút } truy cập gói 0 byte 0
        trạng thái ct mới tcp dport 22 tcp sport 1024-65535 gói truy cập 0 byte 0 chấp nhận
    }
}

Với cấu hình như vậy, tôi cho rằng một IP sẽ được thêm vào bộ SSH trong lần thử kết nối (mới) thứ 11 trong vòng 1 phút và bị chặn (trong 1 phút) bắt đầu từ lần thử thứ 12.

Tuy nhiên, khi tôi mở cửa sổ đầu cuối thứ hai và bắt đầu tuần tự rồi đóng ít hơn 10 kết nối ssh đến 127.0.0.1, tôi nhận được IP được thêm vào bộ SSH và sau đó bị chặn.

Trạng thái bộ quy tắc bên dưới ở lần thử thứ 7:

bảng inet testnetwork {
    đặt SSH {
        gõ ipv4_addr
        kích thước 65536
        cờ động, thời gian chờ
        phần tử = { 127.0.0.1 timeout 1m hết hạn 54s564ms }
    }

    chuỗi INPUT {
        loại bộ lọc hook bộ lọc ưu tiên đầu vào; giảm chính sách;
        Trạng thái ct được thiết lập, gói truy cập liên quan 156 byte 28692 chấp nhận
        ip saddr @SSH ct state new tcp dport 22 gói truy cập 3 byte 180 drop
        trạng thái ct mới tốc độ giới hạn tcp dport 22 trên 10/phút thêm @SSH { ip saddr hết thời gian 1 phút } bộ đếm gói 1 byte 60
        ct state new tcp dport 22 tcp sport 1024-65535 gói truy cập 6 byte 360 ​​chấp nhận
    }
}

Tại thời điểm này, hoặc tôi không hiểu chính xác cơ chế tỷ lệ giới hạn hoặc tôi đã mắc lỗi ở chỗ khác.

Ai đó có thể vui lòng giúp tôi bằng cách chỉ ra liệu kỳ vọng của tôi có sai hay lỗi có thể đến từ đâu không?

Trân trọng và cảm ơn vì thời gian của bạn

A.B avatar
lá cờ cl
A.B
Nhân có lẽ không chọn đợi 1 phút để làm gì đó. Đó là một tỷ lệ. Tôi sẽ xem xét 10/mn 1/6 giây. Vì vậy, để không kích hoạt nó, bạn nên thử khoảng cách trong 10 giây, đủ xa so với 6 giây cho mỗi lần thử. Không thể nắm bắt chính xác cách thực hiện: https://elixir.bootlin.com/linux/v5.12.13/source/net/netfilter/nft_limit.c
A.B avatar
lá cờ cl
A.B
Tôi đoán điều này cũng có thể hữu ích: https://en.wikipedia.org/wiki/Token_bucket
keeplearningtogether avatar
lá cờ nl
Xin chào @A.B, Rất cám ơn vì câu trả lời và thời gian của bạn, điều này được đánh giá rất cao. Cách tiếp cận nhóm mã thông báo này giải thích khá nhiều điều. Tôi sẽ thực hiện một số thử nghiệm để cố gắng có được hành vi chính xác vì tôi không phải là chuyên gia về C nhưng ít nhất tôi biết bắt đầu từ đâu ngay bây giờ và đây là một trợ giúp lớn.
A.B avatar
lá cờ cl
A.B
Tôi biết tôi chỉ để lại nhận xét, nhưng nếu bạn nhận được kết quả chắc chắn, bạn có thể cân nhắc đưa ra câu trả lời của riêng mình về điều này sau.
keeplearningtogether avatar
lá cờ nl
Tôi là người mới trên nền tảng này, tôi có nên nhấp vào "Trả lời câu hỏi của bạn" và tạo một bản tóm tắt hoặc cách hoạt động chính xác của nó không? Xin lỗi, tôi chưa đọc qua để xem đâu là phương pháp hay nhất và vì vậy
Điểm:0
lá cờ us

Trên VPS của tôi

sshPort=2222
nft thêm bảng ip sshGuard
nft thêm chuỗi ip đầu vào sshGuard { loại ưu tiên đầu vào móc bộ lọc 0 \; }
nft add set ip sshGuard danh sách từ chối { type ipv4_addr \; cờ động, thời gian chờ \; thời gian chờ 5 phút \; }
nft thêm quy tắc ip sshGuard đầu vào tcp dport $sshPort ct trạng thái ip mới saddr @denylist từ chối
nft thêm quy tắc ip sshGuard đầu vào tcp dport $sshPort ct trạng thái giới hạn mới tốc độ trên 2/phút bùng nổ 3 gói thêm @denylist { ip saddr } từ chối
bảng danh sách nft ip sshGuard

Tôi kiểm tra một vài lần (mỗi lần bởi nft flush đặt danh sách từ chối ip sshGuard), kết nối thứ 4 sẽ bị từ chối. Nếu tôi thay đổi tốc độ giới hạn trên 2/phút bùng nổ 3 gói đến tốc độ giới hạn trên 2/phút, từ chối xảy ra sau 7-9 kết nối. Do đó, tôi không biết cơ chế chính xác của tốc độ giới hạn trên 2/phút, nhưng một nổ 3 gói dường như làm cho mọi thứ chắc chắn hơn.

mặc định nổ được thiết lập bởi #define NFT_LIMIT_PKT_BURST_DEFAULT 5

Điểm:0
lá cờ nl

Tôi muốn xin lỗi vì phản hồi muộn của mình, tôi có một số công việc khẩn cấp khác và cuối cùng đã hoàn thành nhiệm vụ yêu cầu câu hỏi này.

Trước hết, cảm ơn bạn rất nhiều @A.B vì câu trả lời và sự giúp đỡ của bạn.Tôi không biết "thuật toán xô mã thông báo" và đã giúp hiểu toàn bộ quá trình, đặc biệt là "tỷ lệ" theo nghĩa là hạt nhân như bạn đã đề cập không đợi 1 phút để tạo ra thứ gì đó.

Cũng cảm ơn @Chen Deng-Ta cho các bài kiểm tra của bạ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.