iptables: ความแตกต่างระหว่างแพ็คเก็ตใหม่ที่สร้างและที่เกี่ยวข้อง


46

ส่วนหนึ่งของไฟร์วอลล์บนเซิร์ฟเวอร์:

iptables -A INPUT -p tcp --dport 22 -m state NEW --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP

เมื่อฉันค้นหาออนไลน์ฉันจะเห็นว่ามีการใช้สิ่งใหม่ ๆ ในกฎนั้นเสมอ แต่ฉันมีความเข้าใจยากว่าทำไมไม่สร้างและเกี่ยวข้องที่เกี่ยวข้อง

แบบนี้ :

iptables -A INPUT -p tcp --dport 22 -m state NEW,ESTABLISHED,RELATED --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -m recent --update --seconds 100 --hitcount 10 -j DROP

ใครสามารถอธิบายให้ฉันทราบเมื่อมีการเปลี่ยนแปลงแพ็คเก็ตใหม่เป็น ESTABLISHED และที่เกี่ยวข้อง

คำตอบ:


46

พิจารณาแพ็กเก็ตใหม่สำหรับการโทรก่อนผู้รับจะรับสาย แพ็กเก็ต ESTABLISHED คือ "Hello" และแพ็คเก็ตที่เกี่ยวข้องจะเป็นถ้าคุณโทรมาบอกพวกเขาเกี่ยวกับอีเมลที่คุณกำลังจะส่ง (อีเมลนั้นเกี่ยวข้องกัน)

ในกรณีที่การเปรียบเทียบของฉันไม่ดีนักฉันคิดว่าหน้าคนจัดการมันได้ดี:

ใหม่ - หมายความว่าแพ็กเก็ตได้เริ่มต้นการเชื่อมต่อใหม่หรือเกี่ยวข้องกับการเชื่อมต่อซึ่งไม่ได้เห็นแพ็กเก็ตทั้งสองทิศทางและ

ก่อตั้ง - หมายถึงแพ็กเก็ตนั้นเชื่อมโยงกับการเชื่อมต่อซึ่งได้เห็นแพ็กเก็ตทั้งสองทิศทาง

RELATED - หมายถึงแพ็คเก็ตกำลังเริ่มการเชื่อมต่อใหม่ แต่เชื่อมโยงกับการเชื่อมต่อที่มีอยู่เช่นการถ่ายโอนข้อมูล FTP หรือข้อผิดพลาด ICMP

iptables (8) - หน้า man Linux


9
คุณรู้หรือไม่ว่ามันเป็นตัวกำหนดแพ็กเก็ตที่เกี่ยวข้องหรือไม่ มีกลไกบางอย่างที่แอปพลิเคชันสามารถใช้เพื่อส่งสัญญาณไปยัง iptables ว่าการเชื่อมต่อจะเป็นการเชื่อมต่อที่เกี่ยวข้องหรือเป็นส่วนหนึ่งของ iptables stateful อย่างหมดจด?
Matthew Scharley

9
มันถูกจัดการโดยชุดของโมดูลเคอร์เนลที่เรียกว่า ip_conntrack_ * แต่ละอันเขียนขึ้นสำหรับโปรโตคอลเฉพาะที่ใช้การเชื่อมต่อที่ไม่เกี่ยวข้อง (เช่น FTP) เพื่อตอบคำถามของคุณฉันคิดว่าคุณจะต้องโหลดโมดูลที่คล้ายกันสำหรับแอปพลิเคชันของคุณ
Kyle Smith

4
โอเคขอบคุณ. แต่กลับไปที่กฎที่มีใหม่อยู่ในนั้นเป็นไปได้หรือไม่ที่แพคเก็ตสามารถทำให้ดูเหมือนว่ามันถูกสร้างขึ้นแล้วและไม่ถูกบล็อกโดยกฎหรือไม่
กริช

2
@Kris: มันยากที่จะปลอมแพ็คเก็ตขาออกดังนั้นด้วยถ้อยคำของหน้าคนในคำตอบที่ฉันไม่เห็นว่า คุณถูกต้องว่าเป็นไปได้ที่จะปลอมแพ็คเก็ตซึ่งดูเหมือนว่ามันถูกผูกไว้กับการเชื่อมต่อแบบเปิด แต่ถึงแม้จะไม่มีไฟร์วอลล์ก็ตาม แต่สแต็ค TCP ก็จะวางแพ็กเก็ตลงบนพื้นถ้าไม่รู้เกี่ยวกับการเชื่อมต่อแบบเปิดจาก ผู้ส่ง. ถ้านี่เป็นไฟร์วอลล์บนเราเตอร์ก็ยังคงเป็นไปได้ที่จะรักษาสถานะนี้โดยการตรวจสอบSYN/ ACK/ RSTแพ็คเก็ต / etc ที่พวกเขาผ่านเราเตอร์และผมคาดว่า iptables การทำเช่นนี้
Matthew Scharley

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

14

ข้อสันนิษฐานสำหรับทั้งเซิร์ฟเวอร์และไคลเอนต์มีข้อ จำกัดINPUTและเปิดOUTPUTเช่น:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

และจากiptables-extensions (8)เหนือตัวอย่างของ FTP ในโหมด active:

1. ใหม่

ใหม่แพ็กเก็ตเริ่มต้นการเชื่อมต่อใหม่หรือเชื่อมโยงกับการเชื่อมต่อซึ่งไม่เห็นแพ็กเก็ตทั้งสองทิศทาง

ไคลเอ็นต์บนพอร์ต50000( พอร์ตunprivileged สุ่ม) เชื่อมต่อกับเซิร์ฟเวอร์ FTP บนพอร์ต21เซิร์ฟเวอร์จะต้องใช้อย่างน้อยสิ่งนี้เพื่อยอมรับการเชื่อมต่อขาเข้านี้:

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT

2. ก่อตั้งขึ้น

ก่อตั้งขึ้นแพ็คเก็ตที่เกี่ยวข้องกับการเชื่อมต่อซึ่งได้เห็นแพ็คเก็ตในทั้งสองทิศทาง

ตอนนี้ในฝั่งไคลเอ็นต์เขาเปิดการเชื่อมต่อออกไปยังเซิร์ฟเวอร์บนพอร์ต21ใช้พอร์ตท้องถิ่น50000และเขาต้องการ iptables ต่อไปนี้เพื่อช่วยให้การตอบสนองที่จะมาถึงจากserver (21)ไปclient (50000):

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

3. ที่เกี่ยวข้อง

ที่เกี่ยวข้องแพ็กเก็ตกำลังเริ่มต้นการเชื่อมต่อใหม่ แต่เชื่อมโยงกับการเชื่อมต่อที่มีอยู่เช่นการถ่ายโอนข้อมูล FTP หรือข้อผิดพลาด ICMP

ตอนนี้หลังจากการเชื่อมต่อ FTP ได้ถูกสร้างขึ้นและกำลังทำการเชื่อมต่อข้อมูลลูกค้าจะเปิดซ็อกเก็ตเซิร์ฟเวอร์ (ใช่ด้วยไคลเอนต์ FTP ที่ใช้งานจะกลายเป็นเซิร์ฟเวอร์สำหรับการเชื่อมต่อข้อมูล) บนพอร์ต60000(ไปยังไคลเอนต์เข้าใจฉันจะทำเครื่องหมายพอร์ตนี้60000เช่นเดียวRELATEDกับการเชื่อมต่ออื่น ๆ จาก50000->21) และจะส่งหมายเลขพอร์ตนี้ไปยังเซิร์ฟเวอร์โดยใช้PORTคำสั่งFTP จากนั้นเซิร์ฟเวอร์ FTP จะเปิดการเชื่อมต่อใหม่จากพอร์ต20ไปยังพอร์ต60000บนไคลเอนต์และตอนนี้ไคลเอนต์ต้องใช้สิ่งต่อไปนี้เพื่อให้การเชื่อมต่อใหม่นี้ประสบความสำเร็จ:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT

ในที่สุดสำหรับการทำงานคุณต้องเปิดใช้งานip_conntrack_ftpโมดูลเคอร์เนลเพื่อให้ระบบทำเครื่องหมายการเชื่อมต่อ / แพ็คเกจเป็นRELATED(นี่คือความเข้าใจของฉันฉันไม่ได้ขุดมากเกินไป):

modprobe ip_conntrack_ftp

ที่จัดตั้งขึ้นต้องใช้กระแสทิศทางเดียวในท้องถิ่นก่อนหน้านี้ไม่ใช่จับมือ 3 ทาง tcp ความเข้าใจของฉันถูกต้องหรือไม่?
sdaffa23fdsf

ขอบคุณสำหรับคำตอบสำหรับการจัดตั้งคุณกล่าวว่า "iptables เพื่อให้การตอบสนองมาจากเซิร์ฟเวอร์ (21) ถึงลูกค้า (50,000)" ถ้าเป็น FROM เซิร์ฟเวอร์ไปยังไคลเอนต์ทำไมมันเข้าและไม่เอาท์พุท?
Medya

@Medya เพราะจากมุมมองของลูกค้าแพ็คเก็ตที่ส่งจากเซิร์ฟเวอร์ (21) ให้กับลูกค้า (50000) INPUTเป็นแพ็คเก็ตที่เข้ามาเพื่อให้สำหรับลูกค้าที่เป็น
Jaime Hablutzel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.