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

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

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

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