หากคุณใช้ Linux คุณมีตัวเลือกมากมายในการปกป้องอุปกรณ์ของคุณ มันมาพร้อมกับ iptables ซึ่งเป็นยูทิลิตีไฟร์วอลล์แบบบรรทัดคำสั่งที่ให้ความยืดหยุ่นและการป้องกันที่ยอดเยี่ยม
อย่างไรก็ตาม เนื่องจากเป็นโปรแกรมอรรถประโยชน์บรรทัดคำสั่ง จึงต้องมีช่วงการเรียนรู้เล็กน้อย
ดังนั้น หากคุณเป็นผู้ดูแลระบบหรือผู้เรียนรู้ Linux คุณมาถูกที่แล้วเมื่อเราอ่านคำสั่ง iptables ทั่วไปพร้อมตัวอย่าง
iptables คืออะไร?
iptables เป็นไฟร์วอลล์ในตัว Linux ที่ใช้ซอฟต์แวร์ ช่วยให้ผู้ใช้ Linux สามารถสร้างหรือกำหนดนโยบายที่ส่งผลกระทบต่อการรับส่งข้อมูลทางอินเทอร์เน็ตทั้งทางตรงและทางอ้อม
ซึ่งหมายความว่าคุณสามารถใช้ iptables เพื่อสร้างกฎการบล็อกหรืออนุญาตการรับส่งข้อมูลผ่านพอร์ต ที่อยู่ IP ต้นทาง อินเทอร์เฟซเครือข่าย และอื่นๆ
เมื่อคุณกำหนดกฎแล้ว การรับส่งข้อมูลทั้งหมดจะต้องผ่านกฎนั้น ตัวอย่างเช่น สำหรับการเชื่อมต่อใหม่ทุกครั้ง iptables จะตรวจสอบกฎที่กำหนดไว้ล่วงหน้าซึ่งตรงกับการเชื่อมต่อ ถ้าเป็นเช่นนั้น จะใช้กฎกับการเชื่อมต่อ อย่างไรก็ตาม หากไม่มีกฎที่เกี่ยวข้องที่เกี่ยวข้อง ก็จะใช้กฎเริ่มต้น
หากต้องการใช้ iptables คุณต้องใช้คำสั่งต่อไปนี้
$ iptables -L -n -v
ที่นี่ พารามิเตอร์มีดังนี้:
- -L เป็นรายการกฎทั้งหมด
- -n ทำให้เอาต์พุตตัวเลขมีประสิทธิภาพที่เร็วขึ้น
- -v สำหรับแสดงผลในรูปแบบรายละเอียด
เมื่อคุณรันคำสั่ง iptables โดยไม่มีพารามิเตอร์ใดๆ มันจะส่งคืนผลลัพธ์ต่อไปนี้:
iptables v1.8.7 (nf_tables): no command specified Try `iptables -h' or 'iptables --help' for more information.
คุณต้องติดตั้งหากเกิดข้อผิดพลาด เช่น ไม่พบคำสั่ง “iptables”
ในการติดตั้ง iptables ในการแจกจ่าย Linux ให้รันคำสั่งต่อไปนี้
$ sudo apt-get install iptables
มันจะส่งคืนสิ่งต่อไปนี้เนื่องจากติดตั้งไว้ล่วงหน้าแล้วในการแจกจ่าย Linux ของฉัน
#output Reading package lists... Done Building dependency tree... Done Reading state information... Done iptables is already the newest version (1.8.7-1ubuntu5). iptables set to manually installed. 0 upgraded, 0 newly installed, 0 to remove, and 35 not upgraded.
ไฟร์วอลล์คืออะไร?
ไฟร์วอลล์เป็นรูปแบบพื้นฐานที่สุดในการปกป้องระบบ เครือข่าย และคอมพิวเตอร์ส่วนบุคคล อาจเป็นฮาร์ดแวร์หรือซอฟต์แวร์ ขึ้นอยู่กับกฎเพื่อให้ทำงานได้อย่างถูกต้อง
ไฟร์วอลล์ส่วนใหญ่ปรับแต่งได้สูง ทำให้คุณสามารถสร้างหรือแก้ไขกฎได้ ตัวอย่างเช่น เนื่องจากแพ็คเก็ตจากอินเทอร์เน็ตใช้พอร์ตเพื่อเข้าสู่ระบบ การสแกนตามพอร์ตสามารถช่วยคุณกรองพอร์ตเหล่านี้ออกได้ นอกจากนั้น คุณยังสามารถอนุญาตหรือบล็อกบริการตามที่อยู่ IP ต้นทางหรืออินเทอร์เฟซเครือข่าย
หากคุณใช้ Linux คุณจะสามารถเข้าถึง iptables ในตัวได้ อย่างไรก็ตาม คุณยังสามารถใช้ไฟร์วอลล์ Linux แบบสแตนด์อโลนเพื่อช่วยคุณในกระบวนการปกป้องระบบของคุณได้
ทำไมคุณต้องใช้ iptables เพื่อกำหนดค่าไฟร์วอลล์
แต่ทำไมคุณควรใช้ iptables เลย? ท้ายที่สุด มียูทิลิตี้ไฟร์วอลล์บรรทัดคำสั่งทางเลือกที่ดี เช่น ufw และ firewalld นอกจากนี้ คุณสามารถใช้ไฟร์วอลล์ Linux แบบสแตนด์อโลนที่ใช้งานง่ายและมีคุณสมบัติเพิ่มเติม
ดังนั้น อะไรทำให้ iptables น่าสนใจเมื่อกำหนดค่าไฟร์วอลล์ เหตุผลในการใช้รวมถึง:
- ให้ความยืดหยุ่นที่ยอดเยี่ยมเมื่อแกะกล่อง คุณสามารถตั้งกฎที่ระดับแพ็กเก็ต
- มันค่อนข้างใช้งานง่ายเมื่อคุณรู้วิธีการทำงาน
- บล็อกทราฟฟิกที่ไม่ต้องการอย่างตรงไปตรงมา
- เปลี่ยนเส้นทางแพ็กเก็ตไปยังที่อยู่ IP อื่น
- ปกป้องระบบของคุณจากการโจมตีแบบปฏิเสธการให้บริการ (DoS)
และอีกมากมาย!
ทำความเข้าใจกับสถาปัตยกรรม iptables และความสัมพันธ์กับ Netfilter
เพื่อให้เข้าใจ iptables อย่างถูกต้อง เราจำเป็นต้องเรียนรู้เกี่ยวกับสถาปัตยกรรมของมัน ประการแรก มันจะทำให้เราเข้าใจอย่างชัดเจนเกี่ยวกับส่วนประกอบต่างๆ ของ iptables จากนั้น เมื่อเรารู้เกี่ยวกับแต่ละกฎแล้ว เราก็สามารถใช้กฎเหล่านี้เพื่อเขียนกฎไฟร์วอลล์ได้
และเมื่อเราพูดถึง iptables Netfilter ก็เข้ามาอยู่ในภาพด้วย คุณอาจคิดว่า “Netfilter” เป็นพี่ใหญ่ของ iptables มันสร้างขึ้นจาก iptables และเสนอชุดคุณสมบัติที่ดีกว่าในการจัดการไฟร์วอลล์ของคุณ อย่างไรก็ตาม มันใช้ iptables เป็นวิธีหนึ่งในการบรรลุความสามารถของไฟร์วอลล์ที่ยอดเยี่ยม
Iptables เป็นอินเตอร์เฟสบรรทัดคำสั่งสำหรับ hooks ระดับเคอร์เนลของ Netfilter hooks เหล่านี้สามารถโต้ตอบกับ Linux network stack ซึ่งส่งผลต่อแพ็กเก็ตที่ระดับลึกที่สุด
ดังนั้นสถาปัตยกรรม iptables มีลักษณะอย่างไร:
ตาราง
สถาปัตยกรรม iptables เริ่มต้นด้วยตาราง ตารางเหล่านี้ดูแลการจัดระเบียบกฎ และแต่ละตารางจะถูกจัดประเภทตามประเภทการตัดสินใจที่พวกเขากำลังทำ พูดง่ายๆ ก็คือ ตารางจะทำให้การประมวลผลแพ็กเกจโดยรวมง่ายขึ้นโดยการแนบวิธีเฉพาะในการประมวลผลแพ็กเกจ
ตารางต่างๆ ที่นำเสนอโดย iptables ได้แก่:
- ตารางตัวกรอง: ระบุประเภทการตัดสินใจสำหรับการกรองแพ็คเก็ต พูดง่ายๆ คือกำหนดว่าพัสดุควรถึงปลายทางหรือไม่
- ตาราง NAT: ระบุประเภทการตัดสินใจสำหรับการแปลที่อยู่ ที่นี่ การกำหนดเส้นทางของแพ็กเก็ตจะพิจารณาจากเครือข่าย NAT ตัวอย่างเช่น หากแพ็กเกจไม่สามารถเข้าถึง NAT ได้ แพ็กเกจจะข้ามและพยายามค้นหาเครือข่ายที่ไม่ใช่ NAT
- ตาราง Mangle: จัดการความต้องการการประมวลผลพิเศษของแพ็คเกจ ตัวอย่างเช่น คุณสามารถกำหนดค่าให้เปลี่ยนข้อมูลส่วนหัวของแพ็คเก็ต เช่น ค่า TTL
- ตารางดิบ: ตารางดิบช่วยให้คุณทำงานอย่างขยันขันแข็งด้วยลักษณะสถานะของไฟร์วอลล์ iptables เมื่อใช้ตาราง คุณสามารถกำหนดเส้นทางแพ็กเก็ตตาม “สถานะ” ก่อนที่เคอร์เนล Linux จะเริ่มติดตามสถานะของมัน ส่วนใหญ่จะใช้เพื่อทำเครื่องหมายแพ็กเก็ต ไม่ว่าระบบการติดตามการเชื่อมต่อจะจัดการหรือไม่ก็ตาม หากแพ็กเก็ตไม่ถูกติดตาม จะถูกตั้งค่าเป็นเป้าหมาย NOTRACK
ห่วงโซ่
จากนั้น เราก็มี “โซ่” ภายใน “ตาราง”
ห่วงโซ่เหล่านี้จัดการการตรวจสอบแพ็กเก็ตเชิงลึกในขั้นตอนต่างๆ ของการเดินทาง ตัวอย่างเช่น คุณสามารถตรวจสอบได้เมื่อถึงพอร์ตหรืออินเทอร์เฟซเครือข่าย วิธีนี้ทำให้สามารถตัดสินใจได้ก่อนที่แพ็คเกจจะถูกปล่อยสู่กระบวนการของระบบ
เช่นเดียวกับโต๊ะ คุณจะได้รับโซ่ที่แตกต่างกัน เหล่านี้รวมถึง:
- ห่วงโซ่ PREROUTING: ที่นี่ กฎจัดการกับแพ็กเก็ตที่เพิ่งมาถึงที่อินเทอร์เฟซเครือข่าย
- INPUT chain: กฎที่กล่าวถึงใน INPUT chain จะจัดการกับพฤติกรรมการเชื่อมต่อขาเข้า เมื่อทำเสร็จแล้ว พวกเขาจะถูกส่งไปยังกระบวนการในท้องถิ่น
- ห่วงโซ่ OUTPUT: ห่วงโซ่ OUTPUT เกี่ยวข้องกับแพ็กเก็ตที่ดำเนินการผลิต
- ห่วงโซ่ FORWARD: ห่วงโซ่ FORWARD จัดการแพ็กเก็ตที่ไม่ได้หมายถึงระบบโลคัล เป็นพาหะสำหรับระบบปลายทางอื่นๆ เช่น เราเตอร์
- ห่วงโซ่ POSTROUTING: สุดท้าย เรามีห่วงโซ่ POSTROUTING ซึ่งจัดการกับแพ็กเก็ตที่จะออกจากอินเทอร์เฟซเครือข่าย
แต่ละตารางมีเชนไม่ครบทุกรายการ ตัวอย่างเช่น โซ่ FORWARD มีเฉพาะในตาราง mangle, filter และ security ในทำนองเดียวกัน ห่วงโซ่ POSTROUTING มีอยู่ใน mangle และ nat (SNAT) เฉพาะห่วงโซ่ OUTPUT เท่านั้นที่มีอยู่ในตารางทั้งหมด
เป้า
ตอนนี้เรามี “เป้าหมาย” เมื่อพัสดุมาถึง พัสดุจะเคลื่อนผ่านสายโซ่เพื่อดูว่าคำอธิบายกฎข้อใดเหมาะสมที่สุด หากเป็นไปตามคำอธิบายของกฎ ก็จะดำเนินการที่เกี่ยวข้องตามนั้น จากนั้นจึงย้ายไปยังเป้าหมาย เป็นการปิดผนึกชะตากรรมของแพ็กเก็ต
ในหลายกรณี แพ็กเก็ตจะไม่พอดีกับคำอธิบายหรือชุดกฎใดๆ และนั่นคือที่มาของนโยบายเริ่มต้นซึ่งเป็นเป้าหมาย
เป้าหมายสามารถยอมรับ ปล่อย และปฏิเสธ สิ่งเหล่านี้คือเป้าหมายปลายทางที่ตัดสินชะตากรรมของแพ็กเก็ต
- ยอมรับ: ยอมรับแพ็กเก็ต
- DROP: ดรอปแพ็กเก็ต ทำให้ผู้ส่งไม่สามารถเรียนรู้ได้ว่าระบบมีอยู่หรือไม่
- REJECT: ปฏิเสธแพ็คเก็ต
นอกจากนี้ยังมีเป้าหมายที่ไม่สิ้นสุดซึ่งส่วนใหญ่จะใช้เพื่อเก็บข้อมูลเกี่ยวกับแพ็กเก็ต
คำสั่ง iptables ที่พบบ่อยที่สุดพร้อมตัวอย่าง
ก่อนที่คุณจะกระโดดและเริ่มดำเนินการคำสั่ง iptables ตรวจสอบให้แน่ใจว่า:
- คุณมีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบเพื่อเรียกใช้คำสั่ง หากคำสั่งล้มเหลวเนื่องจากสิทธิ์ของผู้ดูแลระบบ ให้รันคำสั่งอีกครั้งโดยมีคำสั่ง sudo อยู่ข้างหน้า
- บทความนี้ไม่ใช่บทช่วยสอนเกี่ยวกับวิธีกำหนดค่า iptables บน Ubuntu
- เราจะใช้คำสั่ง iptables ที่ใช้ได้กับ IPv4 หากคุณต้องการทำงานกับ IPv6 คุณจะต้องใช้ ip6tables แทน
ตรวจสอบสถานะ iptables
ในการตรวจสอบสถานะ iptables ปัจจุบัน คุณต้องเรียกใช้คำสั่งต่อไปนี้
$ iptables -L -n -v
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
ผลลัพธ์ข้างต้นมีข้อมูลจำนวนมาก อย่างไรก็ตาม มันยังบ่งบอกถึงไฟร์วอลล์ที่ไม่ได้ใช้งานอีกด้วย นั่นเป็นเพราะในปัจจุบัน เครือข่ายทั้งหมดถูกตั้งค่าเป็น ACCEPT และไม่มีกฎ
คุณจะต้องเริ่มเพิ่มกฎเพื่อเปิดใช้งานไฟร์วอลล์
การเพิ่มกฎในห่วงโซ่
เมื่อคุณเพิ่มกฎ กฎนั้นจะถูกต่อท้ายห่วงโซ่เสมอ ดังนั้น คุณต้องใช้ตัวเลือก -A (ต่อท้าย) ไวยากรณ์สำหรับมันเป็นดังนี้:
$ sudo iptables - A
อย่างไรก็ตาม เมื่อคุณเรียกใช้ มันจะส่งคืนสิ่งต่อไปนี้:
iptables v1.8.7 (nf_tables): option "-A" requires an argument Try `iptables -h' or 'iptables --help' for more information.
อาร์กิวเมนต์ที่คุณสามารถใช้ในการเพิ่มกฎได้แก่:
- – i: มันย่อมาจากส่วนต่อประสาน คุณสามารถพูดถึงอินเทอร์เฟซที่คุณกำลังเพิ่มกฎได้ที่นี่ สามารถเป็น ppp0, eth0 และอื่นๆ
- – p: มันย่อมาจากโปรโตคอล ที่นี่ คุณได้กล่าวถึงกฎการใช้โปรโตคอลเครือข่ายเพื่อกรองผู้แบ่งบรรจุ ตัวอย่างเช่น คุณสามารถพูดว่า ICMP, TCP, UDP เป็นต้น หากคุณต้องการให้กฎทำงานในโปรโตคอลทั้งหมด ให้ระบุ “ทั้งหมด” เป็นค่าอาร์กิวเมนต์
- – s: ถัดมาเป็นอาร์กิวเมนต์แหล่งที่มา ซึ่งกล่าวถึงแหล่งที่มาของการรับส่งข้อมูล (เป็นที่อยู่ IP หรือชื่อโฮสต์)
- – dport: dport ย่อมาจาก port ปลายทาง ซึ่งคุณระบุหมายเลขพอร์ตที่แพ็คเก็ตถูกปลายทาง
- – j: สุดท้าย เรามีอาร์กิวเมนต์ TARGET ที่คุณสามารถระบุชื่อเป้าหมาย ยอมรับ วาง หรือส่งคืน
สิ่งสำคัญคือต้องเขียนคำสั่งตามลำดับต่อไปนี้:
$ sudo iptables -A <chain-name> -i <interface-name> - p <protocool-name> - s <source> --dport <port no.> -j <target>
บันทึกการเปลี่ยนแปลงเป็น iptables
เมื่อคุณเพิ่มกฎแล้ว คุณสามารถบันทึกได้ด้วยคำสั่ง iptables -save
$ sudo iptables -save
ผลลัพธ์จะเป็นดังนี้:
[email protected]:~$ sudo iptables-save # Generated by iptables-save v1.8.7 on Sun May 14 13:37:34 2023 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 392 -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -o lo -j ACCEPT COMMIT # Completed on Sun May 14 13:37:34 2023
กฎที่คงอยู่ด้วยตนเอง
ตามค่าเริ่มต้น iptables จะไม่บันทึกกฎ ดังนั้น หากคุณรีสตาร์ทคอมพิวเตอร์ ระบบจะลบกฎทั้งหมด คุณจะต้องใช้คำสั่งต่อไปนี้เพื่อให้แน่ใจว่าคุณไม่ต้องกำหนดค่า iptables ใหม่
สำหรับกฎ IPv4 ให้เขียนคำสั่ง:
$ sudo iptables-save > /etc/iptables/rules.v4
และสำหรับกฎ IPv6 ให้เขียนคำสั่ง:
$ sudo iptables-save > /etc/iptables/rules.v6
กฎที่คงอยู่โดยอัตโนมัติ
เพื่อให้กฎคงอยู่แม้หลังจากรีสตาร์ทและอัตโนมัติเช่นกัน คุณจะต้องติดตั้งแพ็คเกจที่มี iptables
โดยเรียกใช้คำสั่งต่อไปนี้
$ sudo apt-get install iptables-persistent
จะเปิดหน้าต่างต่อไปนี้ กด Enter บน <ใช่>
ขณะที่เรากำลังทำงานกับตาราง IPv4 ตารางจะแสดงเฉพาะกฎ IPv4 หากคุณกำลังทำงานบน IPv6 หน้าต่างนั้นจะแสดงหน้าต่างที่เกี่ยวข้อง
หมายเหตุ: แพ็คเกจจะโหลดกฎ iptables ที่คุณบันทึกไว้เท่านั้น ดังนั้น เมื่อใดก็ตามที่คุณเปลี่ยน iptables คุณจะต้องบันทึกด้วยคำสั่ง iptables -save
กฎการโหลดซ้ำหลังจากรีสตาร์ท
เมื่อบันทึกกฎแล้ว คุณต้องกู้คืนด้วยคำสั่งต่อไปนี้
$ sudo iptables-restore < /etc/iptables/rules.v4
และ
$ sudo iptables-restore < /etc/iptables/rules.v6
เปิดใช้งานทราฟฟิกบน Localhost / เปิดใช้งานลูปแบ็ค
หากต้องการเปิดใช้งานการรับส่งข้อมูลบน Localhost ให้ใช้คำสั่งต่อไปนี้:
$ sudo iptables -A INPUT -i lo -j ACCEPT
ที่นี่ lo ย่อมาจากอินเทอร์เฟซย้อนกลับสำหรับการสื่อสารในเครื่องโฮสต์ทั้งหมด
ในทำนองเดียวกัน เราสามารถอนุญาตให้แพ็กเก็ตออกจากอินเทอร์เฟซลูปแบ็คได้
$ sudo iptables -A OUTPUT -o lo -j ACCEPT
หากต้องการตรวจสอบว่ากฎมีการเปลี่ยนแปลงอย่างไร ให้รัน iptables -L -n -V
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
การเปิดใช้งานทราฟฟิกบนพอร์ตเฉพาะ
คุณสามารถเปิดใช้งานทราฟฟิกเพื่อยอมรับหรือปฏิเสธในบางพอร์ต
ตัวอย่างเช่น พอร์ต SSL, HTTP และ SSH มีความสำคัญต่อการทำงานปกติของแอปของคุณ คุณสามารถเพิ่มกฎให้กับแพ็กเก็ต ACCEPT ผ่านหมายเลขพอร์ตเพื่อให้แน่ใจว่ากฎทำงานตามที่ต้องการ
สำหรับ SSL ให้รันคำสั่งต่อไปนี้
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
สำหรับ HTTPS ให้รันคำสั่งต่อไปนี้
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
สำหรับการอนุญาตการรับส่งข้อมูล HTTPS ทั้งหมดที่อินเทอร์เฟซ eth0
$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
สำหรับ SSH ให้รันคำสั่งต่อไปนี้
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
และหากต้องการยอมรับทราฟฟิก SSH ขาเข้าทั้งหมดบนอินเทอร์เฟซ eth0 ให้รันดังต่อไปนี้:
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
อีกตัวอย่างหนึ่งคือการเปิดใช้งานการรับส่งข้อมูลพอร์ตบนพอร์ตเฉพาะสำหรับแอปที่คุณกำหนดเอง สมมติว่าพอร์ต 233
หากต้องการเปิดการเชื่อมต่อบนพอร์ตนั้น ให้เรียกใช้
$ sudo iptables -A INPUT -p tcp --dport 233 -j ACCEPT
ในทำนองเดียวกัน คุณยังสามารถปิดการเชื่อมต่อบนพอร์ตเฉพาะได้โดยใช้ตัวเลือกปฏิเสธเป้าหมาย
บล็อกการเชื่อมต่อทั้งหมดที่พอร์ต 392
$ sudo iptables -A INPUT -p tcp --dport 392 -j REJECT
ในการตรวจสอบ ให้รันคำสั่ง iptables -L -n -v
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:233 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
ลบกฎที่มีอยู่
หากต้องการลบกฎที่มีอยู่ คุณจะต้องเรียกใช้คำสั่งต่อไปนี้
$ iptables -F
หรือ
$ iptables --flush
หมายเหตุ: หากคุณยังไม่ได้บันทึกกฎของคุณ กฎเหล่านั้นจะหายไปตลอดกาลและไม่สามารถกู้คืนได้โดยใช้ iptables -restore
ลบกฎด้วยหมายเลขบรรทัด
หากต้องการลบกฎเฉพาะ คุณจะต้องได้รับรายการกฎพร้อมตัวเลข
$ sudo iptables -L --line-numbers
#output Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 2 ACCEPT tcp -- anywhere anywhere tcp dpt:http 3 ACCEPT tcp -- anywhere anywhere tcp dpt:https 4 ACCEPT tcp -- anywhere anywhere tcp dpt:233 5 REJECT tcp -- anywhere anywhere tcp dpt:392 reject-with icmp-port-unreachable
รันคำสั่งต่อไปนี้หากคุณต้องการลบกฎข้อที่ 4 สำหรับสาย INPUT
$ sudo iptables -D INPUT 4
และหากคุณเรียกใช้คำสั่ง iptables -n -v -L อีกครั้ง
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
แสดงเฉพาะกฎลูกโซ่ INPUT หรือ OUTPUT
หากต้องการแสดงเฉพาะกฎลูกโซ่ INPUT ให้รันคำสั่งต่อไปนี้
$ sudo iptables -L INPUT -n -v --line-numbers
#ouput Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 4 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
ในทำนองเดียวกัน หากคุณต้องการดูเฉพาะกฎลูกโซ่ OUTPUT ให้เรียกใช้:
$ sudo iptables -L OUTPUT -n -v --line-numbers
#output Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
เริ่ม/หยุด/รีสตาร์ทไฟร์วอลล์
หากคุณใช้ RHEL/ Fedora Linux หรือ CentOS คุณสามารถเริ่ม/หยุดหรือรีสตาร์ทไฟร์วอลล์ได้โดยการเรียกใช้คำสั่ง
$ service iptables stop $ service iptables start $ service iptables restart
คุณยังสามารถใช้คำสั่ง systemctl
อย่างไรก็ตาม มันจะใช้ไม่ได้กับ Ubuntu
แทรกกฎในสถานที่เฉพาะ
หากคุณต้องการแทรกกฎในตำแหน่งเฉพาะ คุณต้องใช้คำสั่งต่อไปนี้
ก่อนอื่นให้ตรวจสอบกฎ
$ sudo iptables -L INPUT -n --line-numbers
#output Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 4 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
เรียกใช้คำสั่งต่อไปนี้หากคุณต้องการแทรกกฎระหว่าง 2 และ 3
$ sudo iptables -I INPUT 3 -s 252.32.1.2 -j DROP
ตรวจสอบกฎที่อัปเดตแล้ว
#output Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 DROP all -- 252.32.1.2 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 5 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
บล็อกทราฟฟิกขาเข้าแต่อนุญาตทราฟฟิกขาออก
คุณจะต้องป้อนคำสั่งต่อไปนี้เพื่อบล็อกทราฟฟิกขาเข้าทั้งหมด
$ iptables -P INPUT DROP $ iptables -P FORWARD DROP $ iptables -P OUTPUT ACCEPT $ iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -L -v -n
ด้วยวิธีนี้ คุณสามารถ ping หรือดาวน์โหลดแพ็คเกจ แต่บล็อกการรับส่งข้อมูลที่ไม่รู้จัก
บล็อกที่อยู่ IP เฉพาะ
หากต้องการบล็อกที่อยู่ IP เฉพาะ ให้รันคำสั่งต่อไปนี้
$ iptables -A INPUT -s 14.23.59.9 -J DROP
คุณยังสามารถกำหนดตัวแปรเพื่อจัดเก็บที่อยู่ IP ที่ถูกบล็อกแล้วเรียกใช้คำสั่ง
BLOCK_THE_IP = “a.b.c.d”
จากนั้นเรียกใช้:
$ iptables -A INPUT -s “BLOCK_THE_IP” -j DROP
หมายเหตุ: เปลี่ยน “abcd” เป็นที่อยู่ IP ที่คุณต้องการ
อนุญาตให้ระบบ Pinging จากภายนอก
คุณสามารถให้ผู้ใช้ภายนอก ping เซิร์ฟเวอร์ของคุณเพื่อให้ค้นพบเครือข่ายของคุณได้
$ sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT $ sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
อนุญาตให้เครือข่ายภายในพูดคุยกับเครือข่ายภายนอก
เรียกใช้คำสั่งต่อไปนี้เพื่ออนุญาตเครือข่ายภายใน (สมมติว่า eth0) ไปยังเครือข่ายภายนอก (สมมติว่า eth1)
$ sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
อนุญาต DNS ขาออก
หากต้องการอนุญาตการเชื่อมต่อ DNS กับเซิร์ฟเวอร์ของคุณ ให้รันคำสั่งต่อไปนี้
$ iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT $ iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
อนุญาต Rsycn จากเครือข่ายเฉพาะ
หากคุณใช้คำสั่ง Rsync และต้องการเปิดใช้งานผ่านเครือข่ายเฉพาะ ให้รันคำสั่งต่อไปนี้
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
บล็อกพอร์ต
เรียกใช้คำสั่งต่อไปนี้เพื่อบล็อกพอร์ตเฉพาะและคำขอที่เข้ามา
iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
บล็อกการรับส่งข้อมูลขาออกไปยังที่อยู่ IP เฉพาะ
คุณสามารถบล็อกทราฟฟิกไปยังที่อยู่ IP ใดๆ ได้โดยใช้คำสั่งต่อไปนี้
$ host -t a admintrick.com.com
#เอาต์พุต
admintrick.com.com มีที่อยู่ 172.66.40.93
หากต้องการบล็อกทราฟฟิกขาออกไปยังที่อยู่ IP นั้น ให้รันคำสั่งต่อไปนี้
iptables -A OUTPUT -d 72.66.40.93 -j DROP
ในทำนองเดียวกัน คุณยังสามารถบล็อกแพลตฟอร์มโซเชียลมีเดีย เช่น Instagram, Twitter และ Facebook
ค้นหาที่อยู่ IP ของโซเชียลมีเดียโดยเรียกใช้คำสั่งต่อไปนี้:
$ host -t a social-media-web-adrress.com
ตัวอย่างเช่น สำหรับ Instagram จะเป็น:
$ host -t a www.instagram.com
ตอนนี้ คุณจะต้องค้นหา CIDR สำหรับที่อยู่ IP ของแพลตฟอร์มโซเชียลมีเดียนั้นๆ
$ whois 185.89.219.11 | grep CIDR
หมายเหตุ: คุณอาจต้องติดตั้งแพ็คเกจ whois โดยเรียกใช้ sudo apt-get install whois
ตอนนี้ ป้อนค่า CIDR ด้วยวิธีต่อไปนี้:
$ iptables - A OUTPUT -p tcp -d CIDR-value -j DROP
หมายเหตุ: อย่าลืมเปลี่ยนค่า CIDR ตามนั้น
อนุญาตหรือบล็อกคำขอ ICMP Ping
หากต้องการอนุญาตหรือบล็อกคำขอ ping ของ ICMP ให้รันคำสั่งต่อไปนี้
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP $ iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
เปิดช่วงพอร์ตเฉพาะ
หากต้องการเปิดช่วงของพอร์ต ให้รันคำสั่งต่อไปนี้
$ iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8933: 8500 -j ACCEPT
แสดงรายการกฎ NAT
หากต้องการแสดงกฎ NAT ให้รันคำสั่งต่อไปนี้:
$ sudo iptables -t nat -L -n -v
หรือ
$ sudo iptables -t nat -v -L -n --line-number
รีเซ็ตตัวนับแพ็คเกจ
ในการตรวจสอบตัวนับ iptables ปัจจุบัน:
$ sudo iptables -L -n -v
หากต้องการรีเซ็ตหรือล้างตัวนับ ให้รันดังต่อไปนี้:
$ sudo iptables -Z $ sudo iptables -L -n -v
สำหรับการรีเซ็ตตัวนับเชน INPUT เท่านั้น ให้รัน:
$ iptables -Z INPUT
หากต้องการรีเซ็ตตัวนับกฎเฉพาะ ให้รันดังต่อไปนี้:
$ iptables -z INPUT RULE-NUMBER
อย่าลืมเปลี่ยน RULE-NUMBER เป็นกฎนั้นๆ
คำสุดท้าย
iptables เป็นยูทิลิตี้บรรทัดคำสั่งไฟร์วอลล์ที่ทรงพลัง คุณสามารถกำหนดค่าเกือบทุกอย่างที่เกี่ยวข้องกับทรัพยากรเครือข่าย แพ็กเก็ต อินเทอร์เฟซ และสถานการณ์เฉพาะ
นอกจากนี้ iptables ยังมีตัวเลือกมากมาย ตรวจสอบหน้าหลักโดยใช้คำสั่ง man เพื่อให้ได้ภาพที่สมบูรณ์
$ man iptables $ man ip6tables
ต่อไป ตรวจสอบไฟร์วอลล์เครือข่ายและวิธีที่ช่วยหยุดการโจมตี