ตัวกรองแพ็คเก็ต nftables ปล่อย 1.0.3

การเปิดตัวตัวกรองแพ็คเก็ต nftables 1.0.3 ได้รับการเผยแพร่แล้ว โดยเป็นการรวมอินเทอร์เฟซการกรองแพ็คเก็ตสำหรับ IPv4, IPv6, ARP และบริดจ์เครือข่าย (มุ่งเป้าไปที่การแทนที่ iptables, ip6table, arptables และ ebtables) การเปลี่ยนแปลงที่จำเป็นสำหรับการเผยแพร่ nftables 1.0.3 จะรวมอยู่ในเคอร์เนล Linux 5.18

แพ็คเกจ nftables มีส่วนประกอบตัวกรองแพ็กเก็ตที่ทำงานในพื้นที่ผู้ใช้ ในขณะที่งานระดับเคอร์เนลจัดทำโดยระบบย่อย nf_tables ซึ่งเป็นส่วนหนึ่งของเคอร์เนล Linux นับตั้งแต่รีลีส 3.13 ระดับเคอร์เนลให้เฉพาะอินเทอร์เฟซที่ไม่ขึ้นอยู่กับโปรโตคอลทั่วไปซึ่งมีฟังก์ชันพื้นฐานสำหรับการแยกข้อมูลจากแพ็กเก็ต การดำเนินการข้อมูล และการควบคุมโฟลว์

กฎการกรองเองและตัวจัดการเฉพาะโปรโตคอลจะถูกคอมไพล์เป็นไบต์โค้ดพื้นที่ผู้ใช้ หลังจากนั้นโค้ดไบต์นี้จะถูกโหลดลงในเคอร์เนลโดยใช้อินเตอร์เฟส Netlink และดำเนินการในเคอร์เนลในเครื่องเสมือนพิเศษที่คล้ายกับ BPF (Berkeley Packet Filters) วิธีการนี้ทำให้สามารถลดขนาดของรหัสการกรองที่ทำงานในระดับเคอร์เนลได้อย่างมาก และย้ายฟังก์ชันทั้งหมดของกฎการแยกวิเคราะห์และตรรกะของการทำงานกับโปรโตคอลไปยังพื้นที่ผู้ใช้

