โมดูลคอนแทร็กของ iptable ติดตามสถานะของแพ็กเก็ตเมื่อใด
ก่อนอื่นจำเป็นต้องจัดเก็บสถานะ ด้วยไฟร์วอลล์ BSD รุ่นเก่าที่ฉันใช้ฉันเดาว่าชื่อ IPFW ฉันเคยตั้งกฎที่ระบุว่า "ติดตามสถานะของแพ็กเก็ตที่ออก" และสิ่งนี้ถูกวางไว้ในทิศทางขาออกของอินเทอร์เฟซ จากนั้นกฎอีกข้อเกี่ยวกับทิศทางขาเข้าที่ตรวจสอบกับสถานะเหล่านั้นที่สร้างขึ้นโดยกฎในทิศทางขาออก ดังนั้นจึงเคยมีกฎ 2 ข้อ: (1) เพื่อเติมข้อมูลในตารางสถานะนี่คือทิศทางขาออกและ (2) ในการค้นหาตารางสถานะนี่คือทิศทางขาเข้า
แต่ด้วย connntrack ฉันเห็นว่ามันถูกนำไปใช้กับห่วงโซ่ INPUT เช่นกฎนี้:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ทำให้ฉันสงสัยว่าคำพูดนั้นทำอะไรได้จริง?
- มันบอกว่าจะเริ่มติดตามแพ็กเก็ตที่ตรงกับกฎนั้นโดยใส่ข้อมูลในตารางสถานะหรือไม่?
- หรือว่ามีข้อมูลของรัฐอยู่แล้วและจะดำเนินการกับข้อความขาเข้าตามข้อมูลดังกล่าว? (เช่นยอมรับว่าเป็นของการเชื่อมต่อที่ยอมรับก่อนหน้านี้หรือไม่) แต่ในกรณีนี้ตารางรัฐได้รับการเติมข้อมูลที่ไหน? กฎข้อไหน? หรือเป็นกฎน้อยและโดยปริยาย?
คำตอบ
การนำเสนอเบื้องต้นของ 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) โฟลว์แอคเคาต์และสถิติหรือการซิงโครไนซ์สถานะคลัสเตอร์ไฟร์วอลล์สถานะพร้อมใช้งานสูง
การติดตามการเชื่อมต่อเป็นฟังก์ชันแยกต่างหากของ Netfilter และไม่ได้กำหนดค่าด้วย IPTables
ในภาพมีสองconntrack
ขั้นตอนในเส้นทาง INPUT และอีกหนึ่งขั้นตอนในเส้นทางเอาท์พุท ขั้นตอนเหล่านี้เชื่อมโยงแต่ละแพ็กเก็ตกับการเชื่อมต่อที่มีอยู่ซึ่งติดตามในตารางการติดตามการเชื่อมต่อหรือสร้างรายการติดตามการเชื่อมต่อใหม่ในตาราง
ฟังก์ชัน Conntrack เป็นโมดูลเคอร์เนลของ Linux และมักรวมอยู่ในเคอร์เนลในการกำหนดค่าเริ่มต้น
สามารถปรับการทำงานของ Conntrack ได้โดยการปรับnet.netfilter.nf_conntrack
ค่า sysctl
ทางเลือกที่สองของคุณคือสิ่งที่เกิดขึ้น ข้อมูลสถานะถูกบันทึกโดยฟังก์ชัน Conntrack และกฎ IPTables เพียงแค่ปรึกษาตาราง Conntrack สำหรับข้อมูล