Score:3

ตัวกรองเพย์โหลด Linux TCP

ธง ve

ฉันใช้ nftables แต่ไม่มีอะไรที่เหมือนกับสตริงของ iptables หรือการจับคู่ u32 ดังนั้นจึงไม่สามารถรวบรวม payload offset ได้อย่างน่าเชื่อถือ หากไม่ผ่านเพย์โหลดดิบของ nftables ฉันจะวิเคราะห์เพย์โหลด TCP อย่างมีประสิทธิภาพได้อย่างไรโดยปราศจากคอขวดของพื้นที่ผู้ใช้ (nfqueue ไม่ใช่คำตอบสำหรับเหตุผลด้านประสิทธิภาพ)

มีเทคนิคใดในการกรองในระดับเคอร์เนลหรือไม่? แม้แต่การทำเครื่องหมายแพ็คเก็ตที่เหมาะสมก็เพียงพอแล้วสำหรับฉัน - ส่วนที่เหลือสามารถทำได้ง่ายๆ ที่ไฟร์วอลล์

Score:0
ธง cl
A.B

มีรหัสเคอร์เนลที่สามารถจัดการการจับคู่สตริงตามอำเภอใจได้แล้ว แต่ยังคงอยู่ในบริบทของเคอร์เนลระหว่างเส้นทางแพ็กเก็ต ทำไมไม่ใช้ซ้ำล่ะ iptables ไม่ได้ไปไหน สิ่งที่อาจ อาจจะ หายไปในสักวันหนึ่งคือ API เคอร์เนลดั้งเดิมสำหรับ iptables,เหลือเพียง iptables-nft รอบๆยังใช้งานได้ xtable โมดูลเช่น สตริง จับคู่ โมดูล. โดยใช้ iptables-มรดก หรือ iptables-nft ตาม nftable จะมีผลลัพธ์เหมือนกันด้านล่าง

เป็นไปได้ที่จะใช้เครื่องหมายเพื่อส่งข้อความไปรอบๆ ระบบย่อยของเครือข่ายต่างๆ ในเส้นทางแพ็กเก็ต รวมถึงจาก nftable ถึง iptables แล้วกลับจาก iptables ถึง nftable.

นี้ ลำดับความสำคัญภายในเบ็ด ตารางสามารถช่วย:

ครอบครัว nftables ตะขอทั่วไป คำหลัก nft ค่า Netfilter ลำดับความสำคัญภายใน คำอธิบาย
[...]
ไอเน็ต, ไอพี, ไอพี6 ทั้งหมด ยุ่งเหยิง -150 NF_IP_PRI_MANGLE การดำเนินการบดบัง
ไอเน็ต, ไอพี, ไอพี6 การกำหนดเส้นทางล่วงหน้า ดีสตแนท -100 NF_IP_PRI_NAT_DST NAT ปลายทาง
ไอเน็ต, ip, ip6, arp, netdev ทั้งหมด กรอง 0 NF_IP_PRI_FILTER การดำเนินการกรอง ตารางตัวกรอง
[...]

เพียงแค่ต้องลงทะเบียน nftable สองครั้งสำหรับแต่ละ iptables' ห่วงโซ่ในตัวที่จะเกี่ยวข้อง: ครั้งเดียวกับลำดับความสำคัญก่อน iptables' หนึ่งครั้งโดยมีลำดับความสำคัญตามหลัง iptables'. ตัวอย่างเช่นตัวกรอง / เอาต์พุตเชนด้วย iptables ลำดับความสำคัญ 0 คุณสามารถใช้ -5 และ 5 รอบๆ ได้ รายละเอียดเพิ่มเติมใน เหล่านี้ สอง Unix/Linux SE Q/A ที่ฉันทำคำตอบ


ตัวอย่างประดิษฐ์ (ดัดแปลงจากตัวอย่างใน iptables-ส่วนขยาย(8)) การผสม nftable และ iptablesซึ่งระบบควรปล่อยคำขอ DNS ที่เริ่มต้นในเครื่องสำหรับที่อยู่ DNS เฉพาะ www.netfilter.orgแสดงในลำดับความสำคัญของ hook (คำเตือน: UDP เท่านั้น ใช้งานได้เฉพาะเมื่อไม่มีตัวเลือก/ส่วนหัวของ IPv4 หรือ IPv6 ใดๆ ในแพ็กเก็ตขาออกเนื่องจากช่วงคงที่ แต่ช่วงสามารถผ่อนคลายเพื่อรองรับสิ่งนี้):

nft เพิ่มตาราง inet mytable
nft เพิ่มเชน inet mytable เอาต์พุตก่อน '{ พิมพ์ลำดับความสำคัญของเอาต์พุต hook ตัวกรอง -5; นโยบายยอมรับ; }'
nft เพิ่มกฎ inet mytable เอาต์พุตก่อน udp dport 53 ชุดเครื่องหมายเมตา 1