นวัตกรรมหลัก:

  • ขณะนี้รายการชุดสนับสนุนการจับคู่ชื่ออินเทอร์เฟซเครือข่ายโดยใช้มาสก์ เช่น ระบุโดยใช้สัญลักษณ์ “*”: ตาราง inet testifsets { set simple_wild { พิมพ์ ifname flags ช่วงองค์ประกอบ = { “abcdef*”, “othername”, “ppp0” } } chain v4icmp { ประเภท filter hook ลำดับความสำคัญอินพุต 0; ยอมรับนโยบาย iifname @simple_wild ตัวนับแพ็กเก็ต 0 ไบต์ 0 iifname { “abcdef*”, “eth0” } ตัวนับแพ็กเก็ต 0 ไบต์ 0 } }
  • ดำเนินการรวมองค์ประกอบรายการชุดที่ตัดกันโดยอัตโนมัติระหว่างการดำเนินการ ก่อนหน้านี้ เมื่อตั้งค่าตัวเลือก "ผสานอัตโนมัติ" การรวมจะดำเนินการในขั้นตอนของการประกาศกฎ แต่ตอนนี้ก็ใช้งานได้เมื่อมีการเพิ่มองค์ประกอบใหม่ทีละน้อยระหว่างการดำเนินการ ตัวอย่างเช่น ในขั้นตอนการประกาศ รายการตั้งค่า y { ตั้งค่าสถานะช่วงเวลาองค์ประกอบการผสานอัตโนมัติ = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8 , 3.3.3.4 , 3.3.3.5 } } จะถูกเปลี่ยนเป็นองค์ประกอบ = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } แล้วถ้าคุณเพิ่มองค์ประกอบใหม่ # nft เพิ่มองค์ประกอบ ip xy { 1.2.3.0 -1.2.4.255, 3.3.3.6 } จะมีลักษณะเหมือนองค์ประกอบ = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }

    เมื่อคุณลบแต่ละรายการออกจากรายการที่อยู่ในช่วงรายการที่มีอยู่ ช่วงจะสั้นลงหรือแยกออก

  • มีการเพิ่มการสนับสนุนสำหรับการรวมกฎการแปลที่อยู่หลายรายการ (NAT) ในรายการแผนที่ลงในเครื่องมือเพิ่มประสิทธิภาพกฎ ซึ่งจะถูกเรียกเมื่อมีการระบุตัวเลือก “-o/—เพิ่มประสิทธิภาพ” ตัวอย่างเช่นสำหรับชุด # cat Ruleset.nft ตาราง ip x { chain y { พิมพ์ nat hook ลำดับความสำคัญหลังเส้นทาง srcnat; นโยบายลดลง; ip saddr 1.1.1.1 tcp dport 8000 snat ถึง 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat ถึง 5.5.5.5:90 } }

    การรัน "nft -o -c -f Ruleset.nft" จะแปลงกฎ "ip saddr" ที่แยกจากกันเป็นรายการแผนที่: snat เป็น ip saddr แผนที่ tcp dport { 1.1.1.1 . 8000: 4.4.4.4. 80, 2.2.2.2. 8001:5.5.5.5. 90}

    ในทำนองเดียวกัน นิพจน์ดิบสามารถแปลงเป็นรายการแผนที่ได้: # cat Ruleset.nft table ip x { […] chain nat_dns_acme { udp length 47-63 @th,160,128 0x0e373135363130333131303735353203 ไปที่ nat_dns_dnstc udp length 62-78 @th ,160,128 0 0x31393032383939353831343037320e5301e ไปที่ nat_dns_this_62 ความยาว udp 78-160,128 @th,0 0x31363436323733373931323934300e5301e ไปที่ nat_dns_saturn_62 ความยาว udp 78-160,128 @th,0 0x32393535373539353636383732310e5302 62 78e ไปที่ nat_dns_saturn_160,128 udp ความยาว 0-0 @th,38353439353637323038363633390 5303xXNUMXeXNUMXe ไปที่ nat_dns_saturn_XNUMX drop } }

    หลังจากการเพิ่มประสิทธิภาพเราได้รับรายการแผนที่: udp length @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : ไปที่ nat_dns_dnstc, 62-78 0x0e31393032383939353831343037320e : ไปที่ nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : ไปที่ nat_dns_saturn_5301, 62-78 0x0e32393535373539353636383732310e : ไปที่ nat_dns_saturn_5302, 62-78 0x0e38353439353637323038363633390e : ไปที่ nat_dns_saturn_5303 }

  • อนุญาตให้ใช้นิพจน์ดิบในการดำเนินการต่อข้อมูลได้ ตัวอย่างเช่น: #nft เพิ่มกฎ xy ip saddr @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } หรือตาราง x { set y { typeof ip saddr @ih,32,32 องค์ประกอบ = { 1.1.1.1 . 0x14 } } }
  • เพิ่มการสนับสนุนสำหรับการระบุฟิลด์ส่วนหัวจำนวนเต็มในการดำเนินการต่อข้อมูล: table inet t { map m1 { typeof udp length @ ih,32,32 : คำตัดสินแฟล็กองค์ประกอบช่วง = { 20-80 0x14 : ยอมรับ, 1-10 . 0xa : drop } } chain c { ลำดับความสำคัญของอินพุตตะขอตัวกรองประเภท 0; นโยบายลดลง; ความยาวยูดีพี @ih,32,32 vmap @m1 } }
  • เพิ่มการสนับสนุนสำหรับการรีเซ็ตตัวเลือก TCP (ใช้ได้กับเคอร์เนล Linux 5.18+ เท่านั้น): tcp flags syn รีเซ็ต tcp option sack-perm
  • การดำเนินการคำสั่งเชนเอาท์พุต (“nft list chain xy”) ได้รับการเร่งให้เร็วขึ้น

ที่มา: opennet.ru

เพิ่มความคิดเห็น