เมื่อใช้กฎไฟร์วอลล์ iptables เหตุใดจึงยืนยันสถานะใหม่ในพอร์ตที่อนุญาตทั้งหมด


23

ฉันมักจะเห็น iptables ที่กำหนดค่าให้อนุญาตการเชื่อมต่อที่เกี่ยวข้องทั้งหมด pakets และพอร์ตบริการเฉพาะไปยังการเชื่อมต่อใหม่

เหตุผลในการระบุใหม่คืออะไร หากการเชื่อมต่อไม่ใช่ของใหม่มันเกี่ยวข้องกับการเดาดังนั้นกฎพอร์ตเฉพาะจะไม่ทำงาน เหตุใดจึงต้องกำหนดพอร์ตบริการด้วย NEW อย่างชัดเจนไม่ใช่เฉพาะ protocoll และหมายเลขพอร์ต

คำตอบ:


21

กฎในไฟร์วอลล์ netfilter (iptables) จะถูกตรวจสอบตามลำดับและชะตากรรมของแพ็กเก็ต (ACCEPT, DROP, REJECT และอื่น ๆ ) จะพิจารณาตามการจับคู่ครั้งแรก

โดยการทำให้สถานะไฟร์วอลล์เต็มและกฎข้อแรกทำให้-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTการรับส่งข้อมูลส่วนใหญ่ที่ถูกต้องไปยังเซิร์ฟเวอร์ของคุณเป็นที่ยอมรับหลังจากผ่านกฎข้อเดียวนั้น ทราฟฟิกนั้นไม่จำเป็นต้องข้ามกฎอื่น ๆ

ขึ้นอยู่กับขนาดของกฎพื้นฐานที่อาจหมายถึงความแตกต่างอย่างมีนัยสำคัญในประสิทธิภาพของไฟร์วอลล์ของคุณ

ทราฟฟิกเดียวที่ไฟร์วอลล์ต้องใช้ในการตรวจสอบความถูกต้องคือการเชื่อมต่อใหม่อย่างชัดเจน

เช่นเปรียบเทียบไฟร์วอลล์สำหรับเว็บเซิร์ฟเวอร์สาธารณะที่มีการเข้าถึงเว็บมาสเตอร์จำนวนหนึ่งจากเวิร์กสเตชัน:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m iprange --src-range 10.9.8.7-10.9.8.10 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

ประมาณ 99% ของแพ็คเก็ตที่ถูกกฎหมายจะเป็นของการเชื่อมต่อที่สร้างไว้แล้วกดเฉพาะกฎข้อแรก จากแพ็กเก็ตที่ไม่ตรงกับกฎนั้นส่วนใหญ่จะเป็นการเชื่อมต่อใหม่ไปยังเว็บไซต์ของคุณโมดูลหลายพอร์ตสามารถให้สิทธิ์การเข้าถึง HTTP หรือ HTTPS ในกฎเดียว เว็บมาสเตอร์ลงชื่อเข้าใช้จากเวิร์กสเตชันจำนวนหนึ่งซึ่งมีที่อยู่คงที่โดยใช้ ssh และ sftp และทุกอย่างถูกปฏิเสธ

ไฟร์วอลล์ที่กฎถูกจัดลำดับอย่างมีเหตุผลโดยพอร์ต TCP:

-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.7 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.8 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.9 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.10 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 443 -j ACCEPT

ที่นี่แต่ละคนและทุกแพ็คเก็ตที่คุณ HTTP เว็บเซิร์ฟเวอร์จะต้องมีการตรวจสอบกับ 5 กฎก่อนที่จะได้รับการเข้าถึง และด้วยบริการอื่น ๆ ที่ทำงานบนเซิร์ฟเวอร์ที่สามารถกลายเป็นกฎได้ 50 กฎหรือมากกว่านั้นเมื่อคุณเช่นจะใช้ fail2ban หรือผลิตภัณฑ์ที่คล้ายกัน


1
คำตอบที่ยอดเยี่ยม (+1 จากฉัน!) ยกเว้นว่าคุณพูดว่า " การเข้าถึงได้รับอนุญาตในการแข่งขันครั้งแรก " หากการแข่งขันนัดแรกเป็นแบบ DROP หรือ REJECT จะไม่อนุญาตการเข้าถึง ถ้ามันเป็นบันทึกคุณจะต้องค้นหาการแข่งขันในภายหลัง และหากโซ่แบบกำหนดเองมีส่วนร่วมสิ่งต่าง ๆ ก็จะค่อนข้างพิสดาร ฉันอยากจะบอกว่า " ชะตากรรมของแพ็กเก็ตนั้นพิจารณาจากการจับคู่ครั้งแรก "
MadHatter สนับสนุน Monica

5
คุณสามารถไตร่ตรองในกรณีที่มีrelated/establishedบรรทัดอยู่ แต่กฎที่ตามมาไม่ได้ยืนยันNEW?
Daniel Widrick

13

NEW หมายความว่าแพ็กเก็ตเริ่มต้นการเชื่อมต่อใหม่

มันจะถูกจัดการโดยโมดูลเคอร์เนลที่เรียกว่าip_conntrack_*ที่ทำให้ไฟร์วอลล์ของคุณstateful ไฟร์วอลล์ที่ไม่ระบุชื่อสามารถรับชมสตรีมได้

หากคุณเพียงระบุโปรโตคอลและหมายเลขพอร์ตไฟร์วอลล์ของคุณจะไม่เป็นของรัฐ แต่ไร้สถานะ หมายความว่ามันเป็นเพียงการ จำกัด หรือบล็อกแพ็คเก็ต ไฟร์วอลล์ประเภทนี้ไม่ทราบว่ามีการไหลของข้อมูลหรือไม่

ตัวอย่างที่ดีคือ FTP: FTP ที่ใช้งานอยู่ใช้พอร์ต 21 สำหรับช่องสัญญาณควบคุม แต่จากนั้นใช้พอร์ต 20 สำหรับช่องสัญญาณข้อมูล ในกรณีของไฟร์วอลล์ที่ไม่จำเป็นคุณไม่จำเป็นต้องเปิดพอร์ต 20 อย่างชัดเจนเพราะเกี่ยวข้องกับการเชื่อมต่อที่สร้างขึ้นใหม่ก่อนหน้านี้บนพอร์ต 21

นี่คือสารสกัดจากiptablesหน้าคน:

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

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

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


1
กลไกใดที่จะเชื่อมโยงพอร์ต 20 กับพอร์ต 21 การเชื่อมต่อ IP ที่เปิดสามารถถ่ายโอนไปยังพอร์ตอื่นได้หรือไม่?
dronus

nf_conntrack_ftp.ko
mateusza

7
-A INPUT -m tcp -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -DROP

ชุดกฎด้านบนจะอนุญาตให้แพ็คเก็ตไปยังพอร์ต TCP 22 พร้อมด้วยสถานะINVALIDผ่านACCEPT

ไม่ถูกต้อง : หากไม่มีสถานะก่อนหน้านี้ที่ใช้แพ็คเก็ตอยู่ในสถานะ INVALID สิ่งนี้อาจเกิดจากโพรบเครือข่ายการลักลอบหลายประเภทหรืออาจหมายความว่าคุณไม่มีรายการ CONNTRACK (ซึ่งคุณควรเห็นในบันทึกของคุณด้วย) หรือมันอาจจะไม่เป็นพิษเป็นภัย

/unix/57423/how-to-understand-why-the-packet-was-considered-invalid-by-the-iptables


การยืนยันสถานะNEWจะทำให้มั่นใจได้ว่าแพ็กเก็ต INVALID จะไม่ได้รับการยอมรับอย่างผิดพลาด

และชี้แจงความหมาย:

  • ใหม่ : นี่คือการเชื่อมต่อใหม่
  • ESTABLISHED : นี่เป็นแพ็กเก็ตที่เกี่ยวข้องกับการเชื่อมต่อปัจจุบัน
  • ที่เกี่ยวข้อง : นี่คือการเชื่อมต่อใหม่ แต่ได้รับการ predicated โดยการเชื่อมต่อที่มีอยู่
  • ไม่ถูกต้อง : ไม่มีข้อใดถูกใช้ด้านบน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.