Score:1

nftables - พฤติกรรมอัตราจำกัด (ข้อผิดพลาดหรือการใช้งานผิด?)

ธง nl

ฉันกำลังพยายามตั้งค่าไฟร์วอลล์ด้วย nftables แต่ฉันไม่เข้าใจและใช้การจำกัดอัตราอย่างง่ายตามเอกสารที่ฉันพบ

  • ระบบปฏิบัติการ : Ubuntu 20.04 LTS
  • เวอร์ชัน nftables : 0.9.3 (Topsy)
  • เคอร์เนลรีลีส: 5.8.0-53-generic

ฉันได้สร้างไฟร์วอลล์ทดสอบด้วยคำสั่งด้านล่าง:

nft 'เพิ่มตาราง inet testnetwork'
nft 'เพิ่ม chain inet testnetwork INPUT { ลำดับความสำคัญของอินพุต hook ตัวกรอง 0; นโยบายลดลง; }'
nft 'เพิ่ม set inet testnetwork SSH { พิมพ์ ipv4_addr; แฟล็กไดนามิก หมดเวลา; ขนาด 65536; }'
nft 'เพิ่มกฎ inet testnetwork INPUT ct สถานะที่เกี่ยวข้อง สร้างเคาน์เตอร์ยอมรับ'
nft 'เพิ่มกฎ inet testnetwork INPUT ip saddr @SSH ct state ใหม่ tcp dport 22 counter drop'
nft 'เพิ่มกฎ inet testnetwork INPUT ct สถานะใหม่ tcp dport 22 อัตราขีดจำกัดมากกว่า 10/นาที เพิ่มตัวนับ @SSH {ip saddr timeout 60s}
nft 'เพิ่มกฎ inet ทดสอบเครือข่าย INPUT ct สถานะใหม่ tcp dport 22 tcp sport 1024-65535 ตัวนับการยอมรับ'

เมื่อฉันแสดงชุดกฎเริ่มต้น ฉันจะได้รับ:

เครือข่ายการทดสอบตาราง inet {
    ตั้งค่า SSH {
        พิมพ์ ipv4_addr
        ขนาด 65536
        แฟล็กไดนามิกหมดเวลา
    }

    ห่วงโซ่อินพุต {
        ประเภท ตัวกรอง เบ็ด ตัวกรองลำดับความสำคัญอินพุต; นโยบายลดลง;
        สถานะ ct ที่จัดตั้งขึ้น แพ็กเก็ตตัวนับที่เกี่ยวข้อง 0 ไบต์ 0 ยอมรับ
        ip saddr @SSH ct สถานะใหม่ tcp dport 22 ตัวนับแพ็กเก็ต 0 ไบต์ 0 ดรอป
        ct สถานะใหม่ tcp dport 22 อัตราขีด จำกัด มากกว่า 10 / นาที เพิ่ม @SSH { ip saddr timeout 1m } ตัวนับแพ็กเก็ต 0 ไบต์ 0
        ct state ใหม่ tcp dport 22 tcp sport 1024-65535 ตัวนับแพ็กเก็ต 0 ไบต์ 0 ยอมรับ
    }
}

ด้วยการกำหนดค่าดังกล่าว ฉันคาดว่า IP จะถูกเพิ่มไปยังชุด SSH ในการทดลองเชื่อมต่อครั้งที่ 11 (ใหม่) ภายใน 1 นาที และจะถูกบล็อก (เป็นเวลา 1 นาที) เริ่มตั้งแต่ความพยายามครั้งที่ 12

อย่างไรก็ตาม เมื่อฉันเปิดหน้าต่างเทอร์มินัลที่สองและเริ่มต้นตามลำดับ จากนั้นปิดการเชื่อมต่อ ssh น้อยกว่า 10 รายการเป็น 127.0.0.1 ฉันได้รับ IP เพิ่มในชุด SSH แล้วบล็อก

ด้านล่างสถานะชุดกฎในการพยายามครั้งที่ 7:

เครือข่ายการทดสอบตาราง inet {
    ตั้งค่า SSH {
        พิมพ์ ipv4_addr
        ขนาด 65536
        แฟล็กไดนามิกหมดเวลา
        องค์ประกอบ = { 127.0.0.1 หมดเวลา 1m หมดอายุ 54s564ms }
    }

    ห่วงโซ่อินพุต {
        ประเภท ตัวกรอง เบ็ด ตัวกรองลำดับความสำคัญอินพุต; นโยบายลดลง;
        สถานะ ct ที่จัดตั้งขึ้น แพ็กเก็ตตัวนับที่เกี่ยวข้อง 156 ไบต์ 28692 ยอมรับ
        ip saddr @SSH ct สถานะใหม่ tcp dport 22 ตัวนับแพ็กเก็ต 3 ไบต์ 180 ดรอป
        ct สถานะใหม่ tcp dport 22 อัตราขีด จำกัด มากกว่า 10 / นาที เพิ่ม @SSH { ip saddr timeout 1m } ตัวนับแพ็กเก็ต 1 ไบต์ 60
        ct state ใหม่ tcp dport 22 tcp sport 1024-65535 ตัวนับแพ็กเก็ต 6 ไบต์ 360 ยอมรับ
    }
}

ณ จุดนี้ ฉันไม่เข้าใจกลไกอัตราจำกัดอย่างถูกต้อง หรือฉันทำผิดพลาดที่อื่น

