iptables: วิธีกำหนดค่าไฟร์วอลล์ Linux เพื่อปกป้องเซิร์ฟเวอร์ของคุณ

iptables: วิธีกำหนดค่าไฟร์วอลล์ Linux

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

คุณสมบัติหลักของ iptables

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

iptables เป็นไฟร์วอลล์ที่รวมอยู่ในระบบ Linux ตั้งแต่เวอร์ชัน 2.4 ดังนั้นจึงมีการติดตั้งในตัวโดยค่าเริ่มต้นในระบบเช่น Debian, Ubuntu, Linux Mint และอื่นๆ อีกมากมาย แม้ว่าในปัจจุบัน nftables จะถูกใช้เป็นการภายใน เนื่องจาก iptables ถือว่าเก่า แม้ว่าในปัจจุบัน iptables จะเป็น ยังคงใช้กันอย่างแพร่หลายในโลกของการดูแลระบบ Linux และในโลกของการดูแลระบบเครือข่าย

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

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

การดำเนินงานและสถาปัตยกรรม

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

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

โดยค่าเริ่มต้น เรามีทั้งหมดสี่ตาราง:

  • ตารางตัวกรอง : เป็นตารางเริ่มต้น หากเราไม่กำหนดตารางเพื่อเพิ่มกฎ ตารางจะไปที่ตารางตัวกรองเสมอ ในตารางนี้ เรามีกลุ่มเริ่มต้นทั้งหมดสามกลุ่ม ขึ้นอยู่กับว่าเราสนใจอะไร เราจะต้องใช้เชนอย่างใดอย่างหนึ่ง: INPUT (นี่คือแพ็กเก็ตในทิศทางขาเข้า ไปยังไฟร์วอลล์เอง), OUTPUT (พวกมันคือ แพ็กเก็ตขาออก จากเซิร์ฟเวอร์ออก) และ FORWARD (ใช้เพื่อกรองแพ็กเก็ตที่ย้ายจากอินเทอร์เฟซเครือข่ายหนึ่งไปยังอีกอินเทอร์เฟซหนึ่ง)
  • ชัยนาท ตาราง: ตารางนี้มีหน้าที่ในการทำ NAT โดยเปลี่ยน IP ส่วนตัวให้เป็นสาธารณะและในทางกลับกัน ภายใน NAT เรามีสามเชน: PREROUTING (เปลี่ยนแพ็กเก็ตก่อนกำหนดเส้นทาง ที่นี่ DNAT หรือการส่งต่อพอร์ตเสร็จสิ้น), POSTROUTING (เปลี่ยนแพ็กเก็ตหลังจากกำหนดเส้นทาง ที่นี่ SNAT หรือ MASQUERADE เสร็จสิ้น) และ OUTPUT (แพ็กเก็ตที่สร้างโดยไฟร์วอลล์ที่กำหนดค่า NAT จะข้าม)
  • ฉีก ตาราง: ตารางนี้มีหน้าที่ในการเปลี่ยนแปลงแพ็กเก็ต ซึ่งเป็นที่ที่ QoS ได้รับการกำหนดค่าสำหรับคุณภาพของบริการ การเปลี่ยนแปลงส่วนหัว TCP ฯลฯ ในตารางนี้ เรามีห้าเชน: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
  • ดิบ ตาราง – ตารางนี้ไม่ได้ใช้บ่อยเนื่องจากแพ็กเก็ตเดินทางโดยไม่มีสถานะการเชื่อมต่อ เรามีลูกโซ่ PREROUTING และ OUTPUT

ในภาพต่อไปนี้ คุณสามารถดูบทสรุปเล็กๆ ของเชนที่เรามีในตารางต่างๆ:

การดำเนินการเมื่อเพิ่มกฎจะเป็นดังนี้:

  • กฎที่เราเพิ่มไปยังเชนมักมีเป้าหมาย (-j ในกฎ)
  • เมื่อไฟร์วอลล์ได้รับแพ็กเก็ต มันจะตรวจสอบว่าแพ็กเก็ตตรงกับกฎที่เราสมัครเข้าร่วมหรือไม่ หากตรงกัน คำสั่งเป้าหมายจะถูกดำเนินการ มิฉะนั้น จะไปยังกฎถัดไปจนกว่าจะสิ้นสุดห่วงโซ่
  • กฎจะได้รับการตรวจสอบตามลำดับตั้งแต่กฎข้อแรกจนถึงกฎข้อสุดท้าย ลำดับมีความสำคัญมาก หากเราบล็อกทุกอย่างก่อนแล้วจึงอนุญาตบางอย่างที่เฉพาะเจาะจงมากขึ้น เราจะบล็อกการรับส่งข้อมูลทั้งหมดและกฎที่เจาะจงที่สุดจะไม่ถูกตรวจสอบ
  • ในกรณีที่ไม่มีกฎใดที่ตรงตามแพ็กเก็ต นโยบายของลูกโซ่ที่เรามี (กฎสากล) จะถูกนำมาใช้

วัตถุประสงค์ของกฎที่แตกต่างกันมีดังนี้:

  • ยอมรับ: ยอมรับแพ็กเก็ตและส่งผ่านไปยังระดับถัดไป, เว็บเซิร์ฟเวอร์, SSH, FTP เป็นต้น
  • DROP: บล็อกแพ็กเก็ตและไม่ส่งต่อไปยังระดับถัดไป
  • QUEUE: เป็นเป้าหมายพิเศษซึ่งส่งผ่านแพ็กเก็ตในคิวสำหรับการประมวลผลพื้นที่ผู้ใช้ สามารถใช้เพื่อเรียกใช้โปรแกรมภายนอกอื่นๆ
  • RETURN: มีผลเหมือนกับว่าเราได้มาถึงจุดสิ้นสุดของห่วงโซ่ หากกฎอยู่ในห่วงโซ่เริ่มต้นอย่างใดอย่างหนึ่ง นโยบายของลูกโซ่จะถูกดำเนินการ สำหรับกฎที่อยู่ในสายที่ผู้ใช้กำหนด กฎนั้นจะถูกออก ดำเนินการต่อผ่านสายโซ่ก่อนการกระโดด หลังจากกฎที่กระโดดด้วย

เมื่อเราทราบวิธีการทำงานและสถาปัตยกรรมแล้ว เราจะเห็นคำสั่งต่างๆ เพื่อดำเนินการต่างๆ

 

คำสั่งที่จำเป็นในการใช้ iptables

สิ่งแรกที่เราต้องคำนึงถึงเมื่อกำหนดค่าไฟร์วอลล์นี้คือ เราต้องการสิทธิ์ผู้ใช้ระดับสูงเพื่อดำเนินการตามคำสั่งต่างๆ จำเป็นอย่างยิ่งสำหรับพวกเขาที่จะเรียกใช้ มิฉะนั้น มันจะไม่ทำงาน คำสั่งต่อไปนี้ไม่มี "sudo" เพราะเราคิดว่าคุณเป็น superuser อยู่แล้ว (sudo su)

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

  • sudo iptables -F
  • sudo iptables -X
  • sudo iptables -t แนท -F
  • sudo iptables -t แนท -X
  • sudo iptables -t mangle -F
  • sudo iptables -t mangle -X
  • sudo iptables -P อินพุตยอมรับ
  • sudo iptables -P ไปข้างหน้ายอมรับ
  • sudo iptables -P เอาต์พุตที่ยอมรับ

เมื่อเราดำเนินการเสร็จแล้ว เราจะมีไฟร์วอลล์ "รีเซ็ต" และอนุญาตทุกอย่าง เมื่อเรารู้วิธีรีเซ็ตแล้ว มาดูคำสั่งต่างๆ กัน

 

ดูตารางปัจจุบัน

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

  • iptables -t ตัวกรอง – รายการ
  • iptables -t mangle –รายการ
  • iptables -t แนท – รายการ
  • iptables -t ดิบ –list

 

อาร์กิวเมนต์หลักและสิ่งที่พวกเขามีไว้เพื่อ

  • -t, –table table เลือกตารางที่เราต้องการ
  • -A, – ผนวกข้อกำหนดกฎลูกโซ่ เราเพิ่มกฎใหม่ในบางลูกโซ่
  • -C, –check chain rule ข้อกำหนด เราตรวจสอบว่ามีกฎบางอย่างใน chain ใด
  • -D, –delete chain rule ข้อกำหนด เราลบกฎที่เราใส่ใน chain ที่แน่นอน
  • -D, –delete chain rulenum เราลบกฎหมายเลข X ในบาง chain
  • -I, –insert chain [rulenum] rule-specification เราใส่ chain ใหม่ด้วยตัวเลขในตารางที่แน่นอน
  • -R, –replace chain rule rule-specification แทนที่ chain ที่กำหนดในตาราง ใช้เพื่อย้ายหมายเลข
  • -L, –list [chain] แสดงรายการกฎของ chain
  • -F, –flush [chain] ล้างกฎทั้งหมดจาก chain ที่กำหนด
  • -Z, –zero [chain [rulenum]] ตั้งค่าตัวนับของกฎที่กำหนดเป็น 0
  • -N, –new-chain chain เราสร้าง chain ใหม่ในตารางที่แน่นอน
  • -X, –delete-chain [chain] เราลบบาง chain (ว่าง) ในบางตาราง
  • -P, – เป้าหมายลูกโซ่นโยบาย เราใช้นโยบายเริ่มต้น จะสำเร็จเมื่อไม่มีการปฏิบัติตามกฎของลูกโซ่
  • -E, –rename-chain old-chain new-chain เปลี่ยนชื่อ chain ที่เพิ่มไว้ก่อนหน้านี้
  • -h แสดงความช่วยเหลือ
  • -v, –verbose Output ที่ใช้ร่วมกับ –L เพื่อแสดงข้อมูลมากกว่าที่คำสั่ง –L ให้มา
  • -n, –ที่อยู่ IP ที่เป็นตัวเลขและหมายเลขพอร์ตจะปรากฏเป็นตัวเลข ตัวอย่างเช่น หากเรากรองพอร์ต 80 โดยปกติ –L www จะปรากฏขึ้น ไม่ใช่ 80
  • -x, –exact แสดงค่าที่แน่นอนของตัวนับแพ็คเก็ตและไบต์ แทนที่จะใช้ K, M หรือ G สำหรับค่า
  • –line-numbers เมื่อแสดงรายการกฎจะแสดงจำนวนกฎที่แน่นอน เหมาะอย่างยิ่งสำหรับการใช้ –D และตัวเลข (ลบ) หรือ –I เพื่อแนะนำก่อนหรือหลังกฎดังกล่าว

 

เงื่อนไขหลัก

  • -p , –โปรโตคอลโปรโตคอล กรองแพ็กเก็ตตามโปรโตคอล โปรโตคอลที่ระบุสามารถเป็น: tcp, udp, Idplite, icmp, esp, ah, sctp
  • -s , –source address[/mask][,…] ที่อยู่ IP ต้นทางของแพ็กเก็ต เราสามารถมี IP หรือซับเน็ต (ระบุมาสก์ในรูปแบบ CIDR) เราสามารถใส่ชื่อโฮสต์ (โดเมน เว็บไซต์ ฯลฯ) ได้ แต่เป็นความคิดที่ไม่ดีเพราะไม่มีประสิทธิภาพ สามารถระบุที่อยู่แหล่งที่มาได้หลายรายการ (192.168.1.1,192.168.1.2) แต่จะสร้างกฎที่แตกต่างกันเพื่อให้เป็นไปตามข้อกำหนด
  • -d , –destination address[/mask][,…] ที่อยู่ IP ปลายทางของแพ็กเก็ต มันทำงานเหมือนกับ -s
  • -m , – แมตช์ตรงกัน ระบุว่าเราต้องการเรียกโมดูลเสริมของ iptables เพื่อดำเนินการบางอย่างเช่น:
    • ใส่พอร์ตต้นทางและปลายทางหลายพอร์ต (โมดูลหลายพอร์ต)
    • ควบคุมการเชื่อมต่อ (โมดูล conntrack)
    • หลีกเลี่ยงกำลังดุร้าย (โมดูลล่าสุด เหมาะสำหรับ SSH)
    • จำกัดจำนวนการเชื่อมต่อ (modulo limit และ connlimit)
    • ช่วงที่อยู่ IP (iprange)
  • -j , –กระโดดเป้าหมาย ระบุวัตถุประสงค์ของกฎ หากเราต้องการยอมรับ ปฏิเสธ และแม้กระทั่งส่งต่อแพ็กเก็ตไปยังสายโซ่อื่นเพื่อดำเนินการต่อไป ในทุกกฎเราจะมี -j เพื่อบอกว่าเราต้องการทำอะไร หากเราไม่เพิ่ม –j กฎจะถูกเพิ่มและจะนับแพ็กเก็ต แต่จะไม่ทำอะไรเลย หากเราใช้ -j เพื่อส่งต่อไปยังอีกสายหนึ่ง เมื่ออีกสายหนึ่งเสร็จสิ้น มันจะกลับไปที่สายเดิม
  • -g , –goto โซ่ ใช้เพื่อส่งต่อการจราจรไปยังอีกโซ่หนึ่ง แต่ต่างจากการกระโดด มันจะไม่กลับไปที่โซ่เดิมที่มันเข้ามา
  • -i , –ชื่อในอินเทอร์เฟซ ชื่อของอินเทอร์เฟซซึ่งได้รับแพ็กเก็ต ใช้งานได้กับสตริงอินพุตเช่น INPUT, FORWARD และ PREROUTING เท่านั้น ถ้าเราใส่มันหมายถึงทั้งหมดยกเว้นส่วนต่อประสานนั้น หากเราใส่เครื่องหมาย + ที่ส่วนท้ายของชื่อ อินเทอร์เฟซใดๆ ที่มีส่วนต้นของชื่อจะคว้าไว้เพื่อตรวจสอบ ลองนึกภาพ eth0, eth1 และ eth2 หากเราต้องการใส่ทั้งสามอย่าง เพียงแค่ใส่ eth+ ก็เพียงพอแล้ว
  • -o , – ชื่อภายนอก ชื่อของอินเทอร์เฟซที่แพ็กเก็ตออก ใช้ได้เฉพาะกับสตริงเอาต์พุต เช่น OUTPUT, FORWARD และ POSTROUTING

 

เงื่อนไขเฉพาะเมื่อคุณใช้ TCP หรือ UDP

หากคุณใช้โปรโตคอล TCP หรือ UDP คุณอาจต้องการกรองตามหมายเลขพอร์ตต้นทางและ/หรือปลายทาง จากนั้นคุณมีอาร์กิวเมนต์ XNUMX ตัวที่สามารถใช้ได้:

  • –sport –แหล่งพอร์ต. เลือกพอร์ตต้นทางเพื่ออนุญาตหรือปฏิเสธ ถ้าเราใช้ ! ไม่รวม
  • –dport –ปลายทาง-พอร์ต. เลือกพอร์ตปลายทางที่จะอนุญาตหรือปฏิเสธ ถ้าเราใช้ ! ไม่รวม

มีเงื่อนไขอีกมากมายสำหรับการกำหนดค่าขั้นสูงของไฟร์วอลล์ แต่เราได้ระบุเงื่อนไขเบื้องต้นไว้แล้ว

 

กำหนดนโยบายเริ่มต้น

นโยบายถูกใช้เพื่อที่ว่าเมื่อไม่พบกฎภายในเชน นโยบายเริ่มต้นจะถูกดำเนินการ นโยบายเริ่มต้นสำหรับเครือทั้งหมดคือ ACCEPT แต่มีสองตัวเลือก: ACCEPT หรือ DROP

-P, –เป้าหมายลูกโซ่นโยบาย

ตัวอย่าง:

  • iptables -P อินพุตลดลง
  • iptables -P ไปข้างหน้า DROP
  • iptables -P เอาท์พุทดรอป

ด้วยวิธีนี้ อินเทอร์เน็ตจะหมด ดังนั้น ต่อไป เราต้องเริ่มสร้างกฎที่อนุญาต

ด้านล่างนี้ คุณสามารถดูนโยบายทั้งหมดที่เรามีในตารางต่างๆ:

  • iptables -t filter -P (INPUT | OUTPUT | ไปข้างหน้า) (ACCEPT | DROP)
  • iptables -P (INPUT | OUTPUT | ไปข้างหน้า) (ยอมรับ | DROP)
  • iptables -t mangle -P (INPUT | OUTPUT | ไปข้างหน้า | PREROUTING | POSTROUTING) (ยอมรับ | DROP)

 

ดูสถานะไฟร์วอลล์

พารามิเตอร์ -L แสดงกฎที่เรากำหนดค่าไว้ V ช่วยให้คุณได้รับข้อมูลเพิ่มเติมเกี่ยวกับการเชื่อมต่อและ N ส่งคืนที่อยู่ IP และพอร์ตที่เกี่ยวข้องโดยไม่ต้องผ่านa DNS เซิร์ฟเวอร์

  • iptables -L -n -v

นี่เป็นหนึ่งในคำสั่งที่สำคัญที่สุดในการดูสถานะของไฟร์วอลล์

 

โมดูล (-m ตรงกัน) ของ iptables

 

หลายพอร์ต

เป็นส่วนขยายของ iptables ที่ช่วยให้เราสามารถจัดกลุ่มกฎที่คล้ายคลึงกันด้วยพอร์ต TCP และ UDP ที่แตกต่างกันในที่เดียว Multiport อนุญาตให้คุณข้ามพอร์ตหลายพอร์ต และพอร์ตหลายพอร์ตในแถวเดียวกัน อาร์กิวเมนต์พอร์ตสูงสุดคือ 15 พอร์ต ตัวอย่าง:

  • iptables –A INPUT –p tcp –m หลายพอร์ต –dports 80,81,1000:1200 –j ยอมรับ

ด้วยโมดูลนี้ เราจึงสามารถใช้พอร์ตหลายพอร์ตในกฎเดียวกันได้

 

ไอปราง

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

  • [!]–src-ช่วง ip-ip
  • [!]–dst-ช่วง ip-ip

การทำงานของกฎนี้ค่อนข้างง่าย เราเพียงแค่ใส่ IP เริ่มต้นและ IP สิ้นสุด

 

ลิมิตสวิตช์

โมดูล connlimit มีหน้าที่จำกัดจำนวนการเชื่อมต่อพร้อมกันที่ทำโดยที่อยู่ IP ซึ่งเหมาะสำหรับการจำกัดจำนวนการเชื่อมต่อเพื่อหลีกเลี่ยง DoS

  • –connlimit-upto n เราตรวจสอบว่าจำนวนการเชื่อมต่อเท่ากับหรือน้อยกว่า N (จากนั้นเราสามารถอนุญาตหรือปฏิเสธได้)
  • –connlimit- เหนือ n เราตรวจสอบว่าจำนวนการเชื่อมต่อมากกว่า N (จากนั้นเราสามารถอนุญาตหรือปฏิเสธได้)
  • –connlimit-mask prefix_length . เราทำเครื่องหมายตามช่วงซับเน็ต (เหมือนกับโฮสต์ที่ทำการเชื่อมต่อ 2 รายการ โฮสต์ 1 รายการบนเครือข่ายย่อยเดียวกัน สร้างการเชื่อมต่อ XNUMX รายการต่อรายการ)
  • –connlimit-saddr . ใช้ข้อจำกัดกับกลุ่มที่มา ซึ่งเป็นค่าเริ่มต้นหากไม่มีการระบุ
  • –connlimit-daddr . ใช้ข้อจำกัดกับกลุ่มเป้าหมาย

ตัวอย่างเช่น สมมติว่าเราต้องการอนุญาตการเชื่อมต่อ SSH สองรายการต่อลูกค้าหนึ่งราย:

  • iptables -A อินพุต -p tcp –dport 22 -m connlimit –connlimit-เหนือ 2 -j DROP

อย่างไรก็ตาม เราสามารถสร้างกฎเสริมได้ โดยยอมรับคนรู้จักสูงสุด 2 คน

 

คอนแทรค

โมดูลนี้ใช้เพื่อติดตามการเชื่อมต่อ มันถูกใช้เพื่อจัดการอินพุตและเอาต์พุตของแพ็กเก็ตก่อนและหลังการสร้างการเชื่อมต่อ ภายในโมดูลนี้มีหลายตัวเลือก แต่ที่สำคัญที่สุดคือ -ctstate ซึ่งช่วยให้เรายอมรับหรือปฏิเสธแพ็กเก็ตประเภทต่างๆ ภายใน ctstate เรามีหลายรัฐ สิ่งต่อไปนี้โดดเด่น:

  • ไม่ถูกต้อง: แพ็กเก็ตที่ได้รับไม่ถูกต้องและไม่ได้อยู่ในการเชื่อมต่อใดๆ
  • ใหม่: การเชื่อมต่อใหม่ที่สร้างขึ้น หรือที่เกี่ยวข้องกับการเชื่อมต่อที่ยังไม่ได้เป็นแบบสองทิศทาง
  • จัดตั้งขึ้น: สร้างการเชื่อมต่อแล้ว พวกเขาต้องผ่าน NEW ก่อนเนื่องจากได้รับการตอบกลับ
  • ที่เกี่ยวข้อง: แพ็กเก็ตที่เกี่ยวข้องกับแต่ไม่ได้เป็นส่วนหนึ่งของการเชื่อมต่อที่มีอยู่ เช่น FTP แบบพาสซีฟ

ลองนึกภาพว่าเราต้องการเข้าถึงไซต์ใด ๆ อย่างไรก็ตาม เราไม่ต้องการให้ใครเข้าถึงเราโดยเด็ดขาด

  • iptables –P อินพุตลดลง
  • iptables -A INPUT -m conntrack –ctstate ESTABLISHED, RELATED -j ยอมรับ

 

ลิมิตสวิตช์

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

  • – จำกัด N อาร์กิวเมนต์นี้ระบุจำนวนสูงสุดของการจับคู่เฉลี่ยต่อวินาที (N/s), นาที (N/m), ชั่วโมง (N/h) หรือวัน (N/d) ที่จะอนุญาต N ระบุจำนวน
  • –limit-burst N . ระบุการระเบิดที่ยาวที่สุดที่อาจเกิดขึ้นได้ก่อนตรวจสอบขีดจำกัด –limit

ค่าเริ่มต้นหากไม่มีการระบุใดๆ คือ 3 แมตช์ต่อชั่วโมง แบ่งเป็น 5 ครั้ง ลองนึกภาพกฎต่อไปนี้: “iptables -A INPUT -m limit -j LOG” การดำเนินการจะเป็นดังนี้:

  • ครั้งแรกที่กฎนี้ถูกโจมตี ห้าแพ็กเก็ตแรกจะถูกบันทึก
  • หลังจากนั้นจะใช้เวลายี่สิบนาทีก่อนที่จะลงทะเบียนแพ็คเก็ตใหม่ด้วยกฎนี้ (3 แมตช์ระหว่าง 60 นาทีเท่ากับ 20 นาทีเนื่องจากเป็นค่าเฉลี่ย)
  • นอกจากนี้ ทุกๆ XNUMX นาทีที่ผ่านไปโดยไม่มีแพ็กเก็ตที่เป็นไปตามกฎ การระเบิดจะดึงแพ็กเก็ตออกมา
  • หากไม่มีอะไรเกิดขึ้นเป็นเวลา 100 นาที การระเบิดจะถูกชาร์จจนเต็ม แล้วกลับสู่สถานการณ์เริ่มต้น

 

เมื่อเร็ว ๆ นี้

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

  • iptables -A INPUT -p tcp –dport 22 -m conntrack –ctstate NEW -m ล่าสุด –set –name ssh –rsource
  • iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m ล่าสุด –rcheck –seconds 60 –hitcount 4 –name ssh –rsource -j DROP

กฎนี้อนุญาตให้พยายามเชื่อมต่อได้เพียงสี่ครั้งภายใน 60 วินาที ซึ่งเป็นหน้าต่าง "เลื่อน"

 

NAT

ไฟร์วอลล์นี้มีหน้าที่รับผิดชอบ NATing การเชื่อมต่อของเรา ในการสร้าง NAT ของ IP สาธารณะของเรา (หรืออินเทอร์เฟซที่มี IP สาธารณะนี้) เราต้องใส่:

  • SNAT แบบคงที่: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 –o eth1 -j SNAT –to IP_eth1
  • SNAT แบบไดนามิก: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

สิ่งปกติคือการใช้ MASQUERADE เพื่อทำ NAT โดยไม่คำนึงถึงที่อยู่ IP ที่อินเทอร์เฟซทางกายภาพหรือทางลอจิคัลมี

ในการเปิดพอร์ต เราต้องเพิ่มกฎในสาย PREROUTING ของตาราง NAT

  • iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 22 -j DNAT –สู่ปลายทาง 192.168.1.1

ตาราง PREROUTING ยังช่วยให้เราปรับเปลี่ยนพอร์ตได้ทันที ดังนั้นหากเราได้รับแพ็กเก็ตที่พอร์ต 2121 เราก็สามารถเปลี่ยนเป็น 21 ได้

  • iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 2121 -j DNAT –สู่ปลายทาง 192.168.1.1:21

เมื่อเราทราบรายละเอียดเกี่ยวกับไฟร์วอลล์แล้ว เราจะไปดูตัวอย่างการใช้งานเบื้องต้นและตัวอย่างขั้นสูงสุด

 

ตัวอย่างการใช้งานเบื้องต้น

ไฟร์วอลล์นี้มีความสมบูรณ์มาก และเรามีคำสั่งหลายร้อยคำสั่งที่เราสามารถดำเนินการเพื่อดำเนินการต่างๆ ได้ ในบทความนี้เราจะให้ตัวอย่างที่เข้าใจง่ายสำหรับแนวทางแรกในไฟร์วอลล์นี้

บล็อกที่อยู่ IP 192.168.1.10 ไม่ให้สื่อสารกับเซิร์ฟเวอร์ของเรา:

  • iptables -A อินพุต –s 192.168.1.10 –j DROP

บล็อกที่อยู่ IP 192.168.1.20, 192.168.1.30, 192.168.1.40, 192.168.1.50 จากการสื่อสารใด ๆ ไปยังเซิร์ฟเวอร์ของเรา:

  • iptables -A อินพุต –s 192.168.1.20,192.168.1.30,192.168.1.40,192.168.1.50 –j DROP

บล็อกซับเน็ต 192.168.2.0/24 ทั้งหมดไม่ให้สื่อสารกับเซิร์ฟเวอร์ของเรา ยกเว้นที่อยู่ IP 192.168.2.20 ซึ่งจะได้รับอนุญาต:

  • iptables –A INPUT –s 192.168.2.20 –j ยอมรับ
  • iptables –A อินพุต –s 192.168.2.0/24 –j DROP

บล็อกที่อยู่ IP 192.168.4.50 เพื่อให้เราไม่สามารถทำการสื่อสารใด ๆ ได้:

  • iptables –A เอาต์พุต –d 192.168.4.50 –j DROP

บล็อกที่อยู่ IP 192.168.4.51 และ 192.168.4.52 เพื่อให้เราไม่สามารถทำการสื่อสารใด ๆ ได้:

  • iptables –A เอาต์พุต –d 192.168.4.51,192.168.4.52 –j DROP

บล็อกการเข้าถึง www.google.es จาก iptables:

  • iptables –A เอาต์พุต –d www.google.es –j DROP

เราต้องการบล็อกการเข้าถึงเซิร์ฟเวอร์ของเราจาก MAC 00:01:02:03:04:05 น. และส่วนที่เหลืออนุญาตทุกอย่าง:

  • iptables -A INPUT -m mac –mac-source 00:01:02:03:04:05 -j DROP

เราต้องการอนุญาตให้เข้าถึงเซิร์ฟเวอร์ของเราไปยังที่อยู่ MAC MAC 00:01:02:03:04:06 น. และส่วนที่เหลือปฏิเสธทุกอย่าง:

  • iptables -A INPUT -m mac –mac-source 00:01:02:03:04:05 -j ยอมรับ
    iptables -A อินพุต -j DROP

บล็อกที่อยู่ IP 192.168.1.10 สำหรับการ ping จากเซิร์ฟเวอร์ของเรา:

  • iptables -A อินพุต -s 192.168.1.10 -p icmp -j DROP

บล็อกที่อยู่ IP 192.168.1.20, 192.168.1.30, 192.168.1.40, 192.168.1.50 จาก PING เซิร์ฟเวอร์ของเรา (ในกฎเดียว):

  • iptables -A อินพุต -s 192.168.1.20,192.168.1.30,192.168.1.40,192.168.1.50 -p icmp -j DROP

บล็อกซับเน็ต 192.168.2.0/24 ทั้งหมดเพื่อไม่ให้ PING เซิร์ฟเวอร์ของเรา ยกเว้นที่อยู่ IP 192.168.2.20 ซึ่งจะได้รับอนุญาต:

  • iptables -A INPUT -s 192.168.2.20 -p icmp -j ยอมรับ
    iptables -A อินพุต -s 192.168.2.0/24 -p icmp -j DROP

บล็อกที่อยู่ IP 192.168.4.50 เพื่อให้เราไม่สามารถ ping ได้

  • iptables -A เอาต์พุต -d 192.168.4.50 -p icmp -j DROP

บล็อกที่อยู่ IP 192.168.4.51 และ 192.168.4.52 เพื่อให้เราไม่สามารถ ping ได้

  • iptables -A เอาต์พุต -d 192.168.4.51,192.168.4.52 -p icmp -j DROP

บล็อกการเข้าถึง www.google.es จาก iptables

  • iptables -A เอาต์พุต -d www.google.es -p icmp -j DROP

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

บล็อกช่วงของที่อยู่ IP จาก 192.168.5.1 ถึง 192.168.5.50 จากการ ping จากเซิร์ฟเวอร์ของเรา

  • iptables -A เอาต์พุต -m iprange –dst-range 192.168.5.1-192.168.5.50 -p icmp -j DROP

เรายังกรองโปรโตคอล ICMP ด้วยวิธีขั้นสูงได้อีกด้วย สมมติว่าเรามีผู้ใช้ที่ต้องการ ping โฮสต์ใดก็ได้ แต่ไม่ต้องการให้ใครสามารถ ping เขาได้ เราจะใช้ iptables ได้อย่างไรหาก PING มีการสื่อสารแบบสองทิศทาง

  • iptables -A INPUT -s IP -p icmp –icmp-type echo-request -j DROP

บล็อกการเข้าถึงที่เข้ามาผ่านอินเทอร์เฟซ eth0 (เท่านั้น) จึงอนุญาตให้เข้าถึง eth1

  • iptables -A อินพุต -i eth0 -j DROP
  • iptables -A INPUT -i eth1 -j ยอมรับ

บล็อกการรับส่งข้อมูลขาออกบนอินเทอร์เฟซ eth0 (เท่านั้น) จึงอนุญาตให้เข้าถึง eth1

  • iptables -A เอาต์พุต -o eth0 -j DROP
  • iptables -A OUTPUT -o eth1 -j ยอมรับ

อนุญาตการรับส่งข้อมูลขาเข้าและขาออกบน eth0 และปฏิเสธการรับส่งข้อมูลขาเข้าหรือขาออกบน eth1

  • iptables -A INPUT -i eth0 -j ยอมรับ
  • iptables -A OUTPUT -o eth0 -j ยอมรับ
  • iptables -A อินพุต -i eth1 -j DROP
  • iptables -A เอาต์พุต -o eth1 -j DROP

หากคุณต้องการเริ่มดูว่าโปรโตคอล TCP และ UDP ทำงานอย่างไร นี่คือตัวอย่างบางส่วน:

บล็อกการเข้าถึงเว็บไปยัง www.google.es และอนุญาตทุกอย่าง (ping) เป็นต้น

  • iptables -A เอาต์พุต -d www.google.es -p tcp –dport 80 -j DROP

บล็อกการเข้าถึง FTP ไปยัง IP หรือโดเมนใดๆ และอนุญาตทุกอย่าง

  • iptables -A เอาต์พุต -p tcp –dport 21 -j DROP

บล็อกการเข้าถึง SSH กับ IP 192.168.1.50 และอนุญาตทุกอย่าง

  • iptables -A เอาต์พุต -d 192.168.1.50 -p tcp –dport 22 -j DROP

บล็อกไม่ให้ Telnet เข้าถึงซับเน็ต 192.168.2.0 และอนุญาตทุกอย่าง

  • iptables -A เอาต์พุต -d 192.168.2.0/24 -p tcp –dport 23 -j DROP

บล็อก 192.168.1.50 การเข้าถึงเว็บเซิร์ฟเวอร์ของเรา

  • iptables -A อินพุต -s 192.168.1.50 -p tcp –dport 80 -j DROP

บล็อก 192.168.1.150 และ 192.168.1.151 การเข้าถึงเซิร์ฟเวอร์ SSH ของเรา

  • iptables -A อินพุต -s 192.168.1.150,192.168.1.151 -p tcp –dport 22 -j DROP

บล็อกการเข้าถึงซับเน็ต 192.168.2.0/24 ทั้งหมดไปยังบริการ telnet ของเรา

  • iptables -A อินพุต -s 192.168.2.0/24 -p tcp –dport 23 -j DROP

บล็อกการเข้าถึงเซิร์ฟเวอร์ OpenVPN ของทุกคน ยกเว้นที่อยู่ IP 77.77.77.77 ซึ่งได้รับอนุญาต

  • iptables -A อินพุต -s 77.77.77.77 -p tcp –dport 1194 -j ยอมรับ
  • iptables -A อินพุต -p tcp –dport 1194 -j DROP

บล็อกการเข้าถึง DNS ไปที่ 8.8.8.8 และอนุญาตทุกอย่างอื่น (ping) เป็นต้น

  • iptables -A เอาต์พุต -d 8.8.8.8 -p tcp –dport 53 -j DROP
  • iptables -A เอาต์พุต -d 8.8.8.8 -p udp –dport 53 -j DROP

บล็อกการเข้าถึงพอร์ต 1194 ไปยัง IP หรือโดเมนใดๆ และอนุญาตทุกอย่าง

  • iptables -A อินพุต -p udp –dport 1194 -j DROP

เรามีเซิร์ฟเวอร์ DNS บนเซิร์ฟเวอร์ของเรา เราต้องการให้เฉพาะคอมพิวเตอร์บนซับเน็ต 192.168.1.0/24 เท่านั้นที่สามารถสื่อสารกับมันได้ และบล็อกการเข้าถึงอื่นๆ ทั้งหมด

  • iptables -A อินพุต -s 192.168.1.0/24 -p tcp –dport 53 -j ยอมรับ
  • iptables -A อินพุต -s 192.168.1.0/24 -p udp –dport 53 -j ยอมรับ
  • iptables -A อินพุต -p tcp –dport 53 -j DROP
  • iptables -A อินพุต -p udp –dport 53 -j DROP

บล็อกการเข้าถึงเว็บเซิร์ฟเวอร์ของเราจากช่วง IP 192.168.100.0/24 ที่มาจากอินเทอร์เฟซ eth0

  • iptables -A อินพุต -s 192.168.100.0/24 -i eth0 -p tcp –dport 80 -j DROP

บล็อกการเข้าถึงเซิร์ฟเวอร์ ssh ของเราจากช่วง IP 192.168.100.0/24 ที่มาจากอินเทอร์เฟซ eth1

  • iptables -A อินพุต -s 192.168.100.0/24 -i eth1 -p tcp –dport 22 -j DROP

 

ตัวอย่างการใช้งานขั้นสูง

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ iptables ต่อไปนี้คือตัวอย่างบางส่วนที่เราใช้ประโยชน์จากโมดูล connlimit

อนุญาตการเชื่อมต่อ Telnet 10 รายการต่อลูกค้าหนึ่งราย

  • iptables -A อินพุต -p tcp –dport 23 -m connlimit –connlimit-เหนือ 10 –connlimit-mask 32 -j DROP

ปฏิเสธการเชื่อมต่อหมายเลข 5 บนเว็บที่สร้างโดยลูกค้า (ไม่สมเหตุสมผลมาก แต่เป็นตัวอย่าง)

  • iptables -A อินพุต -p tcp –dport 80 -m connlimit –connlimit-upto 5 –connlimit-mask 32 -j DROP

อนุญาตการเชื่อมต่อ Telnet 10 รายการต่อลูกค้าหนึ่งราย (ทำต่างจากด้านบน)

  • iptables -A อินพุต -p tcp –dport 23 -m connlimit –connlimit-upto 10 –connlimit-mask 32 -j ยอมรับ
  • iptables -A อินพุต -p tcp –dport 23 -j DROP

อนุญาตเฉพาะการเชื่อมต่อเว็บ 10 รายการในช่วง IP 10.0.0.0/8 และปฏิเสธหากเกินจำนวนนี้

  • iptables -A อินพุต -s 10.0.0.0/8 -p tcp –dport 80 -m connlimit –connlimit-above 10 –connlimit-mask 8 -j DROP

อนุญาตการเชื่อมต่อ HTTP 20 รายการสำหรับแต่ละไคลเอ็นต์ ทันทีที่เกิน เราจะส่งการรีเซ็ต TCP

  • iptables -A INPUT -p tcp –dport 80 -m connlimit –connlimit-above 20 –connlimit-mask 32 -j REJECT –reject-with tcp-reset

หรือวิธีนี้:

  • iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 –connlimit-mask 32 -j REJECT –reject-with tcp-reset

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