โฮมเพจ » ทำอย่างไร » คู่มือเริ่มต้นสำหรับ iptables, Linux Firewall

    คู่มือเริ่มต้นสำหรับ iptables, Linux Firewall

    Iptables เป็นยูทิลิตีไฟร์วอลล์ที่ยืดหยุ่นอย่างมากที่สร้างขึ้นสำหรับระบบปฏิบัติการ Linux ไม่ว่าคุณจะเป็นมือใหม่ Linux หรือผู้ดูแลระบบอาจมีวิธีที่ iptables สามารถใช้งานได้ดีสำหรับคุณ อ่านต่อในขณะที่เราแสดงวิธีกำหนดค่าไฟร์วอลล์ Linux ที่หลากหลายที่สุด.

    ภาพถ่ายโดย ezioman.

    เกี่ยวกับ iptables

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

    iptables มักติดตั้งมาล่วงหน้าในการแจกจ่าย Linux ใด ๆ หากต้องการอัปเดต / ติดตั้งเพียงดึงแพ็คเกจ iptables:

    sudo apt-get install iptables

    มีทางเลือก GUI สำหรับ iptables เช่น Firestarter แต่ iptables ไม่ยากอย่างแท้จริงเมื่อคุณมีคำสั่งไม่กี่คำ คุณต้องการให้ความระมัดระวังเป็นอย่างยิ่งเมื่อตั้งค่ากฎ iptables โดยเฉพาะอย่างยิ่งถ้าคุณเป็น SSH ในเซิร์ฟเวอร์เนื่องจากคำสั่งที่ผิดหนึ่งคำสั่งสามารถล็อคคุณออกอย่างถาวรจนกว่าจะแก้ไขด้วยตนเองที่เครื่องทางกายภาพ.

    ประเภทของโซ่

    iptables ใช้สามกลุ่มที่แตกต่างกัน: อินพุต, ส่งต่อ, และเอาท์พุท.

    อินพุต - ห่วงโซ่นี้จะใช้ในการควบคุมพฤติกรรมการเชื่อมต่อขาเข้า ตัวอย่างเช่นหากผู้ใช้พยายามที่จะ SSH ใน PC / เซิร์ฟเวอร์ของคุณ iptables จะพยายามจับคู่ที่อยู่ IP และพอร์ตกับกฎในห่วงโซ่การป้อนข้อมูล.

    ข้างหน้า - ห่วงโซ่นี้ใช้สำหรับการเชื่อมต่อขาเข้าที่ไม่ได้จัดส่งแบบโลคัล คิดถึงเราเตอร์ - ข้อมูลมักถูกส่งไป แต่มักจะไม่ได้กำหนดไว้สำหรับเราเตอร์ ข้อมูลจะถูกส่งต่อไปยังเป้าหมายของมัน นอกจากว่าคุณกำลังกำหนดเส้นทาง, NATing หรืออย่างอื่นในระบบของคุณที่ต้องการส่งต่อคุณจะไม่ใช้สายโซ่นี้.

    มีวิธีหนึ่งที่แน่นอนในการตรวจสอบว่าระบบของคุณใช้ / ต้องการโซ่ส่งต่อหรือไม่.

    iptables -L -v

    ภาพหน้าจอด้านบนเป็นของเซิร์ฟเวอร์ที่ใช้งานมาสองสามสัปดาห์และไม่มีข้อ จำกัด ในการเชื่อมต่อขาเข้าหรือขาออก อย่างที่คุณเห็นเชนอินพุตได้ประมวลผลแพ็กเก็ต 11GB และเอาท์พุตเชนประมวลผล 17GB ไปข้างหน้าโซ่ไม่จำเป็นต้องดำเนินการแพ็คเก็ตเดียว นี่เป็นเพราะเซิร์ฟเวอร์ไม่ได้ทำการส่งต่อหรือใช้เป็นอุปกรณ์ส่งผ่าน.

    เอาท์พุต - ห่วงโซ่นี้ใช้สำหรับการเชื่อมต่อขาออก ตัวอย่างเช่นหากคุณพยายาม ping howtogeek.com iptables จะตรวจสอบห่วงโซ่เอาท์พุทเพื่อดูว่ากฎใดที่เกี่ยวข้องกับ ping และ howtogeek.com ก่อนที่จะตัดสินใจอนุญาตหรือปฏิเสธการพยายามเชื่อมต่อ.

    ข้อแม้

    แม้ว่าการส่ง Ping ไปยังโฮสต์ภายนอกดูเหมือนว่าสิ่งที่จะต้องผ่านห่วงโซ่เอาท์พุทเท่านั้นโปรดจำไว้ว่าการส่งคืนข้อมูลห่วงโซ่อินพุตจะถูกนำมาใช้เช่นกัน เมื่อใช้ iptables เพื่อล็อคระบบของคุณโปรดจำไว้ว่าโพรโทคอลจำนวนมากจะต้องใช้การสื่อสารแบบสองทางดังนั้นทั้งอินพุตและเอาท์พุตโซ่จะต้องมีการกำหนดค่าอย่างถูกต้อง SSH เป็นโปรโตคอลทั่วไปที่ผู้ใช้ลืมที่จะอนุญาตในทั้งสองเครือข่าย.

    พฤติกรรมเริ่มต้นของนโยบายโซ่

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

    หากต้องการดูว่ากลุ่มนโยบายของคุณได้รับการกำหนดค่าให้ทำอย่างไรกับปริมาณข้อมูลที่ไม่ตรงกันให้เรียกใช้ iptables -L คำสั่ง.

    อย่างที่คุณเห็นเรายังใช้คำสั่ง grep เพื่อให้ผลลัพธ์ที่สะอาดยิ่งขึ้น ในภาพหน้าจอนั้นเครือข่ายของเรากำลังคิดที่จะยอมรับปริมาณการใช้งาน.

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

    iptables - อินพุตยอมรับนโยบาย
    iptables - ยอมรับผลลัพธ์โดยตรง
    iptables - นโยบายยอมรับล่วงหน้า

    โดยการเริ่มต้นกฎการยอมรับคุณสามารถใช้ iptables เพื่อปฏิเสธที่อยู่ IP ที่เฉพาะเจาะจงหรือหมายเลขพอร์ตในขณะที่ยังคงยอมรับการเชื่อมต่ออื่น ๆ ทั้งหมด เราจะไปที่คำสั่งเหล่านั้นในเวลาไม่กี่นาที.

    หากคุณต้องการปฏิเสธการเชื่อมต่อทั้งหมดและระบุว่าคุณต้องการอนุญาตการเชื่อมต่อใดด้วยตนเองคุณควรเปลี่ยนนโยบายเริ่มต้นของเครือข่ายของคุณเพื่อดร็อป การทำเช่นนี้อาจเป็นประโยชน์สำหรับเซิร์ฟเวอร์ที่มีข้อมูลที่ละเอียดอ่อนและมีที่อยู่ IP เดียวกันเท่านั้นที่เชื่อมต่อกับพวกเขา.

    iptables - อินพุตหยดน้ำแข็ง
    iptables - โพรไฟล์เอาท์พุตน้ำแข็ง
    iptables - POLROP DROP ไปข้างหน้า

    การตอบสนองเฉพาะการเชื่อมต่อ

    ด้วยการกำหนดค่านโยบายลูกโซ่เริ่มต้นของคุณคุณสามารถเริ่มเพิ่มกฎให้กับ iptables เพื่อให้รู้ว่าต้องทำอย่างไรเมื่อพบการเชื่อมต่อจากหรือไปยังที่อยู่ IP หรือพอร์ตเฉพาะ ในคู่มือนี้เราจะกล่าวถึง“ การตอบสนอง” พื้นฐานที่สุดและใช้กันทั่วไป.

    ยอมรับ - อนุญาตการเชื่อมต่อ.

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

    ปฏิเสธ - ไม่อนุญาตการเชื่อมต่อ แต่ส่งข้อผิดพลาดกลับมา วิธีนี้ดีที่สุดถ้าคุณไม่ต้องการให้แหล่งข้อมูลใดเชื่อมต่อกับระบบของคุณ แต่คุณต้องการให้พวกเขารู้ว่าไฟร์วอลล์ของคุณบล็อกพวกเขา.

    วิธีที่ดีที่สุดในการแสดงความแตกต่างระหว่างกฎทั้งสามนี้คือการแสดงสิ่งที่ดูเหมือนว่าเมื่อพีซีพยายามที่จะ ping เครื่อง Linux ที่มี iptables ที่กำหนดค่าไว้สำหรับการตั้งค่าเหล่านี้แต่ละรายการ.

    การอนุญาตการเชื่อมต่อ:

    วางการเชื่อมต่อ:

    การปฏิเสธการเชื่อมต่อ:

    การอนุญาตหรือการบล็อกการเชื่อมต่อเฉพาะ

    ด้วยการกำหนดค่านโยบายกลุ่มของคุณคุณสามารถกำหนดค่า iptables เพื่ออนุญาตหรือบล็อกที่อยู่เฉพาะช่วงที่อยู่และพอร์ต ในตัวอย่างเหล่านี้เราจะตั้งค่าการเชื่อมต่อเป็น DROP, แต่คุณสามารถเปลี่ยนเป็น ยอมรับ หรือ ปฏิเสธ, ขึ้นอยู่กับความต้องการของคุณและวิธีการกำหนดค่านโยบายกลุ่มของคุณ.

    หมายเหตุ: ในตัวอย่างเหล่านี้เราจะใช้ iptables -A เพื่อผนวกกฎกับห่วงโซ่ที่มีอยู่ iptables เริ่มต้นที่ด้านบนของรายการและผ่านแต่ละกฎจนกว่าจะพบหนึ่งที่ตรงกัน หากคุณต้องการแทรกกฎด้านบนอื่นคุณสามารถใช้ iptables -I [chain] [number] เพื่อระบุหมายเลขที่ควรอยู่ในรายการ.

    การเชื่อมต่อจากที่อยู่ IP เดียว

    ตัวอย่างนี้แสดงวิธีการบล็อกการเชื่อมต่อทั้งหมดจากที่อยู่ IP 10.10.10.10.

    iptables -A INPUT -s 10.10.10.10 -j DROP

    การเชื่อมต่อจากช่วงของที่อยู่ IP

    ตัวอย่างนี้แสดงวิธีปิดกั้นที่อยู่ IP ทั้งหมดในช่วงเครือข่าย 10.10.10.0/24 คุณสามารถใช้ netmask หรือเครื่องหมายสแลชมาตรฐานเพื่อระบุช่วงของที่อยู่ IP.

    iptables -A INPUT -s 10.10.10.0/24 -j DROP

    หรือ

    iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

    การเชื่อมต่อกับพอร์ตเฉพาะ

    ตัวอย่างนี้แสดงวิธีการบล็อกการเชื่อมต่อ SSH จาก 10.10.10.10.

    iptables -A อินพุต -p tcp --dport ssh -s 10.10.10.10 -j DROP

    คุณสามารถแทนที่“ ssh” ด้วยโพรโทคอลหรือหมายเลขพอร์ตใด ๆ -p tcp ส่วนหนึ่งของรหัสบอก iptables ชนิดของการเชื่อมต่อที่ใช้โปรโตคอล ถ้าคุณบล็อกโพรโทคอลที่ใช้ UDP แทนที่จะเป็น TCP -p udp จะมีความจำเป็นแทน.

    ตัวอย่างนี้แสดงวิธีการบล็อกการเชื่อมต่อ SSH จากที่อยู่ IP ใด ๆ.

    iptables -A อินพุต -p tcp --dport ssh -j DROP

    สถานะการเชื่อมต่อ

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

    นั่นคือสิ่งที่สถานะการเชื่อมต่อเข้ามาซึ่งให้ความสามารถที่คุณต้องใช้ในการสื่อสารสองทาง แต่อนุญาตให้สร้างการเชื่อมต่อทางเดียวได้ ดูตัวอย่างนี้ที่อนุญาตการเชื่อมต่อ SSH จาก 10.10.10.10 แต่การเชื่อมต่อ SSH กับ 10.10.10.10 นั้นไม่ใช่ อย่างไรก็ตามระบบได้รับอนุญาตให้ส่งข้อมูลกลับผ่าน SSH ตราบใดที่เซสชันได้ถูกสร้างขึ้นแล้วซึ่งทำให้การสื่อสาร SSH เป็นไปได้ระหว่างโฮสต์ทั้งสองนี้.

    iptables -A อินพุต -p tcp --dport ssh -s 10.10.10.10 -m state - สถานะใหม่สถานะที่สร้างแล้ว -j ยอมรับ

    iptables -A เอาท์พุท -p tcp - พอร์ต 22 -d 10.10.10.10 -m รัฐ - รัฐที่จัดตั้งขึ้น -j ได้รับการยอมรับ

    กำลังบันทึกการเปลี่ยนแปลง

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

    อูบุนตู:

    sudo / sbin / iptables- บันทึก

    Red Hat / CentOS:

    / sbin / บริการ iptables บันทึก

    หรือ

    /etc/init.d/iptables บันทึก

    คำสั่งอื่น ๆ

    แสดงรายการกฎ iptables ที่กำหนดค่าในปัจจุบัน:

    iptables -L

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

    หากต้องการล้างกฎที่กำหนดค่าทั้งหมดในปัจจุบันคุณสามารถออกคำสั่ง flush ได้.

    iptables -F