ใครช่วยกรุณาช่วยฉันโดยชี้ให้เห็นว่าความคาดหวังของฉันผิดหรือความผิดพลาดนั้นมาจากไหน

ขอแสดงความนับถือและขอบคุณสำหรับเวลาของคุณ

A.B avatar
cl flag
A.B
เคอร์เนลอาจไม่เลือกที่จะรอ 1 ล้านเพื่อทำบางสิ่ง มันเป็นอัตรา ฉันจะพิจารณา 10/นาที 1/6 วินาที ดังนั้นเพื่อไม่ทริกเกอร์ คุณควรเว้นระยะความพยายาม 10 วินาที ซึ่งควรห่างจาก 6 วินาทีต่อครั้งเพียงพอ ไม่สามารถเข้าใจได้แน่ชัดว่าทำงานอย่างไร: https://elixir.bootlin.com/linux/v5.12.13/source/net/netfilter/nft_limit.c
A.B avatar
cl flag
A.B
ฉันเดาว่ามันสามารถช่วยได้เช่นกัน: https://en.wikipedia.org/wiki/Token_bucket
keeplearningtogether avatar
nl flag
สวัสดี @A.B ขอบคุณมากสำหรับคำตอบและเวลาของคุณ นี่เป็นคำชื่นชมอย่างมาก วิธีการฝากข้อมูลโทเค็นนี้อธิบายได้ค่อนข้างน้อย ฉันจะทำการทดสอบบางอย่างเพื่อพยายามรับพฤติกรรมที่แน่นอนเนื่องจากฉันไม่ใช่กูรูด้าน C แต่อย่างน้อยฉันก็รู้ว่าจะเริ่มต้นจากตรงไหนและนี่เป็นความช่วยเหลือที่สำคัญ
A.B avatar
cl flag
A.B
ฉันรู้ว่าฉันแสดงความคิดเห็นไว้เท่านั้น แต่ถ้าคุณได้ผลลัพธ์ที่สรุปได้ คุณอาจลองพิจารณาคำตอบของคุณเองเกี่ยวกับเรื่องนี้ในภายหลัง
keeplearningtogether avatar
nl flag
ฉันยังใหม่กับแพลตฟอร์มนี้ ฉันควรคลิกที่ "ตอบคำถามของคุณ" และทำการสรุปหรือไม่ หรือว่ามันทำงานอย่างไรกันแน่ ? ขออภัย ฉันยังไม่ได้อ่านเพื่อดูว่าแนวทางใดเป็นแนวทางปฏิบัติที่ดีที่สุดและอื่นๆ
Score:0
ธง nl

ฉันต้องการขอโทษสำหรับข้อเสนอแนะที่ล่าช้า ฉันมีเรื่องเร่งด่วนอื่น ๆ อยู่ในสแต็ก และสุดท้ายก็ลงเอยด้วยงานที่ต้องใช้คำถามนี้

ก่อนอื่น ขอบคุณมาก @A.B สำหรับคำตอบและความช่วยเหลือของคุณฉันไม่รู้จัก "อัลกอริทึมถังโทเค็น" และช่วยให้เข้าใจกระบวนการโดยรวม โดยเฉพาะ "อัตรา" ในแง่ที่ว่าเคอร์เนลตามที่คุณกล่าวถึงไม่รอ 1 นาทีเพื่อทำบางสิ่ง

ขอบคุณ @Chen Deng-Ta สำหรับการทดสอบของคุณ

Score:0
ธง us

บน VPS ของฉัน

sshPort=2222
nft เพิ่มตาราง ip sshGuard
nft เพิ่มเชน ip sshGuard อินพุต { ประเภทตัวกรอง hook อินพุตลำดับความสำคัญ 0 \; }
nft เพิ่มชุด ip sshGuard รายการปฏิเสธ { ประเภท ipv4_addr \; แฟล็กไดนามิก หมดเวลา \; หมดเวลา 5m \; }
nft เพิ่มกฎ ip อินพุต sshGuard tcp dport $sshPort ct สถานะใหม่ ip saddr @denylist ปฏิเสธ
nft เพิ่มกฎ ip อินพุต sshGuard tcp dport $sshPort ct สถานะอัตราขีดจำกัดใหม่เกิน 2/นาที ระเบิด 3 แพ็กเก็ต เพิ่ม @denylist { ip saddr } ปฏิเสธ
ตารางรายการ nft ip sshGuard

ฉันทดสอบสองสามครั้ง (แต่ละครั้งโดย nft flush set ip sshGuard รายการปฏิเสธ) การเชื่อมต่อครั้งที่ 4 จะถูกปฏิเสธ ถ้าฉันเปลี่ยน อัตราจำกัดมากกว่า 2/นาที ระเบิด 3 แพ็กเก็ต ถึง อัตราจำกัดมากกว่า 2/นาทีการปฏิเสธจะเกิดขึ้นหลังจากการเชื่อมต่อ 7-9 ครั้ง ดังนั้นฉันไม่ทราบกลไกที่แน่นอนของ อัตราจำกัดมากกว่า 2/นาทีแต่ ก แตกไป 3 ซอง ดูเหมือนจะทำให้อะไรๆ แน่นอนขึ้น

ค่าเริ่มต้น ระเบิด ถูกกำหนดโดย #กำหนด NFT_LIMIT_PKT_BURST_DEFAULT 5

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา