หลังจากหนึ่งปีของการพัฒนา
ระดับเคอร์เนลให้เฉพาะอินเทอร์เฟซที่ไม่ขึ้นอยู่กับโปรโตคอลทั่วไปซึ่งมีฟังก์ชันพื้นฐานสำหรับการแยกข้อมูลจากแพ็กเก็ต การดำเนินการข้อมูล และการควบคุมโฟลว์
ตรรกะการกรองและตัวจัดการเฉพาะโปรโตคอลจะถูกรวบรวมเป็นรหัสไบต์ในพื้นที่ผู้ใช้ หลังจากนั้นรหัสไบต์นี้จะถูกโหลดลงในเคอร์เนลโดยใช้อินเทอร์เฟซ Netlink และดำเนินการในเครื่องเสมือนพิเศษที่ชวนให้นึกถึง BPF (ตัวกรองแพ็คเก็ตเบิร์กลีย์) วิธีนี้ช่วยให้คุณลดขนาดของโค้ดการกรองที่ทำงานในระดับเคอร์เนลได้อย่างมาก และย้ายฟังก์ชันทั้งหมดของกฎการแยกวิเคราะห์และตรรกะสำหรับการทำงานกับโปรโตคอลไปยังพื้นที่ผู้ใช้
นวัตกรรมหลัก:
- รองรับ IPsec ช่วยให้สามารถจับคู่ที่อยู่ช่องสัญญาณตามแพ็กเก็ต, ID คำขอ IPsec และแท็ก SPI (ดัชนีพารามิเตอร์ความปลอดภัย) ตัวอย่างเช่น,
... ipsec ใน ip saddr 192.168.1.0/24
... ipsec ใน spi 1-65536นอกจากนี้ยังสามารถตรวจสอบได้ว่าเส้นทางผ่านอุโมงค์ IPsec หรือไม่ ตัวอย่างเช่น หากต้องการบล็อกการรับส่งข้อมูลที่ไม่ผ่าน IPSec:
… ตัวกรองเอาต์พุต rt ipsec หายไป
- รองรับ IGMP (Internet Group Management Protocol) ตัวอย่างเช่น คุณสามารถใช้กฎเพื่อละทิ้งคำขอเป็นสมาชิกกลุ่ม IGMP ที่เข้ามา
nft เพิ่มกฎ netdev foo bar igmp ประเภทการเป็นสมาชิก-แบบสอบถามตัวนับการลดลง
- ความเป็นไปได้ของการใช้ตัวแปรเพื่อกำหนดห่วงโซ่การเปลี่ยนแปลง (กระโดด / ข้ามไป) ตัวอย่างเช่น:
กำหนด dest = ber
เพิ่มกฎ ip foo bar jump $dest - รองรับมาสก์เพื่อระบุระบบปฏิบัติการ (OSลายนิ้วมือ) ตามค่า TTL ในส่วนหัว ตัวอย่างเช่น หากต้องการทำเครื่องหมายแพ็กเก็ตตาม OS ของผู้ส่ง คุณสามารถใช้คำสั่ง:
... meta mark set osf ttl ข้ามชื่อ map { "Linux" : 0x1,
"วินโดวส์": 0x2,
"MacOS": 0x3,
"ไม่ทราบ" : 0x0 }
... osf ttl ข้ามเวอร์ชัน "Linux:4.20" - ความสามารถในการจับคู่ที่อยู่ ARP ของผู้ส่งและที่อยู่ IPv4 ของระบบเป้าหมาย ตัวอย่างเช่น หากต้องการเพิ่มตัวนับแพ็กเก็ต ARP ที่ส่งจากที่อยู่ 192.168.2.1 คุณสามารถใช้กฎต่อไปนี้:
ตาราง arp x {
ห่วงโซ่ y {
ประเภทตัวกรองเบ็ดตัวกรองลำดับความสำคัญอินพุต; ยอมรับนโยบาย
arp saddr ip 192.168.2.1 ตัวนับแพ็กเก็ต 1 ไบต์ 46
}
} - รองรับการส่งต่อคำขออย่างโปร่งใสผ่านพร็อกซี (tproxy) ตัวอย่างเช่น เมื่อต้องการเปลี่ยนเส้นทางการโทรไปยังพอร์ต 80 ไปยังพอร์ตพร็อกซี 8080:
ตารางไอพี x {
ห่วงโซ่ y {
ประเภทตัวกรองเบ็ดลำดับความสำคัญในการกำหนดเส้นทางล่วงหน้า -150; ยอมรับนโยบาย
tcp dport 80 tproxy เป็น :8080
}
} - รองรับการทำเครื่องหมายซ็อกเก็ตด้วยความสามารถในการรับเครื่องหมายกำหนดเพิ่มเติมผ่าน setockopt() ในโหมด SO_MARK ตัวอย่างเช่น:
ตาราง inet x {
ห่วงโซ่ y {
ประเภทตัวกรองเบ็ดลำดับความสำคัญในการกำหนดเส้นทางล่วงหน้า -150; ยอมรับนโยบาย
tcp dport 8080 mark ตั้งค่าเครื่องหมายซ็อกเก็ต
}
} - รองรับการระบุชื่อข้อความที่มีลำดับความสำคัญสำหรับเชน ตัวอย่างเช่น:
nft เพิ่ม chain ip x raw { ประเภท filter hook การกำหนดเส้นทางลำดับความสำคัญ raw; }
nft เพิ่มตัวกรอง chain ip x { ประเภทตัวกรอง hook ตัวกรองลำดับความสำคัญก่อนกำหนดเส้นทาง; }
nft เพิ่ม chain ip x filter_later { ประเภท filter hook กำหนดเส้นทางตัวกรองลำดับความสำคัญ + 10; } - รองรับแท็ก SELinux (Secmark) ตัวอย่างเช่น หากต้องการกำหนดแท็ก "sshtag" ในบริบทของ SELinux คุณสามารถเรียกใช้:
nft เพิ่มตัวกรอง secmark inet sshtag "system_u:object_r:ssh_server_packet_t:s0"
จากนั้นใช้ป้ายกำกับนี้ในกฎ:
nft เพิ่มกฎตัวกรอง inet อินพุต tcp dport 22 meta secmark ตั้ง "sshtag"
nft เพิ่มตัวกรอง inet แผนที่ secmapping { ประเภท inet_service: secmark; }
nft เพิ่มองค์ประกอบตัวกรอง inet secmapping { 22: "sshtag" }
nft เพิ่มกฎตัวกรอง inet อินพุต meta secmark set tcp dport map @secmapping - ความสามารถในการระบุพอร์ตที่กำหนดให้กับโปรโตคอลในรูปแบบข้อความ ตามที่กำหนดไว้ในไฟล์ /etc/services ตัวอย่างเช่น:
nft เพิ่มกฎ xy tcp dport "ssh"
ชุดกฎรายการ nft -l
ตาราง x {
ห่วงโซ่ y {
...
tcp dport "ssh"
}
} - ความสามารถในการตรวจสอบประเภทของอินเทอร์เฟซเครือข่าย ตัวอย่างเช่น:
เพิ่มกฎ inet raw prerouting meta iifkind "vrf" ยอมรับ
- ปรับปรุงการสนับสนุนสำหรับการอัปเดตเนื้อหาของชุดแบบไดนามิกโดยระบุแฟล็ก "ไดนามิก" อย่างชัดเจน ตัวอย่างเช่น หากต้องการอัปเดตชุด "s" เพื่อเพิ่มที่อยู่ต้นทางและรีเซ็ตรายการหากไม่มีแพ็กเก็ตเป็นเวลา 30 วินาที:
เพิ่มตาราง x
เพิ่มชุด xs { พิมพ์ ipv4_addr; ขนาด 128; หมดเวลา 30 วินาที; ธงไดนามิก; }
เพิ่ม chain xy { ลำดับความสำคัญของอินพุตตะขอกรองประเภท 0; }
เพิ่มกฎ xy อัปเดต @s { ip saddr } - ความสามารถในการกำหนดเงื่อนไขการหมดเวลาแยกต่างหาก ตัวอย่างเช่น หากต้องการแทนที่การหมดเวลาเริ่มต้นสำหรับแพ็กเก็ตที่มาถึงพอร์ต 8888 คุณสามารถระบุ:
ตัวกรอง IP ตาราง {
ct หมดเวลาก้าวร้าว-tcp {
โปรโตคอล TCP;
l3proto ไอพี;
นโยบาย = {ก่อตั้ง: 100, close_wait: 4, ปิด: 4}
}
เอาต์พุตลูกโซ่ {
...
tcp dport 8888 ct ตั้งค่าการหมดเวลา "aggressive-tcp"
}
} - การสนับสนุน NAT สำหรับตระกูล inet:
ตาราง inet แนท {
...
ip6 daddr ตาย::2::1 dnat ตาย:2::99
} - ปรับปรุงการรายงานข้อผิดพลาดในการพิมพ์ผิด:
nft เพิ่มการทดสอบตัวกรองลูกโซ่
ข้อผิดพลาด: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว คุณหมายถึง table “filter” ใน family ip หรือไม่?
เพิ่มการทดสอบตัวกรองโซ่
^^^^^ - ความสามารถในการระบุชื่ออินเทอร์เฟซในชุด:
ตั้ง sc {
พิมพ์ inet_service ถ้าชื่อ
องค์ประกอบ = { "ssh" . "eth0" }
} - อัปเดตไวยากรณ์กฎ Flowtable:
nft เพิ่มตาราง x
nft เพิ่ม flowtable x ft { ลำดับความสำคัญของ hook ingress 0; อุปกรณ์ = { eth0, wlan0 }; }
...
nft เพิ่มกฎ x ส่งต่อโปรโตคอล ip { tcp, udp } ไหลเพิ่ม @ft - ปรับปรุงการรองรับ JSON
ที่มา: opennet.ru