Score:2

iptables/nftables: จะแยกการรับส่งข้อมูลที่ส่งต่อทั้งหมดออกจากการติดตามการเชื่อมต่อบนเราเตอร์ได้อย่างไร

ธง ua

กล่อง Linux มีอินเทอร์เฟซเครือข่ายหลายตัว เปิดใช้งานการส่งต่อ IP สำหรับ IPv4 และ IPv6

ฉันต้องการปกป้องบริการที่ทำงานบนเราเตอร์ผ่านไฟร์วอลล์ที่มีสถานะ สำหรับสิ่งนั้น จำเป็นต้องเปิดใช้การติดตามการเชื่อมต่อ ในเวลาเดียวกัน ฉันต้องการยกเว้นการรับส่งข้อมูลทั้งหมดที่ส่งต่อจากอินเทอร์เฟซหนึ่งไปยังอีกอินเทอร์เฟซหนึ่งจากการติดตามการเชื่อมต่อ

สำหรับไฟร์วอลล์ stateful ฉันมักจะใช้เชน INPUT และ OUTPUT ของตารางตัวกรอง ทราฟฟิกที่ส่งต่อจะไปที่ห่วงโซ่ FORWARD แต่ AFAIK ไม่มีทางที่จะทำเครื่องหมายทราฟฟิกว่าไม่ถูกติดตามในห่วงโซ่ FORWARD ตรรกะดังกล่าวต้องไปที่ห่วงโซ่ PREROUTING ในตารางดิบ แต่ฉันเชื่อว่าในห่วงโซ่ PREROUTING นั้นยังไม่ได้ตัดสินใจว่าทราฟฟิกจะถูกส่งต่อหรือไม่

การติดตามการเชื่อมต่อมีข้อเสียหลายประการ เช่น แพ็กเก็ตลดลงเมื่อรายการการเชื่อมต่อที่ติดตามถึงขนาดสูงสุด

วิธีที่ง่ายที่สุดในการยกเว้นทราฟฟิกที่ส่งต่อ (และเฉพาะทราฟฟิกที่ส่งต่อนั้น) จากการติดตามการเชื่อมต่อคืออะไร

A.B avatar
cl flag
A.B
คุณสามารถระบุโครงร่างเครือข่ายของคุณ (`ip -br link; ip -br address; ip -4 route; ip -6 route`) และระบุว่ามี NAT ใดบ้างที่คาดหวังได้หรือไม่
ua flag
เพียงพิจารณาเราเตอร์ที่มีสองอินเทอร์เฟซ eth0 และ eth1 พร้อมที่อยู่ 192.168.1.1/24 และ 192.168.2.1/24
Score:1
ธง cl
A.B

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

การแสดงออกตอแหล

ตอแหล {saddr | พ่อดร | ทำเครื่องหมาย | ไอฟ | อ๊อฟ} [. ...] {oif | อ๊อฟเนม | พิมพ์}

ตอแหล นิพจน์สอบถาม ตอแหล (ส่งต่อฐานข้อมูล) ถึง รับข้อมูลเช่นดัชนีอินเตอร์เฟสเอาต์พุตโดยเฉพาะ ที่อยู่จะใช้ อินพุตคือ tuple ขององค์ประกอบที่ใช้เป็น อินพุตไปยัง ตอแหล ฟังก์ชันการค้นหา

งบไม่ติดตาม

คำสั่ง notrack อนุญาตให้ปิดใช้งานการติดตามการเชื่อมต่อสำหรับ แพ็กเก็ตบางอย่าง

โน้ต

โปรดทราบว่าเพื่อให้คำชี้แจงนี้มีผลบังคับใช้ จะต้องนำไปใช้กับ แพ็กเก็ตก่อนก คอนแทรค การค้นหาเกิดขึ้น ดังนั้นจึงจำเป็นต้องนั่ง ในเครือด้วย การกำหนดเส้นทางล่วงหน้า หรือ เอาต์พุต hook และลำดับความสำคัญของ hook -300 หรือน้อยกว่า

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

nft เพิ่ม ip ตารางไร้สถานะ
nft เพิ่ม chain ip stateless prerouting '{ type filter hook ลำดับความสำคัญก่อนกำหนด -310; นโยบายยอมรับ; }'
nft เพิ่มกฎ ip stateless prerouting iif != lo fib daddr oif มีอยู่ notrack

เปลี่ยน ไอพี ครอบครัวกับ ไอเน็ต กลุ่มคำสั่งผสมควรขยายลักษณะการทำงานทั่วไปแบบเดียวกันไปยัง IPv4+IPv6

เพื่อให้เฉพาะเจาะจงมากขึ้นสามารถระบุอินเทอร์เฟซเอาต์พุตในอนาคตด้วย fib daddr oif eth1 ตัวอย่างเช่นซึ่งเทียบเท่ามากหรือน้อยของ oif eth1แต่ยังมีอยู่ใน การกำหนดเส้นทางล่วงหน้า.

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

ตัวอย่างเช่น ด้วยข้อมูลที่ให้โดย OP ให้แทนที่กฎก่อนหน้าด้วย:

nft เพิ่มกฎ ip stateless prerouting 'ip daddr != { 192.168.1.1, 192.168.2.1, 127.0.0.0/8 } notrack'

