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

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

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

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

  • เพิ่มการรองรับแพ็กเก็ตและตัวนับการรับส่งข้อมูลที่เกี่ยวข้องกับองค์ประกอบชุดในชุดแล้ว ตัวนับเปิดใช้งานโดยใช้คำสำคัญ "ตัวนับ":

    ตารางไอพี x {
    ตั้งค่า y {
    ประเภทของ ip saddr
    ตอบโต้
    องค์ประกอบ = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    โซ่ z {
    ประเภทตัวกรองเบ็ดกรองลำดับความสำคัญเอาท์พุท; ยอมรับนโยบาย
    ไอพี พ่อดร @y
    }
    }

  • หากต้องการตั้งค่าเริ่มต้นของตัวนับ เช่น เพื่อคืนค่าตัวนับก่อนหน้าหลังจากรีสตาร์ท คุณสามารถใช้คำสั่ง "nft -f":

    #กฎแมว.nft
    ตารางไอพี x {
    ตั้งค่า y {
    ประเภทของ ip saddr
    ตอบโต้
    องค์ประกอบ = { 192.168.10.35 ตัวนับแพ็กเก็ต 1 ไบต์ 84, 192.168.10.101 \
    ตัวนับ p 192.168.10.135 ตัวนับแพ็กเก็ต 0 ไบต์ 0 }
    }

    โซ่ z {
    ประเภทตัวกรองเบ็ดกรองลำดับความสำคัญเอาท์พุท; ยอมรับนโยบาย
    ไอพี พ่อดร @y
    }
    }
    # nft -f กฎชุด nft
    #nft ชุดกฎรายการ
    ตารางไอพี x {
    ตั้งค่า y {
    ประเภทของ ip saddr
    ตอบโต้
    องค์ประกอบ = { 192.168.10.35 ตัวนับแพ็กเก็ต 1 ไบต์ 84, 192.168.10.101 \
    ตัวนับ p 192.168.10.135 ตัวนับแพ็กเก็ต 0 ไบต์ 0 }
    }

    โซ่ z {
    ประเภทตัวกรองเบ็ดกรองลำดับความสำคัญเอาท์พุท; ยอมรับนโยบาย
    ไอพี พ่อดร @y
    }
    }

  • เพิ่มการรองรับตัวนับใน Flowtable:

    ตาราง ip foo {
    แถบตารางการไหล {
    ลำดับความสำคัญของตะขอเข้า -100
    อุปกรณ์ = { eth0, eth1 }
    ตอบโต้
    }

    ห่วงโซ่ไปข้างหน้า {
    ประเภทตัวกรองตะขอกรองลำดับความสำคัญไปข้างหน้า;
    โฟลว์เพิ่ม @bar counter
    }
    }

    คุณสามารถดูรายการตัวนับได้โดยใช้คำสั่ง "conntrack -L":

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 แพ็กเก็ต=9 ไบต์=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
    secctx=null ใช้=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 กีฬา=47280 dport=5201 \
    แพ็คเก็ต=1005763 ไบต์=44075714753 src=10.0.1.2 dst=10.0.1.1 กีฬา=5201 dport=47280 \
    แพ็กเก็ต = 967505 ไบต์ = 50310268 [ปิดโหลด] เครื่องหมาย = 0 secctx = null ใช้ = 2

  • ในชุดสำหรับการต่อข้อมูล (การต่อข้อมูล กลุ่มที่อยู่และพอร์ตบางกลุ่มที่ทำให้การเปรียบเทียบง่ายขึ้น) คุณสามารถใช้คำสั่ง "typeof" ซึ่งกำหนดประเภทข้อมูลขององค์ประกอบสำหรับส่วนที่เป็นองค์ประกอบขององค์ประกอบของชุด:

    ตาราง ip foo {
    ตั้งค่าไวท์ลิสต์ {
    ประเภทของ ip saddr TCP ดีพอร์ต
    องค์ประกอบ = { 192.168.10.35 . 80, 192.168.10.101. 80}
    }

    โซ่บาร์ {
    ประเภทตัวกรองตะขอกรองลำดับความสำคัญก่อนกำหนดเส้นทาง; นโยบายลดลง;
    ไอพี พ่อ tcp dport @whitelist ยอมรับ
    }
    }

  • ประเภทของคำสั่งในขณะนี้ยังใช้กับการรวมในรายการแผนที่:

    ตาราง ip foo {
    แผนที่ addr2mark {
    ประเภทของ ip saddr tcp dport : เครื่องหมายเมตา
    องค์ประกอบ = { 192.168.10.35 . 80 : 0x00000001,
    192.168.10.135. 80 : 0x00000002 }
    }

    โซ่บาร์ {
    ประเภทตัวกรองตะขอกรองลำดับความสำคัญก่อนกำหนดเส้นทาง; นโยบายลดลง;
    เมตามาร์กตั้งค่า ip daddr tcp dport map @ addr2mark ยอมรับ
    }
    }

  • เพิ่มการสนับสนุนสำหรับการรวมช่วงในชุดที่ไม่ระบุชื่อ (ไม่มีชื่อ):

    # nft เพิ่มกฎอินพุตตัวกรอง inet ip daddr TCP ดีพอร์ต\
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } ยอมรับ

  • ความสามารถในการละทิ้งแพ็กเก็ตที่มีแฟล็ก 802.1q (VLAN) เมื่อประมวลผลบริดจ์เครือข่ายมีให้:

    # nft เพิ่มกฎบริดจ์ foo bar ประเภทอีเธอร์ vlan ปฏิเสธด้วยการรีเซ็ต tcp

  • เพิ่มการรองรับการจับคู่โดยตัวระบุเซสชัน TCP (conntrack ID) หากต้องการระบุรหัส conntrack คุณสามารถใช้ตัวเลือก "--output id":

    # conntrack -L — รหัสเอาต์พุต
    udp 17 18 src=192.168.2.118 dst=192.168.2.1 กีฬา=36424 dport=53 แพ็กเก็ต=2 \
    ไบต์=122 src=192.168.2.1 dst=192.168.2.118 กีฬา=53 dport=36424 แพ็กเก็ต=2 ไบต์=320 \
    [มั่นใจ] เครื่องหมาย=0 ใช้=1 id=2779986232

    # nft เพิ่มกฎ foo bar ct id 2779986232 ตัวนับ

ที่มา: opennet.ru

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