iptables -I OUTPUT -m mark --mark 1 -m string --algo bm --from 40 --to 57 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
ip6tables -I OUTPUT -m mark --mark 1 -m string --algo bm --from 60 --to 77 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2

nft เพิ่มเชน inet mytable เอาต์พุตหลังจาก '{ พิมพ์ลำดับความสำคัญของเอาต์พุต hook ตัวกรอง 5; นโยบายยอมรับ; }'
nft เพิ่มกฎ inet mytable เอาต์พุตหลังจากเมตามาร์ก 2 ลดลง

เป้าหมายที่นี่คือการมี iptables จัดการเฉพาะส่วนที่จัดการไม่ได้ nftable และทำงานขั้นต่ำเท่านั้น: ออกค่าส่งคืนผ่านเครื่องหมายแล้วปล่อยกลับ nftable รับผิดชอบชะตากรรมของแพ็คเก็ต:

  • nftable กำหนดเครื่องหมายของแพ็คเก็ตเป็น 1 เพื่อ "ถาม" iptables เพื่อทำงานบางอย่าง
  • iptables (หรือ ip6tables) ทำการจับคู่สตริงก็ต่อเมื่อ "ได้รับ" เครื่องหมาย 1 เพื่อสำรองการใช้ CPU และ "คำตอบ" 2 หากสตริงตรงกันในกรณีดังกล่าว
  • nftable วางแพ็กเก็ตก็ต่อเมื่อ "ได้รับ" เครื่องหมายค่า 2 (ดังนั้นการลบไฟล์ iptables กฎจะปิดใช้งานเอฟเฟกต์ด้วย)

หมายเหตุ:

  • ข้อแม้

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

  • บางกรณีง่ายสามารถใช้ได้ payloads ดิบ

    ตัวอย่างเฉพาะด้านบนนี้ด้วย แก้ไขแล้ว offsets สามารถนำมาใช้กับ nftable. เมื่อมีการชดเชยโดยพลการเพื่อค้นหาข้อมูล (ใช้ดีที่สุดกับ iptables' สตริง จับคู่) หรือวิธีที่ซับซ้อนในการคำนวณค่าชดเชยดังกล่าว (ดีที่สุดใช้กับ iptables' ยู32 ตรงกัน)ว่า nftable ไม่สามารถใช้งานได้

    นี่คือสิ่งที่เทียบเท่ากับการแทนที่กฎทั้งหมดข้างต้นด้วยกฎเดียวโดยใช้เพย์โหลดดิบ ไวยากรณ์อนุญาตสูงสุด 128 บิตเท่านั้น แต่ที่นี่จำเป็นต้องใช้ 19x8=152 บิต ดังนั้นจึงต้องแยกเป็นสองเพย์โหลดดิบ (128 บิต + 24 บิต) พิมพ์ฉ, xxd และ ตัด ยังใช้สำหรับความช่วยเหลือบางอย่าง:

    nft เพิ่มตาราง inet mytable
    nft เพิ่มเชน inet mytable เอาท์พุต '{ พิมพ์ลำดับความสำคัญเอาท์พุตของ hook ตัวกรอง 0; นโยบายยอมรับ; }'
    nft เพิ่ม inet mytable เอาต์พุต udp dport 53 \
        @th,160,128 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c-32) \
        @th,288,24 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c33-) \
        หยด
    

    ด้วยผลลัพธ์ของ printf '\3%s\11%s\3%s\0' www netfilter org | xxd - หน้า สิ่งมีชีวิต:

      03777777096e657466696c746572036f726700
    

    เพื่อรับ payloads สองรายการ:

    0x03777777096e657466696c746572036f
                                    0x726700
    
  • อาจใช้วิธีอื่นได้

    • iptables สามารถเรียกวัตถุ eBPF (อย่างไรก็ตาม เคอร์เนลล่าสุดเท่านั้นที่อนุญาตให้วนซ้ำ (จำกัด) เพื่อลองใช้อัลกอริทึมบางอย่างได้อย่างง่ายดาย) nftable ขาดคุณสมบัตินี้ เป็นอีกครั้งที่มีเครื่องหมาย และ iptables.

    • วัตถุ eBPF ดังกล่าวอาจเป็นได้ ใช้กับ เอ็กซ์ดีพี หรือ ทีซี แต่อาจเร็วเกินไปในเส้นทางแพ็กเก็ต (เช่น: ไม่มี NAT แบบมีสถานะ) และต้องการการเขียนโปรแกรมจริงมากกว่าการดูแลระบบ อย่างไรก็ตาม เป็นการสื่อสารอีกครั้งผ่านเครื่องหมายหากต้องจัดการกับการตัดสินใจ nftable.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา