ไฟร์วอลล์ที่เชื่อถือได้ถือเป็นหนึ่งในส่วนที่สำคัญที่สุดในการปกป้องระบบปฏิบัติการสมัยใหม่ ลีนุกซ์ส่วนใหญ่มีหลายรุ่น เครื่องมือต่างๆไฟร์วอลล์ คู่มือนี้จัดทำขึ้นสำหรับหนึ่งในคำแนะนำยอดนิยมที่สุด - iptables
ดังนั้น iptables ก็คือ ไฟร์วอลล์มาตรฐานซึ่งรวมอยู่ในค่าเริ่มต้นในลีนุกซ์ส่วนใหญ่ (nftables กำลังได้รับการพัฒนาเพื่อแทนที่) อันที่จริงแล้ว iptables เป็นส่วนต่อประสานผู้ใช้สำหรับจัดการระบบ netfilter ซึ่งจะจัดการสแต็กเครือข่าย Linux ตามลำดับ iptables จะเปรียบเทียบแพ็กเก็ตขาเข้าแต่ละแพ็กเก็ตกับชุดกฎที่กำหนดไว้ แล้วตัดสินใจว่าจะทำอย่างไรกับแพ็กเก็ตนั้นต่อไป
การอภิปรายเกี่ยวกับวิธีการทำงานของ iptables บทความนี้เน้นที่ตัวอย่างเชิงปฏิบัติที่สาธิตวิธีสร้างชุดกฎพื้นฐานสำหรับเซิร์ฟเวอร์ Ubuntu 14.04
คำสั่ง iptables พื้นฐาน
ส่วนนี้ประกอบด้วยคำสั่งพื้นฐานที่คุณสามารถสร้างชุดกฎที่ซับซ้อนและจัดการอินเทอร์เฟซ iptables โดยรวมได้
จดจำ: คำสั่ง iptables ต้องรันด้วยสิทธิ์รูท ซึ่งหมายความว่าคุณต้องดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้:
- เข้าสู่ระบบในฐานะผู้ใช้รูท
- ใช้ su หรือ sudo -i เพื่อขยายรูตเชลล์
- เริ่มคำสั่งทั้งหมดด้วย sudo (วิธีที่แนะนำใน Ubuntu)
ใน คู่มือเล่มนี้ใช้ตัวเลือกสุดท้าย
ดังนั้นก่อนอื่นคุณต้องดูรายการปัจจุบันก่อน กฎ iptables- เมื่อต้องการทำเช่นนี้ ให้ใช้แฟล็ก -L:
sudo iptables -L
อินพุตเชน (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
เอาท์พุทเชน (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
ดังที่คุณเห็น รายการประกอบด้วยเครือข่ายเริ่มต้นสามรายการ (INPUT, OUTPUT และ FORWARD) ซึ่งแต่ละเครือข่ายมีการตั้งค่านโยบายเริ่มต้น (ปัจจุบันยอมรับ) คุณยังสามารถดูชื่อคอลัมน์ได้ แต่รายการนี้ไม่รวมกฎต่างๆ เนื่องจาก Ubuntu ไม่มีชุดกฎเริ่มต้นมาให้
เมื่อใช้แฟล็ก -S รายการนี้สามารถดูได้ในรูปแบบอื่นที่สะท้อนถึงคำสั่งที่จำเป็นในการเปิดใช้งานกฎและนโยบาย:
sudo iptables -S
-P ยอมรับอินพุต
-P ยอมรับไปข้างหน้า
-P เอาท์พุทยอมรับ
หากต้องการจำลองการกำหนดค่า คุณเพียงพิมพ์ sudo iptables ที่จุดเริ่มต้นของแต่ละบรรทัดผลลัพธ์ (ขึ้นอยู่กับการกำหนดค่าของคุณ ขั้นตอนนี้อาจซับซ้อนกว่าเล็กน้อยเมื่อเชื่อมต่อจากระยะไกล หากยังไม่ได้ตั้งค่ากฎที่อนุญาตการเชื่อมต่อปัจจุบัน คุณไม่ควรตั้งค่านโยบาย DROP)
หากต้องการรีเซ็ตกฎปัจจุบัน (ถ้ามี) ให้พิมพ์:
sudo iptables -F
อีกครั้งบน ในขั้นตอนนี้นโยบายเริ่มต้นมีความสำคัญมากเนื่องจากคำสั่งก่อนหน้าจะไม่เปลี่ยนแปลง แม้ว่ากฎทั้งหมดจะถูกลบออกจากกลุ่มก็ตาม
ก่อนที่จะรีเซ็ตกฎสำหรับการเชื่อมต่อระยะไกล คุณต้องตรวจสอบให้แน่ใจว่าได้ตั้งค่านโยบาย ACCEPT ไว้ในห่วงโซ่ INPUT และ OUTPUT ทำเช่นนี้:
sudo iptables -P ยอมรับอินพุต
sudo iptables -P ยอมรับเอาต์พุต
sudo iptables -F
เมื่อคุณสร้างกฎที่อนุญาตการเชื่อมต่อระยะไกลแล้ว คุณสามารถตั้งค่านโยบาย DROP ได้ เรามาเริ่มสร้างกฎกันดีกว่า
การสร้างกฎ iptables
ตามที่กล่าวไว้ข้างต้น บทช่วยสอนนี้มุ่งเน้นไปที่การทำงานกับ INPUT chain เนื่องจากมีหน้าที่รับผิดชอบ การจราจรขาเข้า- ขั้นแรก เราต้องพิจารณากฎที่กล่าวไปแล้ว - กฎที่อนุญาตการเชื่อมต่อ SSH ในปัจจุบัน
ดูเหมือนว่านี้:
sudo iptables -A INPUT -m conntrack --ctstate ก่อตั้งขึ้นที่เกี่ยวข้อง -j ยอมรับ
แน่นอนว่ามันอาจดูซับซ้อนอย่างไม่น่าเชื่อในตอนแรก เพื่อทำความเข้าใจกฎนี้ ให้ทำความคุ้นเคยกับส่วนประกอบต่างๆ:
- -อินพุต: ธง -A เพิ่ม ( ผนวก) กฎจนถึงจุดสิ้นสุดของห่วงโซ่ คำสั่งส่วนนี้บอกให้ iptables เพิ่มกฎที่ส่วนท้ายของห่วงโซ่ INPUT
- -m คอนแทรค: นอกเหนือจากชุดฟังก์ชันพื้นฐานแล้ว iptables ยังมีชุดส่วนขยายหรือโมดูลที่รับผิดชอบความสามารถเพิ่มเติมของไฟร์วอลล์ คำสั่งในส่วนนี้บ่งชี้ว่าผู้ใช้จำเป็นต้องเข้าถึงฟังก์ชันของโมดูล conntrack โมดูลนี้อนุญาตให้คุณใช้คำสั่งที่ตัดสินใจว่าจะทำอย่างไรกับแพ็กเก็ตตามความสัมพันธ์กับการเชื่อมต่อก่อนหน้านี้
- --ctstate: หนึ่งในคำสั่งที่ใช้งานได้เมื่อเรียกใช้โมดูล conntrack คำสั่งนี้ช่วยให้คุณติดตามความสัมพันธ์ของแพ็คเกจกับแพ็คเกจอื่นที่เคยดูไปแล้ว ตั้งค่าเป็น ESTABLISHED (ซึ่งยอมรับแพ็กเก็ตที่เป็นส่วนหนึ่งของการเชื่อมต่อที่มีอยู่) และ RELATED (ยอมรับแพ็กเก็ตที่เกี่ยวข้องกับการเชื่อมต่อที่สร้างไว้แล้ว) นี่เป็นส่วนหนึ่งของกฎที่รับผิดชอบเซสชัน SSH ปัจจุบัน
- — เจยอมรับ: ระบุการดำเนินการ (เป้าหมาย) ที่จะดำเนินการบนแพ็กเก็ตที่ตรงกับกฎ ในกรณีนี้ iptables จะยอมรับแพ็กเก็ตที่ตรงตามเกณฑ์ก่อนหน้า
ต้องวางกฎนี้ไว้ที่จุดเริ่มต้นเพื่อให้แน่ใจว่าการเชื่อมต่อที่มีอยู่ตรงกับกฎ ได้รับการยอมรับ และออกจากห่วงโซ่โดยไม่บรรลุกฎ DROP
โดยการขอรายการกฎ คุณจะเห็นการเปลี่ยนแปลง:
sudo iptables -L
อินพุตเชน (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
ยอมรับทั้งหมด - ทุกที่ ctstate ที่เกี่ยวข้องและก่อตั้งขึ้น
ห่วงโซ่ไปข้างหน้า (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
เอาท์พุทเชน (ยอมรับนโยบาย)
เป้าหมาย prot เลือกปลายทางต้นทาง
เมื่อคุณคุ้นเคยกับไวยากรณ์พื้นฐานแล้ว ให้สร้างกฎเพิ่มเติมสองสามข้อที่ยอมรับการเชื่อมต่อ
การยอมรับการเชื่อมต่อที่สำคัญอื่นๆ
ก่อนหน้านี้ iptables ได้รับคำสั่งไม่ให้รีเซ็ตทุกอย่าง การเชื่อมต่อปัจจุบันรวมทั้งยอมรับการเชื่อมต่อทั้งหมดที่เกี่ยวข้องกับพวกเขา ตอนนี้คุณต้องสร้างกฎที่ยอมรับการเชื่อมต่อที่ไม่ตรงตามเกณฑ์ข้างต้น
เปิดสองพอร์ตทิ้งไว้: พอร์ตเอสเอสเอช(คู่มือนี้ใช้พอร์ตเริ่มต้น 22; ถ้า มูลค่าที่กำหนดมีการเปลี่ยนแปลงแล้ว อย่าลืมใส่ค่าใหม่) ยิ่งกว่านั้นให้เราสันนิษฐานว่า คอมพิวเตอร์เครื่องนี้เว็บเซิร์ฟเวอร์ทำงานบนพอร์ต 80 ตามค่าเริ่มต้น (อย่าเพิ่มกฎนี้หากไม่เป็นเช่นนั้น)
ดังนั้น บรรทัดที่คุณต้องใช้เพื่อสร้างกฎดังกล่าวจะมีลักษณะดังนี้:
sudo iptables -A INPUT -p tcp --dport 22 -j ยอมรับ
sudo iptables -A INPUT -p tcp --dport 80 -j ยอมรับ
อย่างที่คุณเห็น พวกมันคล้ายกับกฎข้อแรกมาก บางทีพวกมันอาจมีโครงสร้างที่เรียบง่ายกว่านั้นอีก ตัวเลือกใหม่:
- — พีทีพีพี: ตัวเลือกนี้อนุญาตให้แพ็กเก็ตที่ใช้ TCP (โปรโตคอลแบบสตรีมที่ใช้โดยแอปพลิเคชันส่วนใหญ่เนื่องจากมีการสื่อสารที่เชื่อถือได้) เพื่อส่งผ่าน
- — พอร์ต: ตัวเลือกนี้ใช้งานได้เมื่อใช้แฟล็ก -p tcp โดยจะระบุพอร์ตขาเข้าที่พอร์ตของแพ็กเก็ตควรตรงกัน กฎข้อแรกข้ามไป แพ็กเก็ต TCPตรงไปที่พอร์ต 22 และกฎข้อที่สองยอมรับการรับส่งข้อมูล TCP ไปที่พอร์ต 80
ตอนนี้เราจำเป็นต้องสร้างกฎ ACCEPT อื่นเพื่อให้แน่ใจว่าเซิร์ฟเวอร์ทำงานตามที่คาดไว้ โดยทั่วไปแล้ว บริการจะสื่อสารโดยการแลกเปลี่ยนแพ็กเก็ต ในการดำเนินการนี้ พวกเขาใช้อินเทอร์เฟซหลอกเครือข่าย - อุปกรณ์ที่เรียกว่าลูปแบ็ค ซึ่งนำการรับส่งข้อมูลกลับไปยังแหล่งที่มา ไม่ใช่ไปยังคอมพิวเตอร์เครื่องอื่น
นั่นคือหากบริการ 1 จำเป็นต้องสร้างการสื่อสารกับบริการ 2 ที่รับฟังการเชื่อมต่อบนพอร์ต 4555 บริการ 1 จะส่งแพ็กเก็ตไปยังพอร์ต 4555 โดยใช้อุปกรณ์ย้อนกลับ พฤติกรรมนี้จะต้องได้รับอนุญาตเพราะมันเป็น เงื่อนไขที่สำคัญการทำงานที่ถูกต้องของหลาย ๆ โปรแกรม
เมื่อต้องการทำเช่นนี้ เพิ่มกฎต่อไปนี้:
sudo iptables -I อินพุต 1 -i lo -j ยอมรับ
มันแตกต่างจากกฎก่อนหน้านี้เล็กน้อย ลองดูให้ละเอียดยิ่งขึ้น:
- — ฉันอินพุต 1: แฟล็ก -I บอกให้ iptables แทรกกฎ แฟล็กนี้แตกต่างจากแฟล็ก -A (ซึ่งเพียงเพิ่มกฎที่ส่วนท้ายของเชน) โดยระบุห่วงโซ่ที่ควรเพิ่มกฎและตำแหน่งของกฎในนั้น ในกรณีนี้ จำเป็นต้องแทรกกฎที่จุดเริ่มต้นของห่วงโซ่ INPUT ซึ่งส่งผลให้กฎทั้งหมดจะย้ายหนึ่งตำแหน่ง ควรวางกฎนี้ไว้ที่จุดเริ่มต้นของห่วงโซ่ เนื่องจากเป็นหนึ่งในกฎหลักและไม่ควรขึ้นอยู่กับกฎอื่นๆ
- — ฉันแท้จริง: องค์ประกอบกฎนี้อนุญาตแพ็กเก็ตที่ใช้อินเทอร์เฟซ lo (“lo” เป็นอีกชื่อหนึ่งสำหรับอุปกรณ์ลูปแบ็ค) ซึ่งหมายความว่าแพ็คเกจใดๆ ที่ใช้ อินเทอร์เฟซนี้จะต้องได้รับการยอมรับ
หากต้องการดูกฎปัจจุบัน ให้ใช้แฟล็ก -S เนื่องจากแฟล็ก -L จะไม่แสดงข้อมูลบางอย่าง (เช่น อินเทอร์เฟซที่เชื่อมโยงกับกฎ ซึ่งมีความสำคัญมากในกรณีของกฎข้อสุดท้าย):
sudo iptables -S
-P ยอมรับอินพุต
-P ยอมรับไปข้างหน้า
-P เอาท์พุทยอมรับ
-A อินพุต -i lo -j ยอมรับ
-A INPUT -m conntrack --ctstate ที่เกี่ยวข้อง ก่อตั้งแล้ว -j ยอมรับ
-A อินพุต -p tcp -m tcp --dport 22 -j ยอมรับ
-A อินพุต -p tcp -m tcp --dport 80 -j ยอมรับ
การสร้างกฎ DROP
ในขณะนี้มีการสร้างกฎ 4 ข้อที่ยอมรับแพ็กเก็ตตามเกณฑ์ที่กำหนด อย่างไรก็ตาม ขณะนี้เซิร์ฟเวอร์ไม่ได้บล็อกแพ็กเก็ตอื่นใดอยู่แล้ว
หากแพ็กเก็ตผ่านห่วงโซ่อินพุตและไม่ตรงกับกฎใด ๆ ในสี่กฎ นโยบายเริ่มต้น (ACCEPT) จะถูกดำเนินการ ซึ่งจะยอมรับแพ็กเก็ตไม่ทางใดก็ทางหนึ่ง ตอนนี้มันจำเป็นต้องเปลี่ยน
ซึ่งสามารถทำได้สองวิธีซึ่งมีความแตกต่างกันค่อนข้างมาก
วิธีแรกคือการแก้ไขนโยบายเริ่มต้นของห่วงโซ่อินพุต ให้ทำประเภทนี้:
sudo iptables -P อินพุตลดลง
นโยบายนี้จะตรวจสอบและวางแพ็กเก็ตทั้งหมดที่ไม่ตรงกับกฎลูกโซ่ INPUT ใดๆ ผลที่ตามมาประการหนึ่งของการออกแบบประเภทนี้คือมันจะทิ้งแพ็กเก็ตแม้ว่าจะรีเซ็ตกฎแล้วก็ตาม
แน่นอนว่านี่เป็นการเพิ่มระดับความปลอดภัยของเซิร์ฟเวอร์ อย่างไรก็ตาม สิ่งนี้อาจส่งผลร้ายแรงหากผู้ใช้ไม่มีวิธีอื่นในการเชื่อมต่อกับเซิร์ฟเวอร์ ผู้ให้บริการโฮสติ้งส่วนใหญ่มักจัดเตรียมเว็บคอนโซลเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ในกรณีที่เกิดปัญหาดังกล่าว คอนโซลนี้ทำงานเป็นคอนโซลเสมือน การเชื่อมต่อท้องถิ่นดังนั้น iptables จะไม่ตอบสนอง
คุณสามารถให้เซิร์ฟเวอร์รีเซ็ตการเชื่อมต่อโดยอัตโนมัติได้หากกฎถูกลบ สิ่งนี้จะทำให้เซิร์ฟเวอร์มีความปลอดภัยและเข้าถึงได้ยากยิ่งขึ้น นอกจากนี้ยังหมายความว่าคุณสามารถแทรกกฎที่ส่วนท้ายของห่วงโซ่ได้ และแพ็กเก็ตที่ไม่ต้องการทั้งหมดจะถูกทิ้ง
อีกวิธีหนึ่งคือการเพิ่มกฎที่ส่วนท้ายของห่วงโซ่ที่จะละทิ้งแพ็กเก็ตที่ไม่ตรงกันทั้งหมด ในขณะที่ยังคงนโยบายการยอมรับไว้
หากต้องการส่งคืนนโยบาย ACCEPT ไปยัง INPUT chain ให้พิมพ์:
sudo iptables -P ยอมรับอินพุต
ตอนนี้คุณสามารถเพิ่มกฎที่ส่วนท้ายของห่วงโซ่ที่จะปล่อยแพ็กเก็ตที่ไม่ตรงกันทั้งหมด:
sudo iptables -A อินพุต -j DROP
ภายใต้สภาวะการทำงานปกติ ผลลัพธ์จะเหมือนกับการใช้นโยบาย DROP ทุกประการ กฎนี้จะทิ้งทุกแพ็กเก็ตที่มาถึง เพื่อป้องกันไม่ให้แพ็กเก็ตที่ไม่ตรงกับกฎเข้าถึงเซิร์ฟเวอร์
โดยพื้นฐานแล้ว วิธีที่สองจะใช้เมื่อจำเป็นเพื่อรักษานโยบาย ACCEPT ที่ยอมรับการรับส่งข้อมูล กล่าวคือ แม้ว่ากฎทั้งหมดจะถูกรีเซ็ต แต่ผู้ใช้ยังคงสามารถเข้าถึงเครื่องบนเครือข่ายได้ วิธีการนี้ช่วยให้คุณสามารถดำเนินการตามค่าเริ่มต้นได้โดยไม่ต้องเปลี่ยนนโยบายที่จะใช้กับห่วงโซ่ที่ว่างเปล่า
แน่นอนว่านี่ก็หมายความว่ากฎใดๆ ที่จำเป็นต้องเพิ่มที่ส่วนท้ายของห่วงโซ่จะต้องมาก่อนกฎการรีเซ็ต ซึ่งสามารถทำได้โดยการลบกฎการรีเซ็ตชั่วคราว:
sudo iptables -D อินพุต -j DROP
sudo iptables -A อินพุต new_rule
sudo iptables -A อินพุต -j DROP
หรือโดยการแทรกกฎใหม่ที่ส่วนท้ายของห่วงโซ่ (แต่ก่อนกฎการรีเซ็ต) โดยระบุหมายเลขบรรทัด หากต้องการป้อนกฎในบรรทัด 4 ให้พิมพ์:
sudo iptables -I อินพุต 4 new_rule
หากมีกฎหลายข้อ การคำนวณหมายเลขบรรทัดด้วยตนเองค่อนข้างเป็นปัญหา ในกรณีนี้ iptables สามารถกำหนดหมายเลขบรรทัดได้:
sudo iptables -L --line-numbers
อินพุตเชน (นโยบาย DROP)
1 ยอมรับทั้งหมด -- ทุกที่ ทุกเวลา
2 ยอมรับทั้งหมด -- ทุกที่ ctstate ที่เกี่ยวข้อง ก่อตั้งขึ้น
3 ยอมรับ tcp -- ทุกที่ tcp dpt:ssh
4 ยอมรับ tcp -- ทุกที่ tcp dpt:http
ห่วงโซ่ไปข้างหน้า (ยอมรับนโยบาย)
num เป้าหมาย prot เลือกปลายทางต้นทาง
เอาท์พุทเชน (ยอมรับนโยบาย)
num เป้าหมาย prot เลือกปลายทางต้นทาง
วิธีนี้ช่วยให้คุณตรวจสอบได้ว่ามีการป้อนกฎในบรรทัดที่ถูกต้อง
กำลังบันทึกการตั้งค่า iptables
ตามค่าเริ่มต้น กฎที่ยังไม่ได้บันทึกทั้งหมดจะยังคงมีผลจนกว่าเซิร์ฟเวอร์จะรีบูตครั้งถัดไป ทันทีหลังจากรีบูต กฎที่ไม่ได้บันทึกไว้จะสูญหายไป
ในบางกรณี สิ่งนี้มีประโยชน์เนื่องจากช่วยให้ผู้ใช้ที่บล็อกตัวเองโดยไม่ตั้งใจสามารถเข้าถึงเซิร์ฟเวอร์ได้ อย่างไรก็ตาม ในกรณีส่วนใหญ่ จะยังสะดวกกว่าในการบันทึกกฎและโหลดกฎเหล่านั้นเมื่อเซิร์ฟเวอร์เริ่มทำงาน
ซึ่งสามารถทำได้หลายวิธี วิธีที่ง่ายที่สุดคือการใช้แพ็คเกจ iptables-persistent ซึ่งสามารถดาวน์โหลดได้จากที่เก็บเริ่มต้นของ Ubuntu:
อัปเดต sudo apt-get
sudo apt-get ติดตั้ง iptables ถาวร
ระหว่างการติดตั้ง แพ็คเกจจะชี้แจงว่าจำเป็นต้องบันทึกกฎปัจจุบันเพื่อใช้ในอนาคตหรือไม่ ดาวน์โหลดอัตโนมัติ- หากกฎปัจจุบันได้รับการทดสอบ (อนุญาตการเชื่อมต่อ SSH) และตรงตามข้อกำหนดทั้งหมด กฎเหล่านั้นก็สามารถถูกบันทึกไว้ได้
เมื่อการติดตั้งเสร็จสมบูรณ์ บริการใหม่ที่เรียกว่า iptables-persistent จะปรากฏขึ้น ซึ่งจะเริ่มเมื่อเซิร์ฟเวอร์รีบูตและดำเนินการกฎที่ติดตั้งต่อ
ผลลัพธ์
คู่มือนี้ช่วยคุณกำหนดค่าไฟร์วอลล์ตามความต้องการของผู้ใช้ แน่นอนว่ายังมียูทิลิตี้ที่คล้ายกันอีกมากมาย และบางอันก็อาจใช้งานง่ายกว่า ถึงกระนั้น iptables ก็เป็นหนึ่งในเครื่องมือที่ดีที่สุด หากเพียงเพราะมันสาธิตโครงสร้าง netfilter พื้นฐานบางส่วนและรวมอยู่ในหลายระบบ
แท็ก: ,ในบทความนี้เราจะบอกวิธีกำหนดค่า iptables บน Linux คุณจะได้เรียนรู้ว่ามันคืออะไร และทำไมคุณต้องกำหนดค่าฟังก์ชันนี้ การตั้งค่า iptables บน Linuxค่อนข้างง่าย
การตั้งค่า iptables บน Linux: iptables คืออะไร?
Iptables เป็นยูทิลิตี้ไฟร์วอลล์บรรทัดคำสั่งที่ใช้นโยบายลูกโซ่เพื่ออนุญาตหรือบล็อกการรับส่งข้อมูล เมื่อการเชื่อมต่อพยายามสร้างตัวเองบนระบบของคุณ iptables จะค้นหากฎในรายการเพื่อให้ตรงกัน หากไม่พบ ระบบจะหันไปใช้การดำเนินการเริ่มต้น
Iptables มักจะติดตั้งไว้ล่วงหน้าบน Linux ทุกรุ่น หากต้องการอัปเดต/ติดตั้ง เพียงดาวน์โหลดแพ็คเกจ iptables:
sudo apt-get ติดตั้ง iptables
มี GUI ทางเลือกอื่นนอกเหนือจาก iptables เช่น Firestarter แต่ iptables นั้นไม่ได้ซับซ้อนขนาดนั้นหากคุณเรียกใช้คำสั่งเพียงไม่กี่คำสั่ง โปรดใช้ความระมัดระวังอย่างยิ่งเมื่อตั้งค่ากฎ iptables โดยเฉพาะอย่างยิ่งหากคุณใช้ SSH บนเซิร์ฟเวอร์ เนื่องจากคำสั่งที่ไม่ถูกต้องอาจทำให้คุณถูกล็อคเป็นเวลานานจนกว่าจะมีการคอมมิตกับเครื่องจริงด้วยตนเอง
การตั้งค่า iptables บน Linux สำหรับหุ่นจำลอง
ยังไงก็ตามเราเคยคุยกันเรื่องนี้มาก่อนแล้ว บางทีนี่อาจจะน่าสนใจสำหรับคุณเช่นกัน ลิงค์สามารถพบได้ด้านบน
การตั้งค่า iptables บน Linux ดังที่เราได้กล่าวไว้ข้างต้นนั้นค่อนข้างง่าย แต่ก่อนที่คุณจะเริ่มตั้งค่า คุณต้องทำความคุ้นเคยกับแนวคิดทั่วไปของตัวเลือกนี้เสียก่อน
ประเภทของวงจร
Iptables ใช้วงจรที่แตกต่างกันสามวงจร: อินพุต ส่งต่อ และเอาต์พุต
ป้อนข้อมูล- ห่วงโซ่นี้ใช้เพื่อควบคุมพฤติกรรมของการเชื่อมต่อขาเข้า ตัวอย่างเช่น หากผู้ใช้พยายาม SSH ไปยังคอมพิวเตอร์/เซิร์ฟเวอร์ของคุณ iptables จะพยายามจับคู่ที่อยู่ IP และพอร์ตกับกฎในห่วงโซ่อินพุต
ซึ่งไปข้างหน้า- สายโซ่นี้ใช้สำหรับการเชื่อมต่อขาเข้าที่ไม่ได้จัดส่งภายในเครื่องจริง ลองนึกถึงเราเตอร์ - ข้อมูลจะถูกส่งไปยังเราเตอร์เสมอ แต่ไม่ค่อยถูกกำหนดไว้สำหรับเราเตอร์เอง ข้อมูลจะถูกเปลี่ยนเส้นทางไปยังหน้า Landing Page เว้นแต่ว่าคุณกำลังกำหนดเส้นทาง, NAT หรือสิ่งอื่นใดบนระบบของคุณที่ต้องมีการส่งต่อ คุณจะไม่ใช้ห่วงโซ่นี้ด้วยซ้ำ
มีอันหนึ่ง วิธีที่เชื่อถือได้ตรวจสอบว่าระบบของคุณใช้หรือต้องการระบบส่งต่อหรือไม่
ภาพหน้าจอนี้เป็นของเซิร์ฟเวอร์ที่ทำงานเป็นเวลาหลายสัปดาห์ และไม่มีข้อจำกัดในการเชื่อมต่อขาเข้าหรือขาออก อย่างที่คุณเห็น ห่วงโซ่อินพุตประมวลผลแพ็กเก็ต 11 GB และห่วงโซ่เอาต์พุตประมวลผล 17 GB ในทางกลับกัน การส่งต่อไม่จำเป็นต้องประมวลผลแพ็กเก็ตเดียว เนื่องจากเซิร์ฟเวอร์ไม่ได้ทำการส่งต่อใดๆ หรือไม่ได้ใช้เป็นอุปกรณ์จากต้นทางถึงปลายทาง
เอาท์พุต - เชนนี้ใช้สำหรับการเชื่อมต่อขาออก ตัวอย่างเช่น หากคุณพยายาม ping ไปยังไซต์ linuxinsider iptables จะตรวจสอบห่วงโซ่เอาต์พุตเพื่อดูว่ากฎใดบ้างที่ใช้กับ ping และ linuxinsider ก่อนที่จะตัดสินใจว่าจะอนุญาตหรือปฏิเสธความพยายามในการเชื่อมต่อ
คำเตือน
แม้ว่าการตรวจสอบโฮสต์ภายนอกจะดูเหมือนเป็นสิ่งที่จะต้องผ่านห่วงโซ่เอาท์พุตเท่านั้น โปรดจำไว้ว่าห่วงโซ่อินพุตจะถูกใช้เพื่อส่งคืนข้อมูลด้วย เมื่อใช้ iptables เพื่อล็อคระบบของคุณ โปรดจำไว้ว่าโปรโตคอลจำนวนมากจำเป็นต้องมีการสื่อสารสองทาง ดังนั้นทั้งห่วงโซ่อินพุตและเอาต์พุตจะต้องได้รับการกำหนดค่าอย่างถูกต้อง SSH เป็นโปรโตคอลทั่วไปที่ผู้คนลืมเปิดใช้งานบนทั้งสองเชน
พฤติกรรมนโยบายเริ่มต้น
ก่อนที่คุณจะเริ่มกำหนดค่ากฎเฉพาะ คุณต้องตัดสินใจว่าคุณต้องการให้พฤติกรรมเริ่มต้นของเชนทั้งสามนี้เป็นอย่างไร กล่าวอีกนัยหนึ่ง คุณต้องการให้ iptables ทำอย่างไรหากการเชื่อมต่อไม่ตรงกับกฎที่มีอยู่
หากต้องการดูว่ากลุ่มนโยบายใดได้รับการกำหนดค่าให้จัดการการรับส่งข้อมูลที่ไม่ตรงกัน ให้รันคำสั่ง iptables -L
อย่างที่คุณเห็น เรายังใช้คำสั่ง grep เพื่อให้ได้ผลลัพธ์ที่สะอาดยิ่งขึ้น ในภาพหน้าจอนี้ เครือข่ายของเราได้รับการกำหนดค่าให้ยอมรับการรับส่งข้อมูล
หลายครั้ง คุณต้องการให้ระบบของคุณยอมรับการเชื่อมต่อตามค่าเริ่มต้น การตั้งค่านี้ควรได้รับการกำหนดค่าแล้ว เว้นแต่คุณจะเปลี่ยนกฎห่วงโซ่นโยบายไปก่อนหน้านี้ ไม่ว่าในกรณีใด นี่คือคำสั่งให้ยอมรับการเชื่อมต่อเริ่มต้น:
iptables -- ยอมรับอินพุตนโยบาย
iptables --นโยบายเอาท์พุทยอมรับ
iptables - ยอมรับนโยบายไปข้างหน้า
ตามค่าเริ่มต้น ในกฎการยอมรับ คุณสามารถใช้ iptables เพื่อปฏิเสธที่อยู่ IP หรือหมายเลขพอร์ตเฉพาะ ในขณะที่ยังคงยอมรับการเชื่อมต่ออื่นๆ ทั้งหมดต่อไป เราจะไปถึงคำสั่งเหล่านั้นในอีกสักครู่
หากคุณต้องการปฏิเสธการเชื่อมต่อทั้งหมด และระบุการเชื่อมต่อที่คุณต้องการอนุญาตให้เชื่อมต่อด้วยตนเอง คุณต้องเปลี่ยนนโยบายเริ่มต้นของวงจรของคุณที่จะปฏิเสธ สิ่งนี้อาจมีประโยชน์สำหรับเซิร์ฟเวอร์ที่มีข้อมูลที่ละเอียดอ่อนเท่านั้น และจะเชื่อมต่อกับที่อยู่ IP เดียวกันเท่านั้น
iptables -- นโยบาย INPUT DROP
iptables --นโยบายเอาต์พุตลดลง
iptables --นโยบายส่งต่อ DROP
การตอบสนองการเชื่อมต่อ
ด้วยการกำหนดค่านโยบายการผูกมัดเริ่มต้น คุณสามารถเริ่มเพิ่มกฎลงใน iptables เพื่อให้รู้ว่าต้องทำอย่างไรเมื่อพบการเชื่อมต่อกับที่อยู่ IP หรือพอร์ตเฉพาะ ในคู่มือนี้ เราจะดู "คำตอบ" ที่พบบ่อยที่สุดและใช้บ่อยสามข้อ
ยอมรับ- อนุญาตการเชื่อมต่อ
หยด- ยกเลิกการเชื่อมต่อ ทำราวกับว่ามันไม่เคยเกิดขึ้น วิธีนี้จะดีที่สุดหากคุณไม่ต้องการให้แหล่งที่มาทราบว่าระบบของคุณมีอยู่
ปฏิเสธ— ปฏิเสธการเชื่อมต่อ แต่ส่งข้อความแสดงข้อผิดพลาด วิธีนี้จะดีที่สุดถ้าคุณไม่ต้องการให้แหล่งข้อมูลเฉพาะเชื่อมต่อกับระบบของคุณ แต่คุณต้องการให้พวกเขารู้ว่าไฟร์วอลล์ของคุณบล็อกพวกเขาไว้
วิธีที่ดีที่สุดในการแสดงความแตกต่างระหว่างกฎทั้งสามข้อนี้คือการแสดงลักษณะที่ปรากฏเมื่อพีซีพยายามส่ง Ping เครื่อง Linux ด้วยการกำหนดค่า iptables สำหรับแต่ละตัวเลือกเหล่านี้
การอนุญาตการเชื่อมต่อ:
การลบการเชื่อมต่อ:
การปฏิเสธการเชื่อมต่อ:
เน็ตมาสก์หรือลักษณะเฉพาะเพื่อระบุช่วงของที่อยู่ IP
การตั้งค่า iptables บน Linux: วิธีการเชื่อมต่อ
หากเราพูดถึงหัวข้อ "การตั้งค่า iptables บน Linux" เราต้องพูดถึงวิธีการเชื่อมต่อ
อนุญาตหรือบล็อกการเชื่อมต่อเฉพาะ
ด้วยนโยบายที่กำหนดค่าไว้ คุณสามารถกำหนดค่า iptables เพื่ออนุญาตหรือบล็อกที่อยู่ ช่วงที่อยู่ และพอร์ตเฉพาะได้ ในตัวอย่างนี้ เราจะตั้งค่าการเชื่อมต่อเป็น DROP แต่คุณสามารถเปลี่ยนการเชื่อมต่อเป็นยอมรับหรือปฏิเสธได้ ขึ้นอยู่กับความต้องการของคุณและวิธีกำหนดค่ากลุ่มนโยบายของคุณ
บันทึก. ในตัวอย่างเหล่านี้ เราจะใช้ iptables -A เพื่อเพิ่มกฎให้กับเชนที่มีอยู่ Iptables เริ่มต้นที่ด้านบนสุดของรายการและผ่านแต่ละกฎจนกว่าจะพบกฎที่ตรงกัน หากคุณต้องการแทรกกฎไว้เหนือกฎอื่น คุณสามารถใช้ iptables -I เพื่อระบุหมายเลขที่ควรอยู่ในรายการได้
การเชื่อมต่อจากที่อยู่ IP เดียวกัน
ตัวอย่างนี้แสดงวิธีการบล็อกการเชื่อมต่อทั้งหมดจากที่อยู่ IP 10.10.10.10..
iptables -A อินพุต -s 10.10.10.10 -j DROP
การเชื่อมต่อจากช่วงของที่อยู่ IP
ตัวอย่างนี้แสดงวิธีการบล็อกที่อยู่ IP ทั้งหมดในช่วงเครือข่าย 10.10.10.0/24 คุณสามารถใช้เน็ตมาสก์หรือเครื่องหมายทับมาตรฐานเพื่อระบุช่วงของที่อยู่ IP
iptables -A อินพุต -s 10.10.10.0/24 -j DROP
iptables -A อินพุต -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 ของโค้ดจะบอก iptable ว่าการเชื่อมต่อใช้โปรโตคอลใด หากคุณกำลังบล็อกโปรโตคอลที่ใช้ 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 รัฐ -- รัฐใหม่ ก่อตั้งแล้ว -j ยอมรับ
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state - สถานะที่จัดตั้งขึ้น -j ยอมรับ
กำลังบันทึกการเปลี่ยนแปลง
การเปลี่ยนแปลงที่คุณทำกับกฎ iptables จะถูกยกเลิกในครั้งถัดไปที่เริ่มบริการ iptables ใหม่ เว้นแต่คุณจะออกคำสั่งให้บันทึกการเปลี่ยนแปลง คำสั่งนี้อาจแตกต่างกันไปขึ้นอยู่กับการแจกจ่ายของคุณ:
sudo /sbin/iptables-save.sudo
หมวกแดง/CentOS:
/sbin/service iptables บันทึก
/etc/init.d/iptables บันทึก
คำสั่งอื่นๆ
รายการกฎ iptables ที่กำหนดค่าไว้ในปัจจุบัน:
การเพิ่มตัวเลือก -v จะให้ข้อมูลแพ็กเก็ตและไบต์แก่คุณ ส่วนการเพิ่ม -n จะประกอบด้วยค่าตัวเลขทั้งหมด กล่าวอีกนัยหนึ่ง ชื่อโฮสต์ โปรโตคอล และเครือข่ายจะแสดงเป็นตัวเลข
หากต้องการล้างกฎที่กำหนดค่าไว้ในปัจจุบันทั้งหมด คุณสามารถเรียกใช้คำสั่งฟลัชได้
การแปลจากแหล่งข้อมูลภาษาอังกฤษที่ดีเยี่ยม ฮาวทูกีค.
หากคุณยังคงมีคำถามในหัวข้อ “การตั้งค่า iptables บน Linux สำหรับหุ่นจำลอง” คุณสามารถเขียนคำถามเหล่านั้นลงในแบบฟอร์มความคิดเห็นบนเว็บไซต์ของเรา
หากคุณพบข้อผิดพลาด โปรดเน้นข้อความและคลิก Ctrl+ป้อน.
IPTables เป็นยูทิลิตี้ที่ใช้จัดการไฟร์วอลล์ใน Linux มันเป็นเครื่องมือที่ทรงพลังและสะดวกสบายสำหรับการเชื่อมต่อและการเชื่อมต่อที่ไม่ต้องการ กระบวนการทั้งหมดอยู่ในกฎ iptables ซึ่งสามารถแก้ไขและดูได้ ข้อมูลรายละเอียดเพิ่มเติมมีอยู่ในบทความ
ประวัติความเป็นมาของการทรงสร้าง
ถึง IPTables ใน ระบบลินุกซ์ใช้ไฟร์วอลล์ IPFW ยืมมาจาก BSD จากนั้นด้วยเคอร์เนล Linux เวอร์ชัน 2.4 มันเริ่มมาพร้อมกับไฟร์วอลล์ Netfilter และยูทิลิตี้ IPTables สำหรับจัดการมัน ในวิธีการทำงานทุกด้านได้รับการเก็บรักษาไว้และขยายขอบเขตการใช้งานเล็กน้อย
โครงสร้างและการออกแบบ IPTables
กำลังเข้า ไฟร์วอลล์พัสดุต้องผ่านการตรวจสอบหลายครั้ง มันอาจจะเป็นเช่นนั้น เช็คซัมหรือการวิเคราะห์ระดับเคอร์เนลอื่นๆ จากนั้นก็ถึงเวลาที่ต้องผ่านห่วงโซ่ PREROUTING ถัดไปจะถูกตรวจสอบตามการเปลี่ยนเส้นทางไปยังลูกโซ่ถัดไป หากแพ็กเก็ตไม่มีที่อยู่เช่นใน TCP แพ็กเก็ตจะถูกส่งไปยังลูกโซ่ FORWARD ในกรณีที่มีที่อยู่เฉพาะ ห่วงโซ่ INPUT จะติดตาม และจากนั้นไปยัง daemons หรือบริการตามที่ตั้งใจไว้ การตอบสนองจะต้องผ่านหลายเชนด้วย เช่น OUTPUT ลิงค์สุดท้ายในกระบวนการนี้คือห่วงโซ่ POSTROUTING
ตอนนี้เล็กน้อยเกี่ยวกับโซ่ แต่ละคนมีหลายตาราง ชื่อของพวกเขาอาจซ้ำกัน แต่สิ่งนี้จะไม่ส่งผลกระทบต่องาน แต่อย่างใด เนื่องจากไม่ได้เชื่อมโยงถึงกัน
ในทางกลับกัน ตารางก็มีกฎหลายข้อ โดยพื้นฐานแล้ว กฎคือเงื่อนไขบางประการที่ต้องปฏิบัติตามบรรจุภัณฑ์ที่กำลังตรวจสอบ มีการดำเนินการบางอย่างกับแพ็คเกจทั้งนี้ขึ้นอยู่กับผลลัพธ์
ดังนั้นเมื่อผ่านทุกขั้นตอนของเครือข่าย แพ็กเก็ตจะเยี่ยมชมเครือข่ายทั้งหมดตามลำดับ และในแต่ละเครือข่ายจะถูกตรวจสอบว่าสอดคล้องกับเงื่อนไขของกฎบางอย่างหรือไม่ หากผู้ใช้ไม่ได้สร้างตาราง การดำเนินการเริ่มต้นจะดำเนินการโดยทั่วไปคือ ACCEPT ซึ่งช่วยให้คุณสามารถก้าวไปข้างหน้าต่อไปหรือ DROP ซึ่งจะหยุดแพ็กเก็ต
โซ่ที่ตั้งไว้ล่วงหน้ามีอยู่ในประเภทต่อไปนี้:
- กำลังเตรียมการ- การประมวลผลเบื้องต้นของแพ็คเกจขาเข้าทั้งหมด
- ป้อนข้อมูล- ซึ่งรวมถึงแพ็กเก็ตเหล่านั้นที่ส่งโดยตรงไปยังเครื่องคอมพิวเตอร์
- ซึ่งไปข้างหน้า- ใช้สำหรับ "แพ็กเก็ตการขนส่ง" ที่ตามตารางเส้นทาง
- เอาท์พุท- ใช้สำหรับแพ็คเก็ตขาออก
- การโพสต์- ขั้นตอนสุดท้ายในการส่งแพ็กเก็ตขาออกผ่านเครือข่ายทั้งหมด
นอกจากเชนในตัวแล้ว ผู้ใช้สามารถสร้างหรือลบเชนของตนเองได้
ดูและจัดการกฎ IPTables
ตามที่กล่าวไว้ข้างต้น เชนทั้งหมดมีเงื่อนไขบางประการสำหรับแพ็คเกจ ยูทิลิตี้ IPTables ใช้เพื่อดูและจัดการกฎ IPTables กฎแต่ละข้อเป็นบรรทัดที่มีชุดเงื่อนไขสำหรับแพ็กเก็ต ตลอดจนการดำเนินการกับกฎเหล่านั้น ขึ้นอยู่กับผลลัพธ์
รูปแบบคำสั่งมีลักษณะดังนี้: คำสั่ง iptables [-t ชื่อของตารางที่กำลังประมวลผล] เรียกว่า [เกณฑ์] [ดำเนินการ]
สิ่งใดก็ตามที่มีอยู่ในสามารถละเว้นได้ หากนี่คือพารามิเตอร์ที่ระบุตาราง ตัวกรองจะถูกนำมาใช้ หากต้องการใช้ชื่อเฉพาะ คุณต้องเพิ่มสวิตช์ -t คำสั่งที่เรียกช่วยให้คุณสามารถทริกเกอร์การดำเนินการที่จำเป็น เช่น การเพิ่มกฎ IPTables หรือการลบออก “เกณฑ์” ระบุพารามิเตอร์ที่จะใช้ในการเลือก และใน "การกระทำ" มีการกระทำที่ต้องดำเนินการหากตรงตามเงื่อนไข
คำสั่งสำหรับการสร้างและการดูกฎ IPTables
- ผนวก(-A)เมื่อใช้คำสั่ง คุณจะต้องระบุสายโซ่และตารางที่คุณต้องการเพิ่มกฎที่ต้องการ คุณค่าของทีมคือทำสิ่งนี้ในตอนท้ายของรายการ
- ลบ (-D)ตามชื่อที่แนะนำ มันจะลบกฎ ในฐานะพารามิเตอร์ คุณสามารถระบุทั้งชื่อเต็มและหมายเลขที่กำหนดได้
- เปลี่ยนชื่อโซ่ (-E)เปลี่ยนชื่อโซ่ คำสั่งระบุชื่อเก่า ตามด้วยชื่อใหม่
- ฟลัช (-F)การล้างกฎทั้งหมดของตารางอย่างแน่นอน
- แทรก(-I)คำสั่งนี้จะแทรกกฎที่จำเป็นลงในตำแหน่งที่ระบุด้วยหมายเลข
- รายการ(-ล)ดูกฎ Iptables หากไม่มีการระบุตาราง ระบบจะใช้ตัวกรองเริ่มต้น
- นโยบาย (-P)มีการใช้นโยบายเริ่มต้นสำหรับห่วงโซ่ที่ระบุ
- แทนที่ (-R)เปลี่ยนกฎภายใต้ หมายเลขที่ระบุเพื่อสิ่งที่จำเป็น
- ลบเชน (-X)คำสั่งนี้จะลบเชนที่สร้างขึ้นทั้งหมด เฉพาะที่ติดตั้งไว้ล่วงหน้าเท่านั้นที่จะยังคงอยู่
- ศูนย์ (-Z)รีเซ็ตตัวนับของข้อมูลที่ส่งในห่วงโซ่ที่ระบุ
เล็กน้อยเกี่ยวกับพารามิเตอร์การเลือกแพ็คเก็ต
พวกเขาสามารถแบ่งออกเป็นสามประเภท:
- เกณฑ์ทั่วไป- สามารถระบุกฎเกณฑ์ใดก็ได้ ไม่จำเป็นต้องเชื่อมต่อส่วนขยายและโมดูลพิเศษ และไม่ได้ขึ้นอยู่กับโปรโตคอลที่จะใช้
- ไม่ใช่เกณฑ์ทั่วไปจะพร้อมใช้งานเมื่อใช้เกณฑ์ทั่วไป
- ชัดเจน.หากต้องการใช้ประเภทนี้ คุณต้องเชื่อมต่อปลั๊กอินพิเศษสำหรับ netfilter นอกจากนี้ คุณต้องใช้สวิตช์ -m ในคำสั่ง
เราควรพูดถึงพารามิเตอร์ที่พบบ่อยซึ่งใช้ในการวิเคราะห์แพ็กเก็ต:
- โปรโตคอล (-p)บ่งชี้ถึงโปรโตคอล
- แหล่งที่มา (-s)พารามิเตอร์นี้กำหนดที่อยู่ IP ของต้นทางที่แพ็กเก็ตมา สามารถระบุได้หลายวิธี โฮสต์ ที่อยู่ หรือเครือข่ายย่อยทั้งหมด
- จุดหมายปลายทาง (-ง)ที่อยู่ปลายทางแพ็คเกจ เช่นเดียวกับก่อนหน้านี้สามารถอธิบายได้หลายวิธี
- ในอินเทอร์เฟซ (-i)ระบุอินเทอร์เฟซขาเข้าของแพ็กเกจ ส่วนใหญ่ใช้สำหรับ NAT หรือบนระบบที่มีหลายอินเทอร์เฟซ
- อินเทอร์เฟซภายนอก (-o)อินเทอร์เฟซขาออก
ตัวอย่างบางส่วน
หากต้องการดูกฎของ IPTables nat? คุณต้องใช้คำสั่ง - “iptables -L -t nat” ค้นหาสถานะทั่วไปของไฟร์วอลล์ - “iptables -L -n -v” นอกจากนี้ คำสั่งนี้อนุญาตให้คุณดูกฎ IPTables ที่มีอยู่ทั่วทั้งระบบ แทรกกฎในตำแหน่งใดตำแหน่งหนึ่งของตาราง เช่น ระหว่างบรรทัดแรกและบรรทัดที่สอง - “iptables -I INPUT 2 -s 202.54.1.2 -j DROP” จากนั้นดูว่ามีการเพิ่มหรือไม่ - “iptables -L INPUT -n --line-numbers”
หากต้องการบล็อกที่อยู่เฉพาะ เช่น 12.12.12.12 - “iptables -A INPUT -s 12.12.12.12 -j DROP”
ความช่วยเหลือสำหรับ iptables - "man iptables" หากคุณต้องการข้อมูลเกี่ยวกับคำสั่งเฉพาะ ให้ใช้ “iptables -j DROP -h”
สรุปแล้ว
ใช้ คำสั่ง IPTableจะต้องทำด้วยความระมัดระวังเช่น การตั้งค่าไม่ถูกต้อง(โดยไม่รู้ตัว) สามารถนำไปสู่ความล้มเหลวของเครือข่ายหรือความล้มเหลวโดยสิ้นเชิงได้ ดังนั้นจึงควรศึกษาคู่มือและคำแนะนำอย่างละเอียดก่อนการกำหนดค่า ด้วยมือที่มีทักษะ IPTables สามารถเปลี่ยนให้เป็นกองหลังที่เชื่อถือได้ การเชื่อมต่อเครือข่าย. ผู้ดูแลระบบใช้ยูทิลิตี้นี้อย่างจริงจังเพื่อสร้างการเชื่อมต่อที่แยกจากการเข้าถึงที่ไม่ได้รับอนุญาต
สคริปต์เริ่มต้นขนาดเล็ก (กฎ คำถามที่พบบ่อย iptables) สำหรับเดสก์ท็อปหรือเซิร์ฟเวอร์ธรรมดา ในกรณีนี้ ตัวอย่างการทำงานกับพอร์ตของซอฟต์แวร์ตัวใดตัวหนึ่งที่ทำงานบนคอมพิวเตอร์ของคุณ ต้องปฏิบัติตามข้อควรระวังด้านความปลอดภัยบนคอมพิวเตอร์ทุกเครื่อง ตำนานที่ว่า Linux มีความปลอดภัยมากกว่านั้นไม่เป็นความจริง ทุกอย่างขึ้นอยู่กับความซุ่มซ่ามของมือผู้ดูแลระบบ นอกจากนี้ยังมีระบบ Windows ที่ได้รับการปกป้องอย่างดี เช่นเดียวกับระบบ Linux ที่เปิดให้เกือบทุกคน ดังนั้นจึงควรคิดสักนิด การป้องกันเครือข่ายคอมพิวเตอร์. ด้านล่างนี้คือกฎ iptables บางส่วนที่อาจมีประโยชน์ในตอนแรก
ฉันแทนที่ $IPT ด้วย /sbin/iptables โดยเฉพาะ หากมีใครต้องการกฎเพียงข้อเดียว เพื่อไม่ให้เปลี่ยนแปลงอะไรเลย พวกเขาก็แค่คัดลอกและดำเนินการ แน่นอนว่ายังมีกฎอยู่สองสามข้อในตอนนี้ VPN ต่างๆฯลฯ หากต้องการก็เพิ่ม
บรรทัดเหล่านี้สามารถคัดลอกทั้งหมดลงในสคริปต์และดำเนินการได้อย่างง่ายดาย สำหรับกรณีธรรมดาก็เพียงพอแล้ว หากแอปพลิเคชันใดไม่สามารถเข้าถึงเครือข่ายได้ ระบบจะเพิ่มการบันทึกเป็นพิเศษ เพียงเปิด tail -f /var/log/syslog (หรือของคุณหากแตกต่างจาก Ubuntu) และดู! หากคุณมีคำถาม เพิ่มคำถามเหล่านี้ในการสนทนา แล้วเราจะแก้ไขร่วมกัน
ป.ล. นอกเหนือจากกฎเหล่านี้แล้ว ลองนึกถึงสิ่งที่คุณควรทำจากบทความ TCP Optimization
วิธีลบกฎใน Iptables
โพสต์โดย Alexey Ubozhenko
หลายครั้งที่ฉันได้พบกับความจริงที่ว่าแม้แต่คนฉลาดโดยทั่วไปก็ทำผิดพลาดอย่างไม่อาจให้อภัยได้ ตัวอย่างเช่น พวกเขาเปิดพอร์ตที่ฐานข้อมูลทำงานไปยังอินเทอร์เน็ตทั้งหมด
บล็อกเกี่ยวกับการดูแลระบบ บทความเกี่ยวกับ Linux, Windows, พื้นที่เก็บข้อมูล NetApp และการจำลองเสมือน
สิ่งนี้มักเกิดขึ้นกับผู้เริ่มต้น DevOps ที่ต้องเขียนโค้ดมาตลอดชีวิต และตอนนี้ความรับผิดชอบของพวกเขายังรวมถึงการตั้งค่าเซิร์ฟเวอร์ด้วย มีบทเรียนดีๆออนไลน์อยู่ที่ การตั้งค่าพื้นฐานไฟร์วอลล์ใน Linux และ *nix อื่นๆ แต่บ่อยครั้งจะเป็นแผ่นงานบนหน้าจอต่างๆ ดังนั้น ฉันหวังว่าบทช่วยสอนที่กระชับกว่านี้นี้จะเป็นประโยชน์กับใครบางคน
สำคัญ!เป็นเรื่องง่ายมากที่จะทำให้ไฟร์วอลล์เครื่องผิดพลาดจนคุณไม่สามารถเข้าถึงได้อีกต่อไป โดยเฉพาะอย่างยิ่งสำหรับโฮสติ้งคลาวด์ ตัวอย่างเช่น หากใน AWS คุณปิดพอร์ตทั้งหมดตั้งแต่ 1024 ถึง 65536 ด้วยเหตุผลบางประการ เครื่องจะปิดหลังจากรีบูต ทุกอย่างโดยทั่วไปพอร์ต หากคุณโฮสต์อยู่ในคลาวด์ จะเป็นการดีกว่าถ้าตั้งค่าไฟร์วอลล์ผ่านเว็บอินเตอร์เฟสที่โฮสต์เตรียมไว้ให้
หมายเหตุเล็ก ๆ เกี่ยวกับคำศัพท์ ไฟร์วอลล์ที่สร้างไว้ในเคอร์เนล Linux เรียกว่า Netfilter และ iptables เป็นยูทิลิตี้สำหรับจัดการไฟร์วอลล์นี้ หลายคนเข้าใจผิดว่าไฟร์วอลล์เรียกว่า iptables นี่เป็นสิ่งที่ผิด การพูดประมาณว่า “ฉันกรองแพ็กเก็ตโดยใช้ iptables” คุณกำลังแสดงให้คนอื่นเห็นว่าคุณไม่รู้
โดยทั่วไปปัญหาประเภทใดที่สามารถแก้ไขได้โดยใช้ Netfilter:
- อนุญาต/ปฏิเสธการรับส่งข้อมูลขาเข้าไปยังพอร์ตบางพอร์ตโดยใช้โปรโตคอลบางตัว (IPv4/IPv6, TCP/UDP) ด้วย ที่อยู่ที่ระบุ(IP, MAC) หรือเครือข่ายย่อย
- ทุกอย่างเหมือนกันสำหรับการรับส่งข้อมูลขาออก
- ตัวอย่างเช่น คุณสามารถละเว้นแพ็กเก็ต ICMP ทั้งหมดได้โดยสิ้นเชิง
- การตั้งค่า NAT ดูโพสต์เกี่ยวกับการติดตั้งและกำหนดค่า OpenVPN
- ฉันได้ยินมาว่ากูรูตัวจริงสามารถตั้งค่า DDoS และการป้องกันแบบ Brute Force จำกัดการเข้าถึงเครือข่ายสำหรับแอปพลิเคชั่น ผู้ใช้หรือกลุ่มเฉพาะ และทำสิ่งแปลกๆ อื่นๆ ได้
ฉันอยากจะทราบว่าในตอนแรกฉันพบว่ายูทิลิตี้ iptables ไม่สะดวกอย่างยิ่งเมื่อเทียบกับ ipfw ใน FreeBSD โชคดีที่หลังจากใช้งานมาระยะหนึ่งแล้ว ธงต่างๆ มากมายเช่น -A, -D, -j และอื่นๆ ก็คุ้นเคยกันดี ดังนั้นโปรดอดทนรอ มาดูคำสั่งพื้นฐานกัน
แสดงกฎทั้งหมด:
คุณอาจสังเกตเห็นว่า Netfilter มี "สายโซ่" บางอย่าง - อย่างน้อย INPUT, OUTPUT และ FORWARD
โดยส่วนตัวแล้วฉันมีโซ่ DOCKER บนเครื่องของฉันด้วย เป็นครั้งแรกที่คุณอาจนึกถึงสองรายการแรกว่าเป็นการรับส่งข้อมูลขาเข้าและขาออกทั้งหมด ตามลำดับ และลืมส่วนที่เหลือไปชั่วคราว โอกาสที่ดีที่คุณจะไม่ต้องการมันเลย
ลบกฎทั้งหมด:
เปลี่ยนนโยบาย (พฤติกรรมเริ่มต้น) ของเชน:
iptables -P อินพุตลดลง
iptables -P ยอมรับอินพุต
ปฏิเสธการเข้าถึงจากโฮสต์/ซับเน็ต:
iptables -A อินพุต -s 123.45.67.89 -j DROP
iptables -A อินพุต -s 123.45.0.0/16-j DROP
คุณยังสามารถใช้ชื่อโดเมน:
iptables -A อินพุต -s example.ru -j DROP
ข้อห้ามในการเชื่อมต่อขาออก:
iptables -A เอาต์พุต -d 123.45.67.89 -j DROP
คุณสามารถใช้การปฏิเสธในกฎ:
iptables -A อินพุต!-s 123.45.67.89 -j DROP
การลบกฎตามหมายเลขในห่วงโซ่:
iptables -D อินพุต 1
การลบกฎโดยยึดตามสิ่งที่ทำ:
iptables -D อินพุต -s 123.45.67.89 -j DROP
ตัวเลือก -p ระบุโปรโตคอล คุณสามารถใช้ทั้งหมด, icmp, tcp, udp หรือหมายเลขโปรโตคอลจาก /etc/protocols ธง --sport ระบุพอร์ตที่แพ็คเก็ตถูกส่ง และธง --dport ระบุพอร์ตปลายทาง:
iptables -A อินพุต -p tcp --sport80-j ยอมรับ
iptables -A อินพุต -p tcp --dport80-j ยอมรับ
การแทรกกฎที่จุดเริ่มต้นของห่วงโซ่:
iptables -ฉันอินพุต ...
หรือคุณสามารถระบุตำแหน่งเฉพาะ:
iptables-save >/etc/iptables.rules
กฎการคืนค่า:
iptables-เรียกคืน
ตอนนี้เรามาดูตัวอย่างเชิงปฏิบัติบ้าง ตัวอย่างเช่น นี่คือลักษณะการจำลอง netsplit ในการทดสอบที่ตรวจสอบพฤติกรรมของแอปพลิเคชันที่ใช้ Akka Cluster:
วิ่ง (node1, s "iptables -A INPUT -s $ node2 -j DROP")
วิ่ง (node1, s "iptables -A INPUT -s $ node3 -j DROP")
วิ่ง (node1, s "iptables -A OUTPUT -d $node2 -j DROP")
วิ่ง (node1, s "iptables -A OUTPUT -d $node3 -j DROP")
การกู้คืนเกิดขึ้นในลักษณะเดียวกันทุกประการ เฉพาะแฟล็ก -A เท่านั้นที่จะแทนที่ด้วยแฟล็ก -D
อีกตัวอย่างหนึ่ง คุณต้องค้นหาว่าพอร์ตใดกำลังฟังอยู่บนเครื่องและปิดพอร์ตที่ไม่จำเป็น เราเข้าไปในรถแล้วพูดว่า:
ตัวอย่างผลลัพธ์:
การเชื่อมต่ออินเทอร์เน็ตที่ใช้งานอยู่ (เฉพาะเซิร์ฟเวอร์)
Proto Recv-Q Send-Q ที่อยู่ในท้องถิ่น ที่อยู่ต่างประเทศ รัฐ PID/ชื่อโครงการ
TCP 0 0 0.0.0.0:80 0.0.0.0:* ฟัง 3210/nginx
TCP 0 0 0.0.0.0:4369 0.0.0.0:* ฟัง 1789/epmd
TCP 0 0 0.0.0.0:22 0.0.0.0:* ฟัง 797/sshd
TCP 0 0 127.0.0.1:5432 0.0.0.0:* ฟัง 990/postgres
Nginx และ SSHd ดูอินเทอร์เน็ตซึ่งเป็นเรื่องปกติ PostgreSQL จะรับฟังเฉพาะอินเทอร์เฟซภายในเครื่องเท่านั้น ดังนั้นจึงไม่มีปัญหาใดๆ เช่นกัน แต่ epmd หลุดออกมา (คุณสามารถตรวจสอบด้วย telnet จากเครื่องอื่นได้) และนี่ก็ไม่ดี คุณสามารถปิดพอร์ต 4369 ได้เท่านั้น วิธีการทำเช่นนี้แสดงไว้ด้านบน หรือคุณสามารถไปไกลกว่านั้นและปฏิเสธการเชื่อมต่อทั้งหมดจากภายนอกไปยังพอร์ต 81 และเก่ากว่า:
iptables -A INPUT -m มัลติพอร์ต \
-p tcp --dports81:65535!-s 127.0.0.0/8-j DROP
ซึ่งใช้ส่วนขยายหลายพอร์ตซึ่งช่วยให้คุณสามารถระบุช่วงพอร์ตได้
ตรวจสอบว่าทุกอย่างทำงานได้ หากตกลง ให้บันทึกกฎ:
iptables-save >/etc/iptables.rules
เพื่อให้กฎต่างๆ ได้รับการหยิบยกขึ้นมาเมื่อระบบบูท เราจึงสร้าง ไฟล์ใหม่/etc/network/if-pre-up.d/iptables:
iptables-เรียกคืนทางออก0
... และเราพูดว่า:
chmod +x /etc/network/if-pre-up.d/iptables
วิธีการนี้ได้รับการทดสอบแล้วว่าสามารถทำงานบน Ubuntu 14.04 LTS ได้
มันควรจะใช้ได้กับ Debian ด้วย คุณจะพบคำอธิบายของวิธีอื่นในการกู้คืนกฎไฟร์วอลล์เมื่อเริ่มต้นระบบในหมายเหตุเกี่ยวกับ OpenVPN ที่กล่าวถึงแล้ว
เอกสารเพิ่มเติมสำหรับผู้ที่ต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ Netfilter:
คุณจะตั้งค่าไฟร์วอลล์บนเซิร์ฟเวอร์ของคุณได้อย่างไร?
แท็ก: ลินุกซ์, ความปลอดภัย, เครือข่าย.
ยูทิลิตีบรรทัดคำสั่ง iptables ใช้เพื่อกำหนดค่าไฟร์วอลล์ netfilter ที่สร้างไว้ในระบบที่ใช้เคอร์เนล Linux
คำแนะนำนี้เหมาะสำหรับทั้งหุ่นจำลองที่ต้องการเข้าใจแง่มุมต่างๆ ของการรักษาความปลอดภัยเครือข่าย และสำหรับมืออาชีพที่มีประสบการณ์เพื่อใช้เป็นข้อมูลสรุป
หลักการตั้งค่า
ไวยากรณ์ทั่วไปสำหรับการใช้ iptables คือ:
iptables -t<таблица> <команда> <цепочка>[ตัวเลข]<условие> <действие>
<таблица>
กฎ netfilter กระจายอยู่ใน 4 ตาราง ซึ่งแต่ละตารางมีวัตถุประสงค์ของตัวเอง (รายละเอียดเพิ่มเติมด้านล่าง) มันถูกระบุด้วยสวิตช์ -t แต่หากไม่ได้ระบุพารามิเตอร์นี้ การดำเนินการจะดำเนินการสำหรับตารางเริ่มต้น - ตัวกรอง
<команда>
คำสั่งจะระบุประเภทการดำเนินการที่เราดำเนินการบน netfilter เช่น การสร้างหรือการลบกฎ
<цепочка>
แต่ละตารางมีห่วงโซ่ซึ่งแต่ละกฎจะถูกสร้างขึ้นเอง ตัวอย่างเช่น สำหรับตารางตัวกรองด้านบน มีเชนที่กำหนดไว้ล่วงหน้าสามสาย - INPUT (แพ็กเก็ตขาเข้า), OUTPUT (แพ็กเก็ตขาออก) และ FORWARD (แพ็กเก็ตการขนส่ง)
[ตัวเลข]
คำสั่งบางคำสั่งจำเป็นต้องระบุหมายเลขกฎ เช่น เพื่อลบหรือแก้ไข
<условие>
เงื่อนไขจะอธิบายเกณฑ์สำหรับการสร้างกฎเฉพาะ
<действие>
แล้วถ้าเข้าเงื่อนไขจะทำยังไงกับแพ็คเกจล่ะ?
* เพื่อความเป็นธรรม เป็นที่น่าสังเกตว่าคีย์การดำเนินการไม่จำเป็นต้องมาต่อท้าย เพียงแต่ว่ารูปแบบนี้มักพบในคำแนะนำและทำให้กฎอ่านง่ายขึ้น
คีย์ iptables และตัวอย่างการใช้งาน
เพื่อทำงานกับตาราง (iptables -t)
ฉันขอเตือนคุณว่ากฎทั้งหมดใน netfilter กระจายไปตามตาราง หากต้องการทำงานกับตารางใดตารางหนึ่ง คุณต้องใช้สวิตช์ -t
ทีม
คีย์ต่อไปนี้กำหนดการดำเนินการที่ยูทิลิตี้ iptables ดำเนินการ
สำคัญ | คำอธิบายและตัวอย่าง |
---|---|
-ก | การเพิ่มกฎที่ส่วนท้ายของรายการ: iptables -A อินพุต -s 192.168.0.15 -j DROP ปฏิเสธข้อความขาเข้าจาก 192.168.0.15 |
-D | การลบกฎ: iptables -D อินพุต 10 ลบกฎในห่วงโซ่ INPUT ด้วยหมายเลข 10 |
-ฉัน | การแทรกกฎในส่วนเฉพาะของรายการ: iptables -I อินพุต 5 -s 192.168.0.15 -j DROP แทรกกฎข้อที่ 5 ในรายการ |
-ร | แทนที่กฎ iptables -R เอาต์พุต 5 -s 192.168.0.15 -j ยอมรับ แทนที่กฎข้อที่ 5 ของเราจากห้ามเป็นการอนุญาต |
-ฟ | การรีเซ็ตกฎในห่วงโซ่ iptables -F อินพุต |
-Z | กำลังรีเซ็ตสถิติ iptables -Z อินพุต |
-น | การสร้างห่วงโซ่ iptables -N CHAINNEW |
-เอ็กซ์ | กำลังลบห่วงโซ่ iptables -X CHAINNEW |
-ป | กำหนดกฎเริ่มต้น iptables -P อินพุตลดลง |
-อี | เปลี่ยนชื่อห่วงโซ่ iptables -E CHAINNEW CHAINOLD |
เงื่อนไข
คีย์เหล่านี้กำหนดเงื่อนไขของกฎ
สำคัญ | คำอธิบายและตัวอย่าง |
---|---|
-พี | โปรโตคอลเครือข่าย ตัวเลือกที่ถูกต้องคือ TCP, UDP, ICMP หรือ ALL iptables -A อินพุต -p tcp -j ยอมรับ อนุญาตการเชื่อมต่อ TCP ขาเข้าทั้งหมด |
-ส | ที่อยู่ต้นทาง - ชื่อโฮสต์ ที่อยู่ IP หรือซับเน็ตในรูปแบบ CIDR iptables -A อินพุต -s 192.168.0.50 -j DROP ปฏิเสธข้อความขาเข้าจากโหนด 192.168.0.50 |
-d | ที่อยู่ปลายทาง. หลักการใช้งานคล้ายกับคีย์ก่อนหน้า -s iptables -A เอาต์พุต -d 192.168.0.50 -j DROP ปฏิเสธการออกไปยังโหนด 192.168.0.50 |
-ฉัน | อะแดปเตอร์เครือข่ายที่แพ็กเก็ตมาถึง (INPUT) iptables -A อินพุต -i eth2 -j DROP ปิดการใช้งานการรับส่งข้อมูลขาเข้าสำหรับอินเทอร์เฟซอีเทอร์เน็ต eth2 |
-o | อะแดปเตอร์เครือข่ายที่ใช้ส่งแพ็กเก็ต (OUTPUT) iptables -A เอาต์พุต -o eth3 -j ยอมรับ อนุญาตข้อความขาออกจากอินเทอร์เฟซอีเทอร์เน็ต eth3 |
--dport | ท่าเรือปลายทาง. iptables -A อินพุต -p tcp --dport 80 -j ยอมรับ อนุญาตสายเรียกเข้าบนพอร์ต 80 |
--กีฬา | พอร์ตต้นทาง iptables -A อินพุต -p tcp --sport 1023 -j DROP ห้ามข้อความขาเข้าจากพอร์ต 1023 |
กุญแจที่อยู่ในรายการยังรองรับการก่อสร้างโดยใช้ป้ายด้วย ! .
การตั้งค่า netfilter โดยใช้ iptables
มันกลับเงื่อนไข เช่น
iptables -A อินพุต -s ! 192.168.0.50 -j ดรอป
จะปฏิเสธการเชื่อมต่อกับโฮสต์ทั้งหมด ยกเว้น 192.168.0.50
การดำเนินการ
การดำเนินการที่จะดำเนินการกับแพ็คเกจที่ตรงกับเกณฑ์ของเงื่อนไข แต่ละตารางมีชุดการดำเนินการที่อนุญาตเป็นของตัวเอง ระบุโดยใช้กุญแจ -เจ.
โต๊ะ | การกระทำ | คำอธิบาย |
---|---|---|
กรอง | ยอมรับ | อนุญาตให้มีแพ็คเกจ |
หยด | ปฏิเสธแพ็คเกจ | |
ปฏิเสธ | ห้ามส่งข้อความไปยังแหล่งที่มา | |
แนท | สวมหน้ากาก | สำหรับแพ็กเก็ตขาออก ให้แทนที่ที่อยู่ IP ต้นทางด้วยที่อยู่ของอินเทอร์เฟซที่แพ็กเก็ตออกไป |
สนท | คล้ายกับ MASQUERADE แต่ระบุอินเทอร์เฟซเครือข่ายเฉพาะซึ่งจะใช้ที่อยู่สำหรับการปลอมแปลง | |
ดีเอ็นเอที | การทดแทนที่อยู่สำหรับพัสดุที่เข้ามา | |
เปลี่ยนเส้นทาง | เปลี่ยนเส้นทางคำร้องขอไปยังพอร์ตอื่นบนระบบเดียวกัน | |
ยุ่งเหยิง | ทีโอเอส | การปรับเปลี่ยนฟิลด์ TOS (การจัดลำดับความสำคัญของการรับส่งข้อมูล) |
ดีเอสซีพี | การเปลี่ยน DSCP (รวมถึงการจัดลำดับความสำคัญของการรับส่งข้อมูล) | |
ทีทีแอล | เปลี่ยน TTL (อายุการใช้งานแพ็คเก็ต) | |
เอช.แอล. | คล้ายกับ TTL แต่สำหรับ IPv6 | |
เครื่องหมาย | การทำเครื่องหมายแพ็คเกจ ใช้สำหรับการกรองหรือการสร้างรูปร่างในภายหลัง | |
คอนมาร์ค | เครื่องหมายการเชื่อมต่อ | |
TCPMSS | การเปลี่ยนค่า MTU |
ตัวอย่างคำสั่ง iptables ที่ใช้กันทั่วไป
คำสั่งทั่วไป
ดูกฎด้วยหมายเลข:
iptables -L --line-numbers
สำหรับแต่ละตาราง คุณต้องดูกฎแยกกัน:
iptables -t nat -L --line-numbers
ลบกฎทั้งหมด:
ตั้งกฎเริ่มต้น:
iptables -P อินพุตลดลง
iptables -P เอาต์พุตลดลง
* ในตัวอย่างเหล่านี้ ตามค่าเริ่มต้น กฎการปฏิเสธ (DROP) จะใช้ได้กับแพ็กเก็ตขาเข้า (INPUT) และขาออก (OUTPUT) ทั้งหมด
อนุญาตทั้งหมด
วิธีที่ 1: โดยการเพิ่มกฎ:
iptables -I อินพุต 1 -j ยอมรับ
iptables -I เอาต์พุต 1 -j ยอมรับ
iptables - ฉันส่งต่อ 1 -j ยอมรับ
* คำสั่งทั้งสามนี้จะสร้างกฎที่อนุญาตแพ็กเก็ตขาเข้า ขาออก และการขนส่งทั้งหมด
วิธีที่ 2 การทำความสะอาดกฎ:
* ในที่นี้เราจะลบกฎทั้งหมด (-F) ออกก่อน จากนั้นจึงตั้งค่านโยบายเริ่มต้นเพื่ออนุญาตขาเข้า ขาออก และการขนส่ง (-S)
วิธีที่ 3 การปิดใช้งานบริการ (สะดวกในการปิดใช้งานไฟร์วอลล์ชั่วคราวเพื่อวินิจฉัยปัญหา):
การทำงานตามกฎเกณฑ์
เพิ่มกฎที่ส่วนท้ายของรายการ:
iptables -A อินพุต -p tcp --dport 25 -j ยอมรับ
iptables -A อินพุต -p tcp -s ! 192.168.0.25 —dport 993 -i eth0 -j ยอมรับ
เพิ่มช่วงพอร์ต:
iptables -A อินพุต -p tcp --dport 3000:4000 -j ยอมรับ
* ในกรณีนี้ตั้งแต่ 3,000 ถึง 4,000
แทรกกฎ:
iptables -I ส่งต่อ 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j ยอมรับ
การส่งต่อพอร์ต
มีวิธีการตั้งค่าสองวิธี
1. กฎการเตรียมการ + การโพสต์:
iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 —dport 22 -j DNAT —ไปยังปลายทาง 192.168.1.15:2222
iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 — กีฬา 2222 -j SNAT — ไปยังแหล่งที่มา 19.8.232.80:22
* ที่ไหน 19.8.232.80 — ที่อยู่ที่เรารับฟังคำขอเชื่อมต่อ 22 - พอร์ตสำหรับการส่งต่อ 192.168.1.15 2222 - พอร์ตภายใน
2. กฎการเตรียมล่วงหน้า + ส่งต่อ:
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT -- สู่ปลายทาง 192.168.1.15:2222
iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state ใหม่ ก่อตั้งแล้ว ที่เกี่ยวข้อง -j ยอมรับ
* ที่ไหน eth1— อินเทอร์เฟซเครือข่ายที่เรารับฟังคำขอ 22 - พอร์ตสำหรับการส่งต่อ 192.168.1.15 — ที่อยู่ IP ภายในที่เราถ่ายโอนคำขอทั้งหมดไป 2222 - พอร์ตภายใน
กำลังเริ่มการตั้งค่า
อนุญาต SSH:
iptables -A อินพุต -p tcp --dport 22 -j ยอมรับ
เรากำหนดนโยบายเพื่อห้ามข้อความขาเข้าและอนุญาตข้อความขาออกทั้งหมด:
iptables -P ยอมรับเอาต์พุต
เราสร้างกฎสำหรับการทำงานปกติของ apt-get:
iptables -A INPUT -p tcp --sport 80 -m state --state ก่อตั้งแล้ว -j ยอมรับ
อนุญาตให้ ICMP (เพื่อดำเนินการคำสั่ง ping):
iptables -A อินพุต -p icmp -j ยอมรับ
กฎการบันทึก (ถาวร)
ตามค่าเริ่มต้น กฎทั้งหมดจะหยุดทำงานหลังจากที่เครือข่ายหรือคอมพิวเตอร์รีสตาร์ทแล้ว มีวิธีการกำหนดค่าหลายวิธีในการบันทึกกฎหลังจากรีบูต
วิธีที่ 1. iptables-save
บันทึกกฎลงในไฟล์:
iptables-save > /etc/iptables.rules
เปิดการตั้งค่าเครือข่าย:
vi /etc/network/interfaces.vi
และเพิ่มบรรทัด:
คืนค่า iptables ล่วงหน้า< /etc/iptables.rules
วิธีที่ 2: iptables แบบถาวร
ติดตั้งแพ็คเกจ iptables-persistent:
apt ติดตั้ง iptables แบบถาวร
หากต้องการบันทึกกฎ ให้ป้อนคำสั่ง:
บริการ iptables-บันทึกถาวร
วิธีที่ 3 บริการ iptables
ใช้งานได้กับ Linux เวอร์ชันเก่า:
วิธีที่ 4: iptables.init
ทำงานบน CentOS:
/usr/libexec/iptables/iptables.init บันทึก
อูบุนตู และ CentOS
ในห้องผ่าตัดที่ทันสมัย ระบบอูบุนตูและ CentOS ไม่มี iptables เป็นค่าเริ่มต้น
คุณต้องติดตั้งหรือใช้ยูทิลิตี้รุ่นใหม่
บน CentOS
เช่น โปรแกรมปกติการจัดการไฟร์วอลล์ใช้ firewall-cmd สำหรับรายละเอียดเพิ่มเติม โปรดอ่านคำแนะนำเกี่ยวกับวิธีการกำหนดค่าไฟร์วอลล์บน CentOS
หากคุณต้องการใช้ iptables ให้ติดตั้งแพ็คเกจด้วยยูทิลิตี้:
ยำติดตั้ง iptables-services
ปิดการใช้งานไฟร์วอลล์:
systemctl หยุดไฟร์วอลล์
systemctl ปิดการใช้งานไฟร์วอลล์
อนุญาตและเปิดใช้ iptables:
systemctl เปิดใช้งาน iptables
ในอูบุนตู
ตอนนี้ ufw ถูกใช้เพื่อจัดการไฟร์วอลล์
หากต้องการทำงานกับ iptables ให้ติดตั้งแพ็คเกจต่อไปนี้:
apt-get ติดตั้ง iptables แบบถาวร
ปิดการใช้งาน ufw:
# เครือข่าย# ความปลอดภัย# UNIX# Ubuntu# Linux
คำแนะนำนี้มีประโยชน์กับคุณหรือไม่?
เบื้องหลัง “กำแพงไฟ”:
ไฟร์วอลล์ (ไฟร์วอลล์) และเกตเวย์สู่อินเทอร์เน็ต
ใน DEBIAN GNU/LINUX 4.0 ETCH
คู่มือที่เป็นประโยชน์ในการจัดการการเข้าถึงอินเทอร์เน็ตที่ปลอดภัย
จากคอมพิวเตอร์เครื่องอื่นและจาก เครือข่ายท้องถิ่นใน Debian GNU/Linux 4.0 Etch
ทฤษฎีเล็กน้อย
การเข้าถึงอินเทอร์เน็ตแต่ละครั้งไม่เพียงทำให้สามารถเชื่อมต่อกับเซิร์ฟเวอร์และไซต์ต่างๆ ได้ แต่ยังสร้างอันตรายที่อาจเกิดขึ้นจากการเจาะเข้าสู่คอมพิวเตอร์ของเราจากภายนอก อันตรายนี้ไม่ควรละเลย เนื่องจากในปัจจุบันความพยายามส่วนใหญ่ในการเข้าถึงคอมพิวเตอร์ของผู้ใช้โดยไม่ได้รับอนุญาตจากอินเทอร์เน็ตเป็นส่วนหนึ่งของธุรกิจอาชญากรรมที่มีการจัดการอย่างดี หลังจากที่ระบบของคุณถูกแฮ็กสำเร็จแล้ว พวกเขาจะพยายามใช้คอมพิวเตอร์ของคุณเพื่อส่งสแปมหรือ องค์กร DoSการโจมตีคอมพิวเตอร์เครื่องอื่นหรือเพื่อวัตถุประสงค์ที่ชั่วร้ายอื่น ๆ ละเลยอันตรายนี้ สถานการณ์กรณีที่ดีที่สุดจะเพิ่มค่าใช้จ่ายในการรับส่งข้อมูลและทำให้คอมพิวเตอร์ของคุณช้าลง อย่างเลวร้ายที่สุด มันอาจเกี่ยวข้องกับคุณในกิจกรรมทางอาญาของกลุ่มไซเบอร์โดยไม่รู้ตัว
สถานการณ์เลวร้ายลงจากความจริงที่ว่าในระบบปฏิบัติการบางระบบ (ที่ยังคงแพร่หลาย) พอร์ตจำนวนมากถูกเปิดทิ้งไว้ตามค่าเริ่มต้น ซึ่งช่วยให้ผู้โจมตีจากอินเทอร์เน็ตสามารถเชื่อมต่อกับผู้ใช้โดยที่ผู้โจมตีไม่สังเกตเห็น
เพื่อป้องกันการเชื่อมต่อที่ไม่ได้รับอนุญาตจากภายนอก และเพื่อกรองการรับส่งข้อมูลขาเข้า/ขาออก ระบบปฏิบัติการต้องใช้โปรแกรมพิเศษ - ไฟร์วอลล์(ไฟร์วอลล์ภาษาอังกฤษ) หรือที่เรียกกันว่า ไฟร์วอลล์และ ไฟร์วอลล์- อธิบายไว้ด้านล่าง ติดตั้งง่ายไฟร์วอลล์ในระบบปฏิบัติการฟรี เดเบียน GNU/ลินุกซ์ 4.0.
การใช้ไฟร์วอลล์จะมีความเกี่ยวข้องอย่างยิ่งหากคุณมีคอมพิวเตอร์มากกว่าหนึ่งเครื่อง เครือข่ายภายในบ้านหรือสำนักงานซึ่งมีคอมพิวเตอร์เข้าถึงอินเทอร์เน็ต
แม้แต่เครือข่ายท้องถิ่นขนาดเล็กก็ต้องได้รับการจัดระเบียบอย่างเหมาะสม สมมติว่าคุณมีจุดเชื่อมต่ออินเทอร์เน็ตความเร็วสูง (เช่น โมเด็ม ADSL) พร้อมอินเทอร์เฟซอีเทอร์เน็ต (เช่น เครือข่าย)
มีสิ่งล่อใจ (กระตุ้นโดยคำแนะนำที่ไม่รู้หนังสือ เช่น ในคำแนะนำสำหรับโมเด็ม ADSL ของฉัน) ให้เชื่อมต่อโมเด็มเข้ากับสวิตช์โดยตรง จากนั้นจึงเชื่อมต่อกับสวิตช์ ทั้งหมดคอมพิวเตอร์เครือข่ายท้องถิ่น ในกรณีนี้ โมเด็มจะออกแบบไดนามิกผ่านสวิตช์ ที่อยู่ IP ท้องถิ่นแต่ปรากฎว่าคอมพิวเตอร์แต่ละเครื่องถูกทิ้งให้อยู่ตามลำพังกับอินเทอร์เน็ต! ทั้งโมเด็มและสวิตช์ไม่สามารถเป็นอุปสรรคต่อผู้ประสงค์ร้ายได้ ผู้โจมตีสามารถสแกนได้ ทั้งหมดคอมพิวเตอร์ของเครือข่ายท้องถิ่นที่จัดในลักษณะนี้
วิธีแก้ปัญหาที่สมเหตุสมผลและปลอดภัยคือการสร้าง สิ่งกีดขวางระหว่างโมเด็มและเครือข่ายท้องถิ่น - ในรูปแบบของคอมพิวเตอร์แยกต่างหากที่มีการกำหนดค่า "กำแพงไฟ" (ไฟร์วอลล์) คอมพิวเตอร์เครื่องนี้มีอินเทอร์เฟซ 2 แบบ โดยอินเทอร์เฟซหนึ่ง "ดู" ที่อินเทอร์เน็ต (เช่น เชื่อมต่อทางกายภาพกับโมเด็ม) ส่วนอีกอินเทอร์เฟซหันหน้าไปทางเครือข่ายท้องถิ่น (และเชื่อมต่อทางกายภาพกับสวิตช์ ซึ่งมีคอมพิวเตอร์เครื่องอื่นอยู่ด้วย เชื่อมต่อ) เนื่องจากคอมพิวเตอร์ของเราที่มีไฟร์วอลล์เป็นศูนย์กลางสำหรับคอมพิวเตอร์เครื่องอื่นในการเข้าถึงอินเทอร์เน็ตจึงถูกเรียกว่า เกตเวย์(เกตเวย์ภาษาอังกฤษ).
ด้วยองค์กรของเครือข่ายท้องถิ่นโอกาสในการแฮ็กจะลดลงอย่างมาก - ผู้โจมตี "เห็น" เฉพาะเกตเวย์จากอินเทอร์เน็ตและมีการติดตั้งไฟร์วอลล์บนเกตเวย์และไม่ใช่เรื่องง่ายที่จะแฮ็กมัน
การตั้งค่า iptables บน Linux สำหรับหุ่นจำลอง
คอมพิวเตอร์เครือข่ายท้องถิ่นสามารถท่องอินเทอร์เน็ตและยังคงปลอดภัย
การตั้งค่าไฟร์วอลล์โดยใช้ตัวกำหนดค่า arno-iptables-firewall
เพื่อจัดระเบียบไฟร์วอลล์ใน กนู/ลินุกซ์มีการใช้โปรแกรม ไอพีเทเบิลซึ่งตามกฎแล้วจะถูกติดตั้งทันทีเมื่อทำการติดตั้งการแจกแจงส่วนใหญ่ ใน เดเบียน GNU/Linuxคุณสามารถตรวจสอบได้โดยเรียกใช้ด้วยสิทธิ์ของผู้ดูแลระบบ ความถนัด- หากจำเป็นเราก็ติดตั้ง ไอพีเทเบิล.
อย่างไรก็ตาม การกำหนดค่าด้วยตนเอง ไอพีเทเบิลเป็นงานที่ไม่สำคัญและสามารถทำได้โดยผู้เชี่ยวชาญในสาขาเท่านั้น การบริหารระบบ- ดังนั้นหากต้องการกำหนดค่ากฎที่ไฟร์วอลล์จะทำงานจึงควรใช้ ตัวกำหนดค่าพิเศษ- ใน เดเบียน GNU/Linuxนี่คือโปรแกรม arno-iptables-ไฟร์วอลล์- เมื่อเปิดตัวแล้ว มันจะถามคำถามหลายชุด โดยจะสร้างกฎสำหรับการทำงานของไฟร์วอลล์ ไอพีเทเบิล.
พิมพ์คอนโซลด้วยสิทธิ์ superuser:
#aptitude ติดตั้ง arno-iptables-ไฟร์วอลล์
เมื่อเริ่มต้นการติดตั้งโปรแกรมจะถามว่าเราต้องการกำหนดค่าไฟร์วอลล์ด้วยหรือไม่ ไอพีเทเบิล:
ก่อนอื่นคุณต้องระบุอินเทอร์เฟซภายนอก - "ดู" ที่อินเทอร์เน็ตเช่น เชื่อมต่อกับโมเด็มแล้ว การตั้งค่าอินเทอร์เฟซถูกกำหนดไว้ในไฟล์กำหนดค่า /etc/เครือข่าย/อินเทอร์เฟซ- อาจมีลักษณะเช่นนี้ เช่น:
# นี่คืออินเทอร์เฟซแท้จริง - ชี้ไปที่เครื่องของเราเอง auto lo iface lo ที่อยู่ลูปแบ็ค inet 127.0.0.1 netmask 255.0.0.0 # นี่คืออินเทอร์เฟซ eth0 ซึ่งเชื่อมต่อกับอินเทอร์เน็ต (โมเด็ม ADSL) # ลักษณะเฉพาะของมันคือที่อยู่ IP ถูกกำหนดให้กับมันแบบไดนามิกโดยผู้ให้บริการ # ดังนั้น มันถูกตั้งค่าไว้ ตัวเลือก dhcp auto eth0 iface eth0 inet dhcp # นี่คืออินเทอร์เฟซที่หันหน้าไปทางเครือข่ายท้องถิ่น # ที่อยู่เครือข่ายท้องถิ่นจะเป็น 192.168.2.0/24 # เพื่อความปลอดภัยบนเครือข่ายท้องถิ่น เกตเวย์มี ที่อยู่ IP แบบคงที่- 192.168.2.1, # ดังนั้นจึงตั้งค่าตัวเลือกคงที่ # Network mask - 255.255.255.0 # ที่อยู่การออกอากาศของเครือข่ายในกรณีนี้คือ 192.168.2.255 auto eth1 iface eth1 ที่อยู่คงที่ inet 192.168.2.1 netmask 255.255.255.0 ออกอากาศ 192.168 .2.2 55
ดังนั้นดูที่การตั้งค่า /etc/เครือข่าย/อินเทอร์เฟซเราระบุให้ผู้กำหนดค่าไฟร์วอลล์ทราบว่าอินเทอร์เฟซของเราเป็นแบบภายนอก eth0:
สำหรับคำถามที่ว่าเราได้รับที่อยู่ IP จากผู้ให้บริการหรือไม่ แบบไดนามิก(โดยใช้โปรโตคอล DHCP) เราตอบแบบยืนยัน:
คำถามต่อไปคือบริการใดบ้างที่จะได้รับจากคอมพิวเตอร์ของเรา ผู้ใช้ภายนอกอินเทอร์เน็ต. เราไม่มี! เราไม่ได้มีส่วนร่วมในเว็บโฮสติ้งระดับมืออาชีพและไม่ได้ตั้งใจที่จะเผยแพร่ข้อมูลภายนอก ปล่อยให้บรรทัดว่าง
มีคำถามว่าเราจะให้บริการใดๆ ผ่าน UDP หรือไม่ ไม่ใช่เช่นกัน - และเราก็เว้นบรรทัดว่างไว้ด้วย!
เราจำเป็นต้องได้รับ Ping จากโลกภายนอกหรือไม่ (เช่น เพื่อตรวจสอบว่ามีการเชื่อมต่อกับคอมพิวเตอร์ที่ติดตั้งไฟร์วอลล์ไว้หรือไม่) ในกรณีของเรา สิ่งนี้ค่อนข้างเป็นที่ยอมรับ:
การดำเนินการนี้เป็นการเสร็จสิ้นการตั้งค่าสำหรับคอมพิวเตอร์เครื่องอื่นที่ไม่ใช่เกตเวย์เครือข่ายท้องถิ่น หากเราวางแผนที่จะใช้คอมพิวเตอร์เป็นเกตเวย์ เราต้องตอบคำถามเพิ่มเติมสองสามข้อ เราระบุอินเทอร์เฟซที่เกตเวย์หันหน้าไปทางเครือข่ายท้องถิ่น - ในกรณีของเรา eth1ดังที่ชัดเจนจาก /etc/เครือข่าย/อินเทอร์เฟซ(มิฉะนั้น สำหรับคอมพิวเตอร์ "โดดเดี่ยว" ให้ปล่อยช่องนี้ว่างไว้):
เมื่อถูกถามว่าจะอนุญาตการแปล NAT หรือไม่ เช่น เปลี่ยนเส้นทางการรับส่งข้อมูลจากอินเทอร์เน็ตผ่านเกตเวย์ไปยังเครือข่ายท้องถิ่นและย้อนกลับเราตอบว่า "ใช่" - นี่เป็นหนึ่งในงานหลักของเราในกรณีนี้:
จากนั้นคำถามก็เกิดขึ้น: ส่วนเครือข่ายท้องถิ่นใดที่สามารถเข้าถึงได้ผ่านการเปลี่ยนเส้นทางไปยังเครือข่ายภายนอก เรามีสิทธิ์ในการเข้าถึงอินเทอร์เน็ตบนคอมพิวเตอร์ทุกเครื่องในเครือข่ายท้องถิ่น ระบุค่าอีกครั้ง 192.168.2.0/24
ในที่สุด เราก็ยืนยันความปรารถนาของเราที่จะเปิดตัว ไอพีเทเบิลปราศจาก ตรวจสอบเพิ่มเติมในส่วนของเรา กฎสำหรับไฟร์วอลล์ที่สร้างขึ้นโดยอัตโนมัติโดยผู้กำหนดค่า:
หลังจากนี้หากทุกอย่างเป็นไปด้วยดีจะมีข้อความคล้ายกับข้อความด้านล่างปรากฏขึ้น ตอนนี้จะปรากฏขึ้นทุกครั้งที่คอมพิวเตอร์เกตเวย์บู๊ตและแจ้งให้คุณทราบว่าไฟร์วอลล์เปิดใช้งานได้สำเร็จ:
สคริปต์ไฟร์วอลล์ Iptables ของ Arno v1.8.8c ———————————————————————————- ผ่านการตรวจสอบสุขภาพแล้ว…ตกลง โมดูล IPTABLES ที่ตรวจพบ…
กำลังโหลดโมดูล IPTABLES เพิ่มเติม: โหลดโมดูล IPTABLES ทั้งหมดแล้ว! กำลังกำหนดค่า /proc/…. การตั้งค่า: เปิดใช้งานการป้องกันการปลอมแปลงด้วย rp_filter เปิดใช้งานการป้องกันน้ำท่วม SYN ผ่านคุกกี้ SYN ปิดการใช้งานการบันทึกของดาวอังคาร ปิดการใช้งานการยอมรับข้อความเปลี่ยนเส้นทาง ICMP การตั้งค่าสูงสุด จำนวนการเชื่อมต่อพร้อมกันถึง 16384 เปิดใช้งานการป้องกันแพ็กเก็ตที่กำหนดเส้นทางต้นทาง การตั้งค่าการหมดเวลา conntrack เริ่มต้น เปิดใช้งานการลดความสามารถในการ DoS การตั้งค่าเริ่มต้น TTL=64 ปิดการใช้งาน ECN (การแจ้งเตือนความแออัดอย่างชัดเจน) เปิดใช้งานการสนับสนุนสำหรับตารางเส้นทางฟลัชชิงแบบไดนามิกของ IP /proc/ เสร็จสิ้น... กฎการฟลัชในตารางตัวกรอง การตั้งค่านโยบายเริ่มต้น (ปลอดภัย) การใช้ "ข้อมูล" ระดับบันทึกสำหรับ syslogd การตั้งค่ากฎไฟร์วอลล์: ———————————————————————— - การยอมรับแพ็กเก็ตจากอุปกรณ์ลูปแบ็คภายในเครื่อง เปิดใช้งานการตั้งค่าขนาดแพ็คเก็ตสูงสุดผ่าน MSS เปิดใช้งานการจัดการ TOS การบันทึกการสแกนแบบซ่อนตัว (nmap โพรบ ฯลฯ) เปิดใช้งาน การบันทึกแพ็กเก็ตที่เปิดใช้งานแฟล็ก TCP ที่ไม่ถูกต้อง การบันทึกแพ็กเก็ตที่ไม่ถูกต้อง ปิดใช้งาน การบันทึกแพ็กเก็ตที่กระจัดกระจาย เปิดใช้งานการบันทึกของ เปิดใช้งานการเข้าถึงจากที่อยู่ที่สงวนไว้ การตั้งค่ากฎป้องกันการปลอมแปลง การอ่านกฎ IPTABLES ที่กำหนดเองจาก /etc/arno-iptables-firewall/custom-rules กำลังโหลดปลั๊กอิน (ผู้ใช้) การตั้งค่านโยบาย INPUT สำหรับเน็ตภายนอก (INET): การเปิดใช้งานการสนับสนุนสำหรับ DHCP IP ที่กำหนดบนอินเทอร์เฟซภายนอก: eth0 เปิดใช้งานการบันทึกโฮสต์ที่ถูกบล็อกอย่างชัดเจน เปิดใช้งานการบันทึกการเชื่อมต่อเอาต์พุตในเครื่องที่ถูกปฏิเสธ แพ็กเก็ตจะไม่ถูกตรวจสอบสำหรับที่อยู่ต้นทางส่วนตัว อนุญาตให้คนทั้งโลกส่งคำขอ ICMP (ping) การบันทึกคำขอ ICMP ที่ตกหล่น เปิดใช้งานแพ็กเก็ต (ping) การบันทึกแพ็กเก็ต ICMP อื่นที่ลดลงเปิดใช้งาน การบันทึกการสแกนการลักลอบที่เป็นไปได้เปิดใช้งาน การบันทึกความพยายามในการเชื่อมต่อ (อื่น ๆ ) ไปยังพอร์ต TCP ที่มีสิทธิ์เปิดใช้งาน การบันทึกความพยายามในการเชื่อมต่อ (อื่น ๆ ) ไปยังพอร์ต UDP สิทธิพิเศษที่เปิดใช้งาน การบันทึกความพยายามในการเชื่อมต่อ (อื่น ๆ ) เปิดใช้งานพอร์ต TCP ที่ไม่มีสิทธิพิเศษ เปิดใช้งานการบันทึกความพยายามในการเชื่อมต่อ (อื่นๆ) ไปยังพอร์ต UDP ที่ไม่มีสิทธิพิเศษ เปิดใช้งานการบันทึกความพยายามในการเชื่อมต่อโปรโตคอล IP อื่น (ไม่ใช่ TCP/UDP/ICMP) เปิดใช้งานการบันทึก เปิดใช้งานการบันทึก ICMP Flooding การใช้นโยบาย INET กับอินเทอร์เฟซภายนอก (INET): eth0 (ไม่มี ระบุเครือข่ายย่อยภายนอก) การตั้งค่านโยบายอินพุตสำหรับอินเทอร์เฟซภายใน (LAN): eth1 การอนุญาตคำขอ ICMP (ping) การอนุญาตโปรโตคอล (อื่น ๆ ) ทั้งหมด การตั้งค่านโยบาย FORWARD สำหรับอินเทอร์เฟซภายใน (LAN): eth1 การบันทึกของ ปฏิเสธ LAN-> เปิดใช้งานการเชื่อมต่อ INET FORWARD การตั้งค่า LAN-> นโยบาย INET: การอนุญาตคำขอ ICMP (ping) การอนุญาตโปรโตคอล (อื่น ๆ ) ทั้งหมด การเปิดใช้งานการปลอมแปลง (NAT) ผ่านอินเทอร์เฟซภายนอก: eth0 การเพิ่มโฮสต์ (ภายใน) : 192. 168.2.0/24 การรักษาความปลอดภัยบังคับใช้สำหรับอินเทอร์เฟซภายนอกในห่วงโซ่ FORWARD 16 ม.ค. 23:53:12 กฎไฟร์วอลล์ทั้งหมดใช้
หมายเหตุ 1.ในกรณีส่วนใหญ่ การเปิดตัวไฟร์วอลล์ที่ประสบความสำเร็จจะเกิดขึ้นหลังจากการสื่อสารกับผู้กำหนดค่าครั้งแรก หากมีบางอย่างใช้งานไม่ได้ ขอแนะนำอย่างยิ่งให้ทำการกำหนดค่าซ้ำโดยเรียกใช้ตัวกำหนดค่าอีกครั้งด้วยสิทธิ์ผู้ใช้ระดับสูง:
# dpkg- กำหนดค่า arno-iptables-firewall ใหม่
วิธีนี้จะกำจัดข้อผิดพลาดแบบสุ่มที่อาจเกิดขึ้นเมื่อตอบคำถามจากเครื่องมือกำหนดค่าระหว่างประสบการณ์การสื่อสารครั้งแรกของคุณ หากวิธีนี้ไม่ได้ผล คุณสามารถลองแก้ไขด้วยตนเองได้ ไฟล์การกำหนดค่าโปรแกรม arno-iptables-ไฟร์วอลล์กล่าวคือ: /etc/arno-iptables-ไฟร์วอลล์/firewall.conf- การเยี่ยมชมเว็บไซต์หลักของผู้สร้างโปรแกรมนี้อาจเป็นประโยชน์ที่: http://rocky.eld.leidenuniv.nl/ ประกอบด้วยคำแนะนำที่ให้ข้อมูลที่เป็นประโยชน์ในการทำงานกับโปรแกรม คำถามที่พบบ่อยที่น่าสนใจ และยังมีข้อมูลเกี่ยวกับโปรแกรมเวอร์ชันใหม่อีกด้วย
หมายเหตุ 2เราต้องไม่ลืมสิ่งนั้น ไม่มีไฟร์วอลล์ไม่สามารถรับประกันความปลอดภัยในการทำงานของคอมพิวเตอร์ของคุณบนอินเทอร์เน็ตได้ 100% อย่างไรก็ตาม การป้องกันไฟร์วอลล์ไม่สามารถละเลยได้ เราต้องทำทุกสิ่งตามอำนาจของเราเพื่อที่จะวางใจในความเมตตาของพระเจ้า “เว้นแต่องค์พระผู้เป็นเจ้าทรงพิทักษ์รักษาเมือง ยามก็เฝ้าดูอย่างเปล่าประโยชน์”(สดุดี 126:1)
ที่มาของบทความ
ฉันเขียนบล็อกโพสต์เกี่ยวกับพื้นฐาน กฎของ IPtablesสำหรับผู้ใช้ที่ใช้งานจริงมานานแล้ว และคุณควรอ่านบทความนี้และบทความที่เกี่ยวข้องกับ Stateful Firewall
แต่พรีเคอร์เนล 2.6.39 (ซึ่งรวมถึงและคุณสามารถใช้มันเพื่อไวท์ลิสต์ IP หากคุณมีมากกว่า 10 รายการที่ไวท์ลิสต์ (โดยที่ 10 เป็นรายการที่กำหนดเอง))
การตั้งค่า iptables สำหรับหุ่นจำลอง
สถานะการจัดการแรกที่เรารู้ว่าเราต้องการยอมรับหรือลบและอินเทอร์เฟซ
หากคุณเพียงต้องการอนุญาตเฉพาะ IP เท่านั้นไม่มีสถานะ
คุณมักจะประสบปัญหาที่เกี่ยวข้องกับเรื่องนี้และฉันขอแนะนำให้ใช้เงื่อนไขเพื่อทำให้ชีวิตของคุณง่ายขึ้น เช่นไม่ได้รับการแก้ไขและจะทำให้เกิดปัญหากับการใช้งานบางอย่างอย่างแน่นอน
Iptables มีหน้าที่หลักในการกรองแพ็กเก็ต การตั้งค่า Iptablesด้วยตนเองเป็นงานที่ค่อนข้างยาก อย่าคาดหวังว่าจะเข้าใจสิ่งนี้ "อย่างรีบร้อน" โชคดีที่มีเครื่องมือมากมายที่สามารถช่วยคุณได้หากคุณยังไม่ทราบ iptables แต่จำเป็นต้องรักษาความปลอดภัยระบบอย่างเร่งด่วน: fwbuilder, firestarter, guarddog, arno firewall - โดยพื้นฐานแล้วนี่คือ GUI สำหรับ iptables ไม่มีคำตอบที่ชัดเจนว่าอันไหนดีกว่ากัน ทางเลือกเป็นของคุณ อย่างไรก็ตาม บทความในวันนี้จัดทำขึ้นเพื่อ iptables โดยเฉพาะ และแบ่งออกเป็นสองส่วน: ทฤษฎีและการปฏิบัติ คนที่ใจร้อนที่สุดสามารถทำภาคปฏิบัติให้เสร็จสิ้นได้ทันที แม้ว่าจะไม่แนะนำวิธีนี้ก็ตาม
ความสนใจ!การดำเนินการทั้งหมดกับ iptables ดำเนินการในนามของผู้ใช้ที่มีสิทธิ์!
ทฤษฎี
รูปแบบรายการ iptables iptables [-t table] [คำสั่ง] [การกระทำ] ตัวอย่าง: iptables -t filter -A INPUT ACCEPTการดำเนินการ
- ยอมรับ - ยอมรับแพ็คเกจ
- DROP - วางแพ็กเก็ต
- DNAT - แปลงที่อยู่ปลายทาง
- SNAT - เปลี่ยนที่อยู่ IP ขาออกในส่วนหัวของแพ็คเก็ต
- LOG - การบันทึกแพ็กเก็ตและเหตุการณ์
- MARK - ทำเครื่องหมายบนบรรจุภัณฑ์
- MASQUERADE - เปลี่ยนที่อยู่ IP ขาออกในส่วนหัวของแพ็กเก็ต (ความแตกต่างจาก SNAT - ทำงานกับ IP แบบไดนามิก)
- QUEUE - จัดคิวแพ็กเก็ตเพื่อการประมวลผล
- เปลี่ยนเส้นทาง - เปลี่ยนเส้นทางแพ็กเก็ต/โฟลว์ไปยังพอร์ตอื่น
- ปฏิเสธ - วางแพ็กเก็ต + แจ้งเตือน ระบบระยะไกลเกี่ยวกับเรื่องนั้น ว่าพัสดุของเธอถูกปฏิเสธ
- RETURN - หยุดแพ็กเก็ตที่เคลื่อนที่ไปตามสายโซ่ปัจจุบันและส่งคืนไปยังสายโซ่การโทร
ทีม
- -A - เพิ่มกฎให้กับเชน
- -D - ลบกฎออกจากห่วงโซ่
- -R - แทนที่กฎหนึ่งด้วยอีกกฎหนึ่ง
- -I - แทรกกฎใหม่
- -L - แสดงรายการกฎที่มีอยู่
- -F - รีเซ็ตกฎ
- -Z - รีเซ็ตตัวนับในห่วงโซ่ที่กำหนด
- -N - สร้างห่วงโซ่ใหม่ด้วยชื่อที่กำหนด
- -X - ลบเชน
- -P - ตั้งค่านโยบายเริ่มต้นสำหรับเชนที่เลือก
- -E - เปลี่ยนชื่อห่วงโซ่ผู้ใช้
เกณฑ์ (ทั่วไป)
- -p - ระบุประเภทโปรโตคอล
- -s - ที่อยู่ IP ของแพ็กเก็ตต้นทาง
- -d - ที่อยู่ IP ของผู้รับแพ็กเก็ต
- -j - ระบุการดำเนินการสำหรับกฎ
- -i - อินเทอร์เฟซที่ได้รับแพ็กเก็ต
- -o - ระบุชื่อของอินเทอร์เฟซเอาต์พุต
- -f - เผยแพร่กฎไปยังทุกส่วนของแพ็กเก็ต
เกณฑ์ TCP:
- –tcp-flags - กำหนดแพ็คเก็ตมาสก์และแฟล็ก
เกณฑ์ UDP:
- –sport - พอร์ตที่ใช้ส่งแพ็กเก็ต
- –dport - พอร์ตที่แพ็คเก็ตถูกกำหนดที่อยู่
รายละเอียดเพิ่มเติมใน man iptables
ฝึกฝน
$ sudo iptables -L Chain INPUT (ยอมรับนโยบาย) เป้าหมาย prot เลือกต้นทางปลายทาง Chain FORWARD (ยอมรับนโยบาย) เป้าหมาย prot เลือกต้นทางปลายทาง Chain OUTPUT (ยอมรับนโยบาย) เป้าหมาย prot เลือกปลายทางต้นทาง
หากคุณเห็นสิ่งนี้ แสดงว่าไฟร์วอลล์ของคุณยังไม่ได้กำหนดค่าและอนุญาตทุกอย่าง มาแก้ไขสถานการณ์กันเถอะ
การตั้งค่านโยบายเริ่มต้น
- iptables -P INPUT DROP - บล็อกแพ็กเก็ตขาเข้า
- iptables -P OUTPUT ACCEPT - อนุญาตแพ็กเก็ตขาออก
- iptables -P FORWARD DROP - การประมวลผลแพ็กเก็ตที่เข้าถึงเซิร์ฟเวอร์จากเครื่องอื่นและกำลังรอการส่งต่อเพิ่มเติม ในตัวอย่างมันถูกบล็อก ในกรณีนี้ คุณจะต้องเพิ่มกฎสำหรับเครื่องที่เชื่อถือได้
เนื่องจากแพ็กเก็ต INPUT ขาเข้าถูกบล็อก เราจะเขียนกฎต่อไปนี้:
$ sudo iptables -A อินพุต -m state - สถานะที่เกี่ยวข้อง ก่อตั้งแล้ว -j ยอมรับ
ซึ่งจะอนุญาตให้ยอมรับแพ็กเก็ตจากการเชื่อมต่อที่สร้างไว้ก่อนหน้านี้และยอมรับแพ็กเก็ตใหม่ที่สร้างโดยการเชื่อมต่อนี้
หรือระบุประเภทโปรโตคอล:
$ sudo iptables -A INPUT -p TCP -m state - state ก่อตั้งแล้ว, เกี่ยวข้อง -j ยอมรับ $ sudo iptables -A INPUT -p UDP -m state - state ก่อตั้งแล้ว, เกี่ยวข้อง -j ยอมรับ
ตอนนี้อินเทอร์เฟซท้องถิ่น:
$ sudo iptables -A อินพุต -i lo -j ยอมรับ
- ใหม่ - ข้อมูลเริ่มต้นการเชื่อมต่อใหม่
- สร้างขึ้น - แพ็กเก็ตที่มาจากการเชื่อมต่อที่สร้างไว้แล้ว
- ที่เกี่ยวข้อง - แพ็กเก็ตข้อมูลใหม่ แต่สร้างขึ้นโดยการเชื่อมต่อที่สร้างไว้เก่า
- ไม่ถูกต้อง - จึงชัดเจน
$ sudo iptables-save > /etc/iptables.up.rules
เปิดใช้งานกฎเหล่านี้:
$sudo iptables-เรียกคืน< /etc/iptables.up.rules
และดูความแตกต่าง:
$sudo iptables -L
เรียกใช้ iptables เมื่อเริ่มต้นระบบ:
ในไดเร็กทอรี /etc/init.d ให้สร้างไฟล์ชื่อ iptables
$ sudo touch /etc/init.d/iptables
เราเขียนสิ่งต่อไปนี้ลงไป:
#!/bin/sh /sbin/iptables-restore< /etc/iptables.up.rules
การทำให้ไฟล์ iptables ปฏิบัติการได้:
$ sudo chmod +x /etc/init.d/iptables
เพิ่มไปที่การทำงานอัตโนมัติ
$ sudo update-rc.d -n ค่าเริ่มต้นของ iptables
เรียกใช้ iptables เมื่อเชื่อมต่อกับเครือข่าย:
$ sudo echo "#! /sbin/iptables-restore"> /etc/network/if-up.d/iptables.up.rules $ sudo iptables-save >> /etc/network/if-up.d/iptables up.rules $ sudo chmod +x /etc/network/if-up.d/iptables.up.rules
บันทึก:คุณสามารถตรวจสอบว่ากฎของคุณโหลดได้ตลอดเวลาหรือไม่โดยเพียงแค่ป้อน iptables-save as root
สำหรับ Archlinux การบันทึกกฎ iptables ทำได้โดยใช้คำสั่ง:
$ sudo rc.d บันทึก iptables