คู่มือเริ่มต้นสำหรับ 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