โมดูลคอนแทร็กของ iptable ติดตามสถานะของแพ็กเก็ตเมื่อใด

Aug 15 2020

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

แต่ด้วย connntrack ฉันเห็นว่ามันถูกนำไปใช้กับห่วงโซ่ INPUT เช่นกฎนี้:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

ทำให้ฉันสงสัยว่าคำพูดนั้นทำอะไรได้จริง?

  • มันบอกว่าจะเริ่มติดตามแพ็กเก็ตที่ตรงกับกฎนั้นโดยใส่ข้อมูลในตารางสถานะหรือไม่?
  • หรือว่ามีข้อมูลของรัฐอยู่แล้วและจะดำเนินการกับข้อความขาเข้าตามข้อมูลดังกล่าว? (เช่นยอมรับว่าเป็นของการเชื่อมต่อที่ยอมรับก่อนหน้านี้หรือไม่) แต่ในกรณีนี้ตารางรัฐได้รับการเติมข้อมูลที่ไหน? กฎข้อไหน? หรือเป็นกฎน้อยและโดยปริยาย?

คำตอบ

5 A.B Aug 15 2020 at 21:43

การนำเสนอเบื้องต้นของ Netfilter และ conntrack

ขั้นแรกแผนผังบังคับเกี่ยวกับ Packet flow ใน Netfilter และ General Networking:

