คู่มือเริ่มต้นสำหรับ iptables, Linux Firewall
Iptables เป็นยูทิลิตี้ไฟร์วอลล์ที่มีความยืดหยุ่นสูงซึ่งสร้างขึ้นสำหรับระบบปฏิบัติการ Linux ไม่ว่าคุณจะเป็นมือใหม่ Linux geek หรือผู้ดูแลระบบอาจมีบางวิธีที่ iptables สามารถใช้งานได้ดีสำหรับคุณ อ่านต่อในขณะที่เราแสดงวิธีกำหนดค่าไฟร์วอลล์ Linux ที่หลากหลายที่สุด
ภาพถ่ายโดยezioman
เกี่ยวกับ iptables
iptables เป็นยูทิลิตี้ไฟร์วอลล์บรรทัดคำสั่งที่ใช้ห่วงโซ่นโยบายเพื่ออนุญาตหรือบล็อกการรับส่งข้อมูล เมื่อการเชื่อมต่อพยายามสร้างตัวเองบนระบบของคุณ iptables จะค้นหากฎในรายการเพื่อจับคู่ หากไม่พบก็จะใช้การดำเนินการเริ่มต้น
iptables มักจะติดตั้งมาล่วงหน้าในการแจกจ่าย Linux ใด ๆ ในการอัปเดต / ติดตั้งเพียงแค่ดึงแพ็คเกจ iptables:
sudo apt-get install iptables
มีทางเลือก GUI สำหรับ iptables เช่น Firestarter แต่ iptables นั้นไม่ยากจริงๆเมื่อคุณมีคำสั่งไม่กี่คำสั่ง คุณต้องระมัดระวังอย่างยิ่งในการกำหนดค่ากฎ iptables โดยเฉพาะอย่างยิ่งหากคุณ SSH เข้าสู่เซิร์ฟเวอร์เนื่องจากคำสั่งที่ไม่ถูกต้องอาจล็อกคุณอย่างถาวรจนกว่าจะแก้ไขด้วยตนเองที่เครื่องจริง
ประเภทของโซ่
iptables ใช้โซ่ที่แตกต่างกันสามแบบ: อินพุตส่งต่อและเอาต์พุต
อินพุต - โซ่นี้ใช้เพื่อควบคุมพฤติกรรมสำหรับการเชื่อมต่อขาเข้า ตัวอย่างเช่นหากผู้ใช้พยายาม SSH ในพีซี / เซิร์ฟเวอร์ของคุณ iptables จะพยายามจับคู่ที่อยู่ IP และพอร์ตกับกฎในห่วงโซ่อินพุต
ส่งต่อ - ห่วงโซ่นี้ใช้สำหรับการเชื่อมต่อขาเข้าที่ไม่ได้ถูกส่งในพื้นที่ ลองนึกถึงเราเตอร์ - ข้อมูลมักจะถูกส่งไปที่มัน แต่ไม่ค่อยได้กำหนดไว้สำหรับเราเตอร์ ข้อมูลจะถูกส่งต่อไปยังเป้าหมาย เว้นแต่คุณจะใช้เส้นทาง NATing หรืออย่างอื่นในระบบของคุณที่ต้องมีการส่งต่อคุณจะไม่ใช้ห่วงโซ่นี้ด้วยซ้ำ
มีวิธีหนึ่งที่แน่นอนในการตรวจสอบว่าระบบของคุณใช้ / ต้องการโซ่ส่งต่อหรือไม่
iptables -L -v
ภาพหน้าจอด้านบนเป็นของเซิร์ฟเวอร์ที่ใช้งานมาสองสามสัปดาห์และไม่มีข้อ จำกัด ในการเชื่อมต่อขาเข้าหรือขาออก อย่างที่คุณเห็นสายป้อนได้ประมวลผลแพ็กเก็ต 11GB และสายการส่งออกประมวลผลแล้ว 17GB ในทางกลับกันโซ่ส่งต่อไม่จำเป็นต้องประมวลผลแพ็กเก็ตเดียว เนื่องจากเซิร์ฟเวอร์ไม่ได้ทำการส่งต่อหรือใช้เป็นอุปกรณ์ส่งต่อใด ๆ
เอาต์พุต - โซ่นี้ใช้สำหรับการเชื่อมต่อขาออก ตัวอย่างเช่นหากคุณพยายาม ping howtogeek.com iptables จะตรวจสอบสายการส่งออกเพื่อดูว่ากฎเกี่ยวกับ ping และ howtogeek.com เป็นอย่างไรก่อนที่จะตัดสินใจอนุญาตหรือปฏิเสธการพยายามเชื่อมต่อ
ข้อแม้
แม้ว่าการส่ง Ping ไปยังโฮสต์ภายนอกดูเหมือนจะเป็นสิ่งที่จำเป็นต้องใช้ในการสำรวจสายการส่งออกเท่านั้นโปรดทราบว่าในการส่งคืนข้อมูลจะใช้สายป้อนข้อมูลด้วยเช่นกัน เมื่อใช้ iptables เพื่อล็อกระบบของคุณโปรดจำไว้ว่าโปรโตคอลจำนวนมากจะต้องใช้การสื่อสารสองทางดังนั้นทั้งอินพุทและเอาท์พุตจะต้องได้รับการกำหนดค่าอย่างเหมาะสม SSH เป็นโปรโตคอลทั่วไปที่ผู้คนลืมอนุญาตในทั้งสองเครือข่าย
พฤติกรรมเริ่มต้นของห่วงโซ่นโยบาย
ก่อนที่จะเข้าสู่และกำหนดค่ากฎที่เฉพาะเจาะจงคุณจะต้องตัดสินใจว่าคุณต้องการให้พฤติกรรมเริ่มต้นของทั้งสามกลุ่มเป็นอย่างไร กล่าวอีกนัยหนึ่งคุณต้องการให้ iptables ทำอย่างไรหากการเชื่อมต่อไม่ตรงกับกฎใด ๆ ที่มีอยู่
หากต้องการดูว่าห่วงโซ่นโยบายของคุณได้รับการกำหนดค่าให้ทำอะไรกับการรับส่งข้อมูลที่ไม่ตรงกันให้เรียกใช้iptables -L
คำสั่ง
อย่างที่คุณเห็นเรายังใช้คำสั่ง grep เพื่อให้ผลลัพธ์ที่สะอาดยิ่งขึ้น ในภาพหน้าจอดังกล่าวขณะนี้เครือข่ายของเราคิดว่าสามารถรับการเข้าชมได้
หลายครั้งคุณจะต้องให้ระบบของคุณยอมรับการเชื่อมต่อโดยค่าเริ่มต้น หากคุณไม่เคยเปลี่ยนแปลงกฎของห่วงโซ่นโยบายมาก่อนควรกำหนดค่าการตั้งค่านี้ไว้แล้ว ไม่ว่าจะด้วยวิธีใดนี่คือคำสั่งเพื่อยอมรับการเชื่อมต่อโดยค่าเริ่มต้น:
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
ตามค่าเริ่มต้นของกฎการยอมรับจากนั้นคุณสามารถใช้ iptables เพื่อปฏิเสธที่อยู่ IP หรือหมายเลขพอร์ตที่เฉพาะเจาะจงได้ในขณะที่ยังคงยอมรับการเชื่อมต่ออื่น ๆ เราจะไปถึงคำสั่งเหล่านั้นในไม่กี่นาที
หากคุณต้องการปฏิเสธการเชื่อมต่อทั้งหมดและระบุด้วยตนเองว่าคุณต้องการอนุญาตให้เชื่อมต่อใดคุณควรเปลี่ยนนโยบายเริ่มต้นของเครือข่ายของคุณที่จะลดลง การทำเช่นนี้อาจเป็นประโยชน์สำหรับเซิร์ฟเวอร์ที่มีข้อมูลที่ละเอียดอ่อนและจะมีเพียงที่อยู่ IP เดียวกันเท่านั้นที่เชื่อมต่อกับเซิร์ฟเวอร์
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
การตอบสนองเฉพาะการเชื่อมต่อ
ด้วยการกำหนดค่านโยบายลูกโซ่เริ่มต้นของคุณคุณสามารถเริ่มเพิ่มกฎให้กับ iptables เพื่อให้ทราบว่าต้องทำอย่างไรเมื่อพบการเชื่อมต่อจากหรือไปยังที่อยู่ IP หรือพอร์ตที่เฉพาะเจาะจง ในคู่มือนี้เราจะพูดถึง "คำตอบ" ขั้นพื้นฐานและใช้บ่อยที่สุดสามข้อ
ยอมรับ - อนุญาตการเชื่อมต่อ
วาง - วางการเชื่อมต่อทำเหมือนไม่เคยเกิดขึ้น วิธีนี้ดีที่สุดหากคุณไม่ต้องการให้แหล่งที่มารับรู้ว่าระบบของคุณมีอยู่
ปฏิเสธ - ไม่อนุญาตให้เชื่อมต่อ แต่ส่งข้อผิดพลาดกลับมา วิธีนี้ดีที่สุดหากคุณไม่ต้องการให้แหล่งใดแหล่งหนึ่งเชื่อมต่อกับระบบของคุณ แต่คุณต้องการให้พวกเขารู้ว่าไฟร์วอลล์ของคุณบล็อกพวกเขา
วิธีที่ดีที่สุดในการแสดงความแตกต่างระหว่างกฎทั้งสามนี้คือการแสดงให้เห็นว่ามีลักษณะอย่างไรเมื่อพีซีพยายาม ping เครื่อง Linux ด้วย iptables ที่กำหนดค่าไว้สำหรับการตั้งค่าเหล่านี้แต่ละรายการ
อนุญาตการเชื่อมต่อ:
การลดการเชื่อมต่อ:
การปฏิเสธการเชื่อมต่อ:
การอนุญาตหรือบล็อกการเชื่อมต่อเฉพาะ
เมื่อกำหนดค่าห่วงโซ่นโยบายแล้วคุณสามารถกำหนดค่า iptables เพื่ออนุญาตหรือบล็อกที่อยู่ช่วงที่อยู่และพอร์ตที่เฉพาะเจาะจงได้ ในตัวอย่างเหล่านี้เราจะตั้งค่าการเชื่อมต่อDROP
แต่คุณสามารถเปลี่ยนเป็นACCEPT
หรือREJECT
ขึ้นอยู่กับความต้องการของคุณและวิธีกำหนดค่าโซ่นโยบายของคุณ
หมายเหตุ: ในตัวอย่างเหล่านี้เราจะใช้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 INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
คุณสามารถแทนที่“ ssh” ด้วยโปรโตคอลหรือหมายเลขพอร์ตใดก็ได้ -p tcp
ส่วนหนึ่งของรหัสที่บอก iptables สิ่งที่ชนิดของการเชื่อมต่อการใช้งานโปรโตคอล หากคุณบล็อกโปรโตคอลที่ใช้ UDP แทน TCP ก็-p udp
จำเป็นต้องใช้แทน
ตัวอย่างนี้แสดงวิธีบล็อกการเชื่อมต่อ SSH จากที่อยู่ IP ใด ๆ
iptables -A INPUT -p tcp --dport ssh -j DROP
สถานะการเชื่อมต่อ
ดังที่เราได้กล่าวไว้ก่อนหน้านี้โปรโตคอลจำนวนมากจำเป็นต้องมีการสื่อสารสองทาง ตัวอย่างเช่นหากคุณต้องการอนุญาตการเชื่อมต่อ SSH กับระบบของคุณโซ่อินพุตและเอาต์พุตจะต้องมีการเพิ่มกฎเข้าไป แต่ถ้าคุณต้องการให้ SSH เข้ามาในระบบของคุณเท่านั้นที่จะได้รับอนุญาตล่ะ? การเพิ่มกฎในสายการส่งออกยังอนุญาตให้มีการพยายาม SSH ขาออกหรือไม่
นั่นคือจุดที่สถานะการเชื่อมต่อเข้ามาซึ่งทำให้คุณมีความสามารถในการอนุญาตให้มีการสื่อสารสองทาง แต่อนุญาตให้สร้างการเชื่อมต่อทางเดียวเท่านั้น ดูตัวอย่างนี้ซึ่งอนุญาตให้มีการเชื่อมต่อ SSH จาก 10.10.10.10 แต่ไม่สามารถเชื่อมต่อ SSH ถึง 10.10.10.10 ได้ อย่างไรก็ตามระบบได้รับอนุญาตให้ส่งข้อมูลกลับผ่าน SSH ได้ตราบเท่าที่มีการสร้างเซสชันแล้วซึ่งทำให้การสื่อสาร SSH เป็นไปได้ระหว่างสองโฮสต์นี้
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
กำลังบันทึกการเปลี่ยนแปลง
การเปลี่ยนแปลงที่คุณทำกับกฎ iptables ของคุณจะถูกยกเลิกในครั้งถัดไปที่บริการ iptables เริ่มต้นใหม่เว้นแต่คุณจะดำเนินการคำสั่งเพื่อบันทึกการเปลี่ยนแปลง คำสั่งนี้อาจแตกต่างกันไปขึ้นอยู่กับการแจกจ่ายของคุณ:
Ubuntu:
sudo /sbin/iptables-save
หมวกแดง / CentOS:
/sbin/service iptables save
หรือ
/etc/init.d/iptables save
คำสั่งอื่น ๆ
แสดงรายการกฎ iptables ที่กำหนดค่าไว้ในปัจจุบัน:
iptables -L
การเพิ่ม-v
ตัวเลือกจะให้ข้อมูลแพ็คเก็ตและไบต์และการเพิ่ม-n
จะแสดงรายการทุกอย่างเป็นตัวเลข กล่าวอีกนัยหนึ่ง - ชื่อโฮสต์โปรโตคอลและเครือข่ายแสดงเป็นตัวเลข
หากต้องการล้างกฎที่กำหนดค่าไว้ทั้งหมดคุณสามารถใช้คำสั่ง flush
iptables -F