น่าจะได้ผลใกล้เคียงกัน 127.0.0.0/8 มีอยู่ด้วยเหตุผลเดียวกับข้างต้นพร้อมกับ แท้จริง อินเตอร์เฟซ.

การจัดการการออกอากาศ (เช่น 192.168.1.255 ที่ได้รับบน eth0) และมัลติคาสต์ (เช่น link-local 224.0.0.1 ที่ได้รับบนอินเทอร์เฟซ) อาจไม่ทำงานเหมือนกันในทั้งสองวิธีหรือตามที่คาดไว้ และอาจต้องการกฎเพิ่มเติมสำหรับความต้องการเฉพาะ โดยเฉพาะกับวิธีที่ 2 เนื่องจากการติดตามการแพร่ภาพและมัลติคาสต์นั้นไม่ค่อยมีประโยชน์ เนื่องจากแหล่งที่มาของการตอบกลับจะไม่ (และไม่สามารถ) เป็นปลายทางการออกอากาศดั้งเดิมหรือที่อยู่มัลติคาสต์ได้ ดังนั้นรายการคอนแทร็กจะไม่มีวัน "เห็น" ทราฟฟิกแบบสองทิศทาง โดยปกติแล้วจะไม่มีความสำคัญมากนักสำหรับ กฎเกณฑ์ของรัฐ


หมายเหตุ

  • สิ่งนี้มักจะเข้ากันไม่ได้กับ stateful NAT

    ความเข้าใจของฉันคือ DNAT ไปยังรีโมตโฮสต์จะได้รับทราฟฟิกการตอบกลับที่ไม่ถูก de-NATed และล้มเหลว และ SNAT ที่ส่งต่อนั้นจะไม่ทริกเกอร์เนื่องจากไม่มี คอนแทรค สร้างรายการแล้ว SNAT ที่ไม่ค่อยได้ใช้ในเส้นทางอินพุตน่าจะใช้ได้ และคำสั่งผสมของ DNAT+SNAT (โดยใช้แหล่งที่มาของที่อยู่ในท้องถิ่น) อาจใช้งานได้ตั้งแต่นั้นมาทั้งในทิศทางดั้งเดิมและทิศทางการตอบกลับที่มีปลายทางในเครื่องที่เกี่ยวข้อง ดังนั้น คอนแทรค รายการควรถูกสร้างหรือค้นหาอย่างถูกต้องเสมอ

  • ชุดกฎมาตรฐาน

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

  • ตรวจสอบพฤติกรรม

    สามารถตรวจสอบพฤติกรรมโดยรวมได้แม้ไม่มีกฎไฟร์วอลล์ที่เหมาะสมโดย:

    • ใช้หุ่นจำลอง กะรัต กฎเพื่อให้แน่ใจว่า คอนแทรค สิ่งอำนวยความสะดวกได้รับการลงทะเบียนในเนมสเปซเครือข่ายปัจจุบัน

      nft เพิ่มตาราง ip mytable
      nft เพิ่มเชน ip mytable mychain '{ พิมพ์ hook ตัวกรองลำดับความสำคัญก่อนกำหนดเส้นทาง -150; นโยบายยอมรับ; }'
      nft เพิ่มกฎ ip mytable mychain ct สถานะใหม่
      
    • ใช้ คอนแทรค เครื่องมือติดตามเหตุการณ์:

      คอนแทรค -E
      
    • สร้างทราฟฟิกจากระยะไกล

      ใหม่ คอนแทรค จากนั้นรายการจะถูกสร้างขึ้นเพื่อให้เราเตอร์ได้รับทราฟฟิก แต่ไม่ใช่สำหรับทราฟฟิกที่กำหนดเส้นทาง

ua flag
การแสดงออกที่เป็นเท็จนั้นเป็นสิ่งที่ฉันกำลังมองหา การตรวจสอบว่า daddr เป็นที่อยู่ในท้องถิ่นอาจใช้ได้หรือไม่ แต่เนื่องจากบางแอดเดรส (เช่น IPv6 บางตัว) อาจเปลี่ยนแปลงเมื่อเวลาผ่านไป สิ่งนี้จึงดูไม่เป็นประโยชน์สำหรับฉัน
ua flag
จะทำอย่างไรถ้ามีเส้นทางที่เข้าไม่ถึง? การรับส่งข้อมูลนั้น `fib daddr oif มีอยู่` จะตรงกันด้วยหรือไม่
A.B avatar
cl flag
A.B
หากไม่มีเส้นทาง ก็จะไม่มีเอาต์พุตอินเทอร์เฟซ: ไม่มี notrack แต่จริง ๆ แล้ว ในขณะที่กฎก่อนการตัดสินใจกำหนดเส้นทางจะมี `ct state new' ตรงกับแพ็กเก็ตดังกล่าว แต่ conntrack จะไม่คอมมิตเพราะถูกทิ้งกลางคัน (ในการตัดสินใจกำหนดเส้นทางจริง): `conntrack -E` จะไม่แสดงเลย ดังนั้นเป้าหมายยังคงประสบความสำเร็จ (นอกจากนี้ ในระหว่างการทดสอบ ฉันไม่สามารถจัดการเพื่อให้ `oif daddr type xxx` ตรงกันตามที่คาดไว้เมื่อไม่มีเส้นทาง)

โพสต์คำตอบ

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