Netfilter คือเฟรมเวิร์กการกรองแพ็กเก็ตที่แทรกตัวเองไปยังส่วนที่เหลือของสแต็กเครือข่าย (แสดงโดย "การตัดสินใจกำหนดเส้นทาง" และส่วนกล่องสีขาวอื่น ๆ Netfilter จัดเตรียม hooks และ APIs สำหรับระบบย่อยอื่น ๆ และ "clients" ในส่วนเหล่านี้ ได้แก่conntrack (ตัวติดตามการเชื่อมต่อ) และiptables (หรือnftables ) การแยกระหว่าง Netfilter และconntrackค่อนข้างคลุมเครือ คุณสามารถพิจารณาconntrackเป็นส่วนหนึ่งของ Netfilter ได้

ในแผนผังที่อธิบายขั้นตอนต่างๆที่แพ็กเก็ตข้ามผ่านคุณจะเห็นว่าในบางจุด (ระหว่างดิบ / PREROUTING และ Mangle / PREROUTING หรือระหว่าง Raw / OUTPUT และ Mangle / OUTPUT) แพ็กเก็ตจะเคลื่อนที่ผ่านคอนแทร็

ณ จุดนี้conntrackจะค้นหาในตารางการค้นหาของตัวเอง (ฐานข้อมูลการค้นหาขนาดเล็กที่เก็บไว้ในหน่วยความจำเคอร์เนล):

  • หากไม่พบลักษณะของแพ็กเก็ตนี้ (และหากไม่ได้ประกาศ UNTRACKED ในตารางดิบ) รายการทูเปิลแบบสองทิศทางคอนแทร็กใหม่(โปรโตคอลจากนั้นข้อมูลตระกูลและโปรโตคอลที่เฉพาะเจาะจง: ต้นทางและพอร์ตเริ่มต้นปลายทางและพอร์ตเริ่มต้นแหล่งตอบกลับและพอร์ต ปลายทางและพอร์ตการตอบกลับ (โดยปกติสองรายการสุดท้ายจะเป็นแบบย้อนกลับเว้นแต่ NAT หรือโปรโตคอลแปลก ๆ ที่เกี่ยวข้องเช่นการตอบกลับด้วยเสียงสะท้อนที่ตรงกันสำหรับ ICMP)) ที่อธิบายว่าโฟลว์ถูกสร้างขึ้นด้วยสถานะใหม่
  • หากตรงกับ (ในทิศทางใด ๆ ) รายการก่อนหน้าและเข้ากันได้กับสถานะของโฟลว์นี้สถานะการไหลอาจมีการเปลี่ยนแปลง (เช่นเปลี่ยนจากใหม่เป็นสร้างขึ้นหากไม่เคยเป็นเช่นนั้นมาก่อน)
  • หากด้วยเหตุผลบางประการแพ็คเก็ตไม่สามารถจับคู่โฟลว์ที่มีอยู่ได้แม้ว่าจะมีลักษณะเฉพาะก็ตาม (เช่นแพ็คเก็ต TCP ที่ล่าช้าที่ได้รับหลังจากการส่งข้อมูลใหม่เริ่มต้นสำเร็จแล้วดังนั้นการไม่อยู่นอกหน้าต่างโดยคำนึงถึงลำดับและค่า SACK) แพ็คเก็ตจะถูกแท็กไม่ถูกต้อง
  • มีกรณีอื่น ๆ อีกสองสามกรณีเช่นเกี่ยวข้อง: นี่เป็นเรื่องเกี่ยวกับแพ็กเก็ตที่ไม่ได้เป็นส่วนหนึ่งของโฟลว์เอง แต่เกี่ยวข้องกับโฟลว์ใหม่ที่สามารถเชื่อมโยงกับโฟลว์อื่นที่มีอยู่ (เช่นในฐานข้อมูล) สองตัวอย่างคือข้อผิดพลาด ICMP ที่สร้างขึ้นจากการรับแพ็กเก็ต (เช่น: พอร์ต UDP ไม่สามารถเข้าถึงได้) หรือเมื่อผู้ช่วยโปรโตคอลพิเศษเช่นโมดูลเคอร์เนลnf_conntrack_ftpซึ่งเป็นปลั๊กอินไปยังระบบย่อยconntrackตรวจพบว่าแพ็กเก็ตเป็นส่วนหนึ่งของโฟลว์ข้อมูลแยกที่เกี่ยวข้อง ด้วยคำสั่ง FTP PASV / EPSV หรือ PORT / EPRT ที่ทำบนโฟลว์คำสั่ง (บนพอร์ต 21)

ตอบคำถาม

ทั้งหมดที่กล่าวมานี่คือคำตอบของกระสุนสองนัดของคุณ:

  • ในคอนแทร็กเนมสเปซเครือข่ายหลักจะเริ่มติดตามการเชื่อมต่อทันทีที่โหลดโมดูล (รวมถึงโมดูลย่อยเฉพาะโปรโตคอลที่เกี่ยวข้อง) สำหรับเนมสเปซเครือข่ายที่ไม่ได้เริ่มต้น (คอนเทนเนอร์ ... ) สิ่งนี้ต้องการให้ระบบย่อยอื่น ๆ อ้างอิงถึงระบบย่อย (เช่นโมดูลคอนแทร็กของiptablesของ OP หรือใช้เมื่อคำสั่งที่conntrackอธิบายในภายหลัง) นี่เป็นค่าดีฟอลต์และแพ็กเก็ตต้องถูกทำเครื่องหมายเป็น UNTRACKED โดยเฉพาะก่อนที่ระบบย่อยconntrackจะเห็นแพ็กเก็ตนี้เพื่อไม่ให้ติดตาม บน Linux มีเพียงไม่กี่กรณีที่ไม่จำเป็นต้องติดตาม แต่แน่นอนว่าไฟร์วอลล์และ NAT แบบ stateful / ไดนามิกจะไม่สามารถใช้งานได้อีกต่อไป (NAT แบบไม่ต่อเนื่องซึ่งอาจต้องใช้ UNTRACKED ในตอนแรกก็ยังสามารถ ทำ แต่ไม่ได้อยู่กับiptables . TCหรือnftablesสามารถ) เพื่อหลีกเลี่ยงการจัดการคอนแทร็กบางแพ็กเก็ตคุณสามารถใช้กฎiptablesประเภทนี้ได้ (เช่น: พอร์ต 80 / tcp):

    iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack
    iptables -t raw -A OUTPUT -p tcp --sport 80 -j CT --notrack
    
  • เมื่อแพ็กเก็ตข้ามผ่านตัวกรอง / INPUT และถึงกฎนี้:

     iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    iptables 's โมดูลเฉพาะเคอร์เนลxt_conntrackสอบถามconntrackระบบย่อย (จัดการโดยโมดูลเคอร์เนลต่างๆที่เกี่ยวข้องnf_conntrack*) และถามเกี่ยวกับสถานะของแพ็คเก็ตนี้ในฐานข้อมูลการค้นหาของตน หากคำตอบคือRELATEDหรือESTABLISHEDแพ็กเก็ตตรงกันและดำเนินการตามคำตัดสินของ ACCEPT จริงๆแล้วผลลัพธ์จะถูกแคชไว้ในแพ็กเก็ตแล้วในครั้งแรกที่ทำการค้นหา (โดยปกติจะใช้คอนแทร็ก ) ดังนั้นนี่จึงเป็น "การค้นหา" ที่ถูก นี่จึงเป็นกฎทั่วไปในการจัดการโฟลว์ที่ยอมรับมาก่อนแล้ว ขั้นตอนเหล่านี้สามารถยอมรับได้ในขั้นต้นในกฎที่กล่าวถึงอย่างชัดเจน-m conntrack --ctstate NEWหรือเพียงแค่กฎที่ไม่ได้กล่าวถึง แต่วางไว้หลังกฎทั่วไปนี้ (แต่โปรดจำไว้ว่าสถานะไม่ถูกต้องซึ่งโดยปกติควรจะถูกทิ้งก่อนที่จะทำเช่นนั้น)

  • การเพิ่มสัญลักษณ์แสดงหัวข้อย่อย: การจัดการแพ็คเก็ตขาเข้าและแพ็กเก็ตขาออกค่อนข้างสมมาตรระหว่าง PREROUTING และ OUTPUT (แม้ว่าจะดูไม่สมมาตรก็ตาม): อินเทอร์เฟซconntrackใน PREROUTING และ OUTPUT (และในที่อื่น ๆ อีกไม่กี่แห่งเมื่อพิจารณาจากNATคือ ทำงานกับconntrackยกเว้นแพ็คเก็ตแรกในสถานะ NEW traversing iptables 's nat table) สิ่งนี้อาจแตกต่างจากคำอธิบายที่คุณเขียนเกี่ยวกับ IPFW เล็กน้อย หากเซิร์ฟเวอร์ที่ใช้งานแอปพลิเคชันกำลัง จำกัด โฟลว์ขาออกด้วยก็เป็นไปได้ว่าจะต้องใช้กฎiptablesทั่วไปเดียวกันนี้ทั้งในตัวกรอง / เอาท์พุทและในตัวกรอง / อินพุตเพื่อให้แพ็กเก็ตการตอบกลับขาออกของการรับส่งข้อมูลขาเข้าที่ยอมรับแล้วผ่านไปได้


ข้อมูลเพิ่มเติม

มีเครื่องมือเฉพาะในการโต้ตอบกับมีconntrackระบบย่อยของตารางการค้นหาจากconntrack เครื่องมือ

  • conntrackเพื่อสอบถามลบหรือปรับปรุงเนื้อหาของตารางการค้นหาที่จัดการโดยconntrack

    ตัวอย่างบางส่วน

    คุณสามารถแสดงรายการที่ติดตามทั้งหมด (ซึ่งอาจมีขนาดใหญ่โดยไม่ต้องใช้ตัวกรองเพิ่มเติม) ด้วย:

    conntrack -L
    

    หากระบบของคุณจะทำ NAT (เช่นเราเตอร์ในด้านหน้าของ LAN ส่วนตัวหรือทำงาน VMs และภาชนะบรรจุ) คุณสามารถใช้--any-nat, --src-natหรือ--dst-natจะรับผิดชอบเพียงแสดง NAT ทั้งหมด NAT ต้นทางทั้งหมด (ปลอมตัว) หรือ NAT ปลายทางทั้งหมด (โดยทั่วไปสำหรับพอร์ตที่ส่งต่อ):

    การตรวจสอบเหตุการณ์คอนแทร็กแบบเรียลไทม์:

    conntrack -E
    
  • conntrackd: daemon ที่มีจุดประสงค์หลักสองประการคือ (conntrack) โฟลว์แอคเคาต์และสถิติหรือการซิงโครไนซ์สถานะคลัสเตอร์ไฟร์วอลล์สถานะพร้อมใช้งานสูง

2 TeroKilkanen Aug 15 2020 at 20:46

การติดตามการเชื่อมต่อเป็นฟังก์ชันแยกต่างหากของ Netfilter และไม่ได้กำหนดค่าด้วย IPTables

ในภาพมีสองconntrackขั้นตอนในเส้นทาง INPUT และอีกหนึ่งขั้นตอนในเส้นทางเอาท์พุท ขั้นตอนเหล่านี้เชื่อมโยงแต่ละแพ็กเก็ตกับการเชื่อมต่อที่มีอยู่ซึ่งติดตามในตารางการติดตามการเชื่อมต่อหรือสร้างรายการติดตามการเชื่อมต่อใหม่ในตาราง

ฟังก์ชัน Conntrack เป็นโมดูลเคอร์เนลของ Linux และมักรวมอยู่ในเคอร์เนลในการกำหนดค่าเริ่มต้น

สามารถปรับการทำงานของ Conntrack ได้โดยการปรับnet.netfilter.nf_conntrackค่า sysctl

ทางเลือกที่สองของคุณคือสิ่งที่เกิดขึ้น ข้อมูลสถานะถูกบันทึกโดยฟังก์ชัน Conntrack และกฎ IPTables เพียงแค่ปรึกษาตาราง Conntrack สำหรับข้อมูล