ระดับเคอร์เนลให้เฉพาะอินเทอร์เฟซที่ไม่ขึ้นอยู่กับโปรโตคอลทั่วไปซึ่งมีฟังก์ชันพื้นฐานสำหรับการแยกข้อมูลจากแพ็กเก็ต การดำเนินการข้อมูล และการควบคุมโฟลว์ กฎการกรองและตัวจัดการเฉพาะโปรโตคอลจะถูกคอมไพล์เป็นไบต์โค้ดในพื้นที่ผู้ใช้ หลังจากนั้นไบต์โค้ดนี้จะถูกโหลดลงในเคอร์เนลโดยใช้อินเทอร์เฟซ Netlink และดำเนินการในเคอร์เนลในเครื่องเสมือนพิเศษที่ชวนให้นึกถึง BPF (ตัวกรองแพ็คเก็ตเบิร์กลีย์) วิธีนี้ช่วยให้คุณลดขนาดของโค้ดการกรองที่ทำงานในระดับเคอร์เนลได้อย่างมาก และย้ายฟังก์ชันทั้งหมดของกฎการแยกวิเคราะห์และตรรกะสำหรับการทำงานกับโปรโตคอลไปยังพื้นที่ผู้ใช้
นวัตกรรมหลัก:
- เพิ่มการรองรับแพ็กเก็ตและตัวนับการรับส่งข้อมูลที่เกี่ยวข้องกับองค์ประกอบชุดในชุดแล้ว ตัวนับเปิดใช้งานโดยใช้คำสำคัญ "ตัวนับ":
ตารางไอพี x {
ตั้งค่า y {
ประเภทของ ip saddr
ตอบโต้
องค์ประกอบ = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}โซ่ z {
ประเภทตัวกรองเบ็ดกรองลำดับความสำคัญเอาท์พุท; ยอมรับนโยบาย
ไอพี พ่อดร @y
}
} - หากต้องการตั้งค่าเริ่มต้นของตัวนับ เช่น เพื่อคืนค่าตัวนับก่อนหน้าหลังจากรีสตาร์ท คุณสามารถใช้คำสั่ง "nft -f":
#กฎแมว.nft
ตารางไอพี x {
ตั้งค่า y {
ประเภทของ ip saddr
ตอบโต้
องค์ประกอบ = { 192.168.10.35 ตัวนับแพ็กเก็ต 1 ไบต์ 84, 192.168.10.101 \
ตัวนับ p 192.168.10.135 ตัวนับแพ็กเก็ต 0 ไบต์ 0 }
}โซ่ z {
ประเภทตัวกรองเบ็ดกรองลำดับความสำคัญเอาท์พุท; ยอมรับนโยบาย
ไอพี พ่อดร @y
}
}
# nft -f กฎชุด nft
#nft ชุดกฎรายการ
ตารางไอพี x {
ตั้งค่า y {
ประเภทของ ip saddr
ตอบโต้
องค์ประกอบ = { 192.168.10.35 ตัวนับแพ็กเก็ต 1 ไบต์ 84, 192.168.10.101 \
ตัวนับ p 192.168.10.135 ตัวนับแพ็กเก็ต 0 ไบต์ 0 }
}โซ่ z {
ประเภทตัวกรองเบ็ดกรองลำดับความสำคัญเอาท์พุท; ยอมรับนโยบาย
ไอพี พ่อดร @y
}
} - เพิ่มการรองรับตัวนับใน Flowtable:
ตาราง ip foo {
แถบตารางการไหล {
ลำดับความสำคัญของตะขอเข้า -100
อุปกรณ์ = { eth0, eth1 }
ตอบโต้
}ห่วงโซ่ไปข้างหน้า {
ประเภทตัวกรองตะขอกรองลำดับความสำคัญไปข้างหน้า;
โฟลว์เพิ่ม @bar counter
}
}คุณสามารถดูรายการตัวนับได้โดยใช้คำสั่ง "conntrack -L":
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 แพ็กเก็ต=9 ไบต์=608 \
src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
secctx=null ใช้=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 กีฬา=47280 dport=5201 \
แพ็คเก็ต=1005763 ไบต์=44075714753 src=10.0.1.2 dst=10.0.1.1 กีฬา=5201 dport=47280 \
แพ็กเก็ต = 967505 ไบต์ = 50310268 [ปิดโหลด] เครื่องหมาย = 0 secctx = null ใช้ = 2 - ในชุดสำหรับการต่อข้อมูล (การต่อข้อมูล กลุ่มที่อยู่และพอร์ตบางกลุ่มที่ทำให้การเปรียบเทียบง่ายขึ้น) คุณสามารถใช้คำสั่ง "typeof" ซึ่งกำหนดประเภทข้อมูลขององค์ประกอบสำหรับส่วนที่เป็นองค์ประกอบขององค์ประกอบของชุด:
ตาราง ip foo {
ตั้งค่าไวท์ลิสต์ {
ประเภทของ ip saddr TCP ดีพอร์ต
องค์ประกอบ = { 192.168.10.35 . 80, 192.168.10.101. 80}
}โซ่บาร์ {
ประเภทตัวกรองตะขอกรองลำดับความสำคัญก่อนกำหนดเส้นทาง; นโยบายลดลง;
ไอพี พ่อ tcp dport @whitelist ยอมรับ
}
} - ประเภทของคำสั่งในขณะนี้ยังใช้กับการรวมในรายการแผนที่:
ตาราง ip foo {
แผนที่ addr2mark {
ประเภทของ ip saddr tcp dport : เครื่องหมายเมตา
องค์ประกอบ = { 192.168.10.35 . 80 : 0x00000001,
192.168.10.135. 80 : 0x00000002 }
}โซ่บาร์ {
ประเภทตัวกรองตะขอกรองลำดับความสำคัญก่อนกำหนดเส้นทาง; นโยบายลดลง;
เมตามาร์กตั้งค่า ip daddr tcp dport map @ addr2mark ยอมรับ
}
} - เพิ่มการสนับสนุนสำหรับการรวมช่วงในชุดที่ไม่ระบุชื่อ (ไม่มีชื่อ):
# nft เพิ่มกฎอินพุตตัวกรอง inet ip daddr TCP ดีพอร์ต\
{ 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } ยอมรับ - ความสามารถในการละทิ้งแพ็กเก็ตที่มีแฟล็ก 802.1q (VLAN) เมื่อประมวลผลบริดจ์เครือข่ายมีให้:
# nft เพิ่มกฎบริดจ์ foo bar ประเภทอีเธอร์ vlan ปฏิเสธด้วยการรีเซ็ต tcp
- เพิ่มการรองรับการจับคู่โดยตัวระบุเซสชัน TCP (conntrack ID) หากต้องการระบุรหัส conntrack คุณสามารถใช้ตัวเลือก "--output id":
# conntrack -L — รหัสเอาต์พุต
udp 17 18 src=192.168.2.118 dst=192.168.2.1 กีฬา=36424 dport=53 แพ็กเก็ต=2 \
ไบต์=122 src=192.168.2.1 dst=192.168.2.118 กีฬา=53 dport=36424 แพ็กเก็ต=2 ไบต์=320 \
[มั่นใจ] เครื่องหมาย=0 ใช้=1 id=2779986232# nft เพิ่มกฎ foo bar ct id 2779986232 ตัวนับ
ที่มา: opennet.ru