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

ที่ตีพิมพ์ การปล่อยตัวกรองแพ็คเก็ต ตาราง 0.9.4การพัฒนาเพื่อทดแทน iptables, ip6table, arptables และ ebtables โดยการรวมอินเทอร์เฟซการกรองแพ็กเก็ตสำหรับ IPv4, IPv6, ARP และบริดจ์เครือข่าย แพ็คเกจ nftables มีส่วนประกอบตัวกรองแพ็กเก็ตที่ทำงานในพื้นที่ผู้ใช้ ในขณะที่งานระดับเคอร์เนลจัดทำโดยระบบย่อย nf_tables ซึ่งเป็นส่วนหนึ่งของเคอร์เนล Linux นับตั้งแต่รีลีส 3.13 การเปลี่ยนแปลงที่จำเป็นสำหรับการเผยแพร่ nftables 0.9.4 จะรวมอยู่ในสาขาเคอร์เนลในอนาคต Linux 5.6.

ระดับเคอร์เนลให้เฉพาะอินเทอร์เฟซที่ไม่ขึ้นอยู่กับโปรโตคอลทั่วไปซึ่งมีฟังก์ชันพื้นฐานสำหรับการแยกข้อมูลจากแพ็กเก็ต การดำเนินการข้อมูล และการควบคุมโฟลว์ กฎการกรองและตัวจัดการเฉพาะโปรโตคอลจะถูกคอมไพล์เป็นไบต์โค้ดในพื้นที่ผู้ใช้ หลังจากนั้นไบต์โค้ดนี้จะถูกโหลดลงในเคอร์เนลโดยใช้อินเทอร์เฟซ 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

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