ระดับเคอร์เนลให้เฉพาะอินเทอร์เฟซที่ไม่ขึ้นอยู่กับโปรโตคอลทั่วไปซึ่งมีฟังก์ชันพื้นฐานสำหรับการแยกข้อมูลจากแพ็กเก็ต การดำเนินการข้อมูล และการควบคุมโฟลว์ กฎการกรองและตัวจัดการเฉพาะโปรโตคอลจะถูกคอมไพล์เป็นไบต์โค้ดในพื้นที่ผู้ใช้ หลังจากนั้นไบต์โค้ดนี้จะถูกโหลดลงในเคอร์เนลโดยใช้อินเทอร์เฟซ Netlink และดำเนินการในเคอร์เนลในเครื่องเสมือนพิเศษที่ชวนให้นึกถึง BPF (ตัวกรองแพ็คเก็ตเบิร์กลีย์) วิธีนี้ช่วยให้คุณลดขนาดของโค้ดการกรองที่ทำงานในระดับเคอร์เนลได้อย่างมาก และย้ายฟังก์ชันทั้งหมดของกฎการแยกวิเคราะห์และตรรกะสำหรับการทำงานกับโปรโตคอลไปยังพื้นที่ผู้ใช้
นวัตกรรมหลัก:
- รองรับช่วงการเชื่อมต่อ (การต่อข้อมูล กลุ่มที่อยู่และพอร์ตบางรายการที่ทำให้การเปรียบเทียบง่ายขึ้น) ตัวอย่างเช่น สำหรับชุด "รายการที่อนุญาต" ซึ่งมีองค์ประกอบเป็นไฟล์แนบ การระบุแฟล็ก "ช่วงเวลา" จะระบุว่าชุดสามารถรวมช่วงในไฟล์แนบได้ (สำหรับไฟล์แนบ "ipv4_addr . ipv4_addr . inet_service" ก่อนหน้านี้สามารถแสดงรายการที่ตรงกันทุกประการได้ ตรงกับรูปแบบ "192.168.10.35" และตอนนี้คุณสามารถระบุกลุ่มที่อยู่ "192.68.11.123-80-192.168.10.35"):
ตาราง ip foo {
ตั้งค่าไวท์ลิสต์ {
พิมพ์ ipv4_addr ipv4_addr. inet_service
ช่วงเวลาธง
องค์ประกอบ = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
}โซ่บาร์ {
ประเภทตัวกรองตะขอกรองลำดับความสำคัญก่อนกำหนดเส้นทาง; นโยบายลดลง;
ไอพี ซาดร์ ไอพี พ่อ tcp dport @whitelist ยอมรับ
}
} - ในรายการชุดและแผนที่ คุณสามารถใช้คำสั่ง "typeof" ซึ่งจะกำหนดรูปแบบขององค์ประกอบเมื่อจับคู่
ตัวอย่างเช่น:ตาราง ip foo {
ตั้งค่าไวท์ลิสต์ {
ประเภทของ ip saddr
องค์ประกอบ = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}โซ่บาร์ {
ประเภทตัวกรองตะขอกรองลำดับความสำคัญก่อนกำหนดเส้นทาง; นโยบายลดลง;
ip daddr @whitelist ยอมรับ
}
}ตาราง ip foo {
แผนที่ addr2mark {
ประเภทของ ip saddr : เมตามาร์ก
องค์ประกอบ = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - เพิ่มความสามารถในการใช้การรวมในการผูก NAT ซึ่งช่วยให้คุณสามารถระบุที่อยู่และพอร์ตเมื่อกำหนดการแปลง NAT ตามรายการแผนที่หรือชุดที่มีชื่อ:
nft เพิ่มกฎ ip nat ก่อน dnat ip addr พอร์ตไปยังแผนที่ ip saddr { 1.1.1.1 : 2.2.2.2 สามสิบ }
nft เพิ่มแผนที่ ip nat ปลายทาง { พิมพ์ ipv4_addr inet_service: ipv4_addr. inet_service \\; }
nft เพิ่มกฎ ip nat ก่อน dnat ip addr พอร์ตไปยัง ip saddr แผนที่ tcp dport @destinations - รองรับการเร่งด้วยฮาร์ดแวร์ด้วยการกรองบางอย่างที่ดำเนินการโดยการ์ดเครือข่าย การเร่งความเร็วถูกเปิดใช้งานผ่านยูทิลิตี้ ethtool (“ethtool -K eth0 hw-tc-offload on”) หลังจากนั้นจะถูกเปิดใช้งานใน nftables สำหรับเชนหลักโดยใช้แฟล็ก "offload" เมื่อใช้เคอร์เนล Linux 5.6 การเร่งด้วยฮาร์ดแวร์ได้รับการสนับสนุนสำหรับการจับคู่ฟิลด์ส่วนหัวและการตรวจสอบอินเทอร์เฟซขาเข้าร่วมกับการรับ ละทิ้ง การทำซ้ำ (การทำซ้ำ) และการส่งต่อแพ็กเก็ต (fwd) ในตัวอย่างด้านล่าง การดำเนินการปล่อยแพ็กเก็ตที่มาจากที่อยู่ 192.168.30.20 จะดำเนินการที่ระดับการ์ดเครือข่าย โดยไม่ส่งแพ็กเก็ตไปยังเคอร์เนล:
#ไฟล์แมว.nft
ตาราง netdev x {
ห่วงโซ่ y {
ประเภทตัวกรองตะขออุปกรณ์ทางเข้า eth0 ลำดับความสำคัญ 10; ถ่ายธง;
ip saddr 192.168.30.20 ดรอป
}
}
#ไฟล์nft -f.nft - ปรับปรุงข้อมูลเกี่ยวกับตำแหน่งของข้อผิดพลาดในกฎ
# nft ลบกฎ ip yz หมายเลขอ้างอิง 7
ข้อผิดพลาด: ไม่สามารถประมวลผลกฎ: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ลบกฎ ip yz handle 7
^# nft ลบกฎ ip xx หมายเลขอ้างอิง 7
ข้อผิดพลาด: ไม่สามารถประมวลผลกฎ: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ลบกฎ ip xx หมายเลขอ้างอิง 7
^# nft ลบตาราง twst
ข้อผิดพลาด: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว คุณหมายถึง table 'test' in family ip ใช่หรือไม่
ลบตาราง twst
^^^ตัวอย่างแรกแสดงว่าตาราง “y” ไม่ได้อยู่ในระบบ ตารางที่สองไม่มีตัวจัดการ “7” และตารางที่สามแสดงพร้อมท์การพิมพ์ผิดเมื่อพิมพ์ชื่อตาราง
- เพิ่มการสนับสนุนสำหรับการตรวจสอบอินเทอร์เฟซทาสโดยระบุ "meta sdif" หรือ "meta sdifname":
... เมตา sdifname vrf1 ...
- เพิ่มการรองรับการทำงานกะขวาหรือซ้าย ตัวอย่างเช่น หากต้องการเลื่อนป้ายกำกับแพ็กเก็ตที่มีอยู่ไปทางซ้าย 1 บิตและตั้งค่าบิตรองเป็น 1:
… เครื่องหมายเมตาตั้ง เครื่องหมายเมตา lshift 1 หรือ 0x1 …
- ใช้ตัวเลือก "-V" เพื่อแสดงข้อมูลเวอร์ชันเพิ่มเติม
#nft -V
nftables v0.9.4 (หลอกตอนห้า)
cli:readline
เจสัน: ใช่
มินิมอล: ไม่
libxtables: ใช่ - ตอนนี้ต้องระบุตัวเลือกบรรทัดคำสั่งก่อนคำสั่ง ตัวอย่างเช่น คุณต้องระบุ "nft -a list Ruleset" และการเรียกใช้ "nft list Ruleset -a" จะส่งผลให้เกิดข้อผิดพลาด
ที่มา: opennet.ru