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