การเข้าถึงโดยไม่ได้รับอนุญาตและการแฮ็กเซิร์ฟเวอร์เป็นภัยคุกคามร้ายแรง นั่นคือเหตุผลที่คุณควรติดตั้ง firewall เป็นส่วนหนึ่งของมาตรการรักษาความปลอดภัยเครือข่าย การเข้าใจวิธีใช้งาน Iptables rules ถือเป็นทักษะสำคัญในการลดความเสี่ยงบนระบบ Linux บทแนะนำนี้จะพาคุณทำความเข้าใจแนวคิดพื้นฐานของ firewall เช่น การแสดง iptables rules และการลบ iptables rules ใน Ubuntuเพื่อช่วยให้คุณรันคำสั่งพื้นฐานได้อย่างมีประสิทธิภาพ ก่อนจะพูดถึงวิธีแสดงรายการหรือลบ iptables rules มาทำความเข้าใจก่อนว่า iptables rules คืออะไร และทำไมเราถึงใช้มัน
Iptables คืออะไร
iptables คือ firewall แบบ command-line ที่ใช้อนุญาตหรือบล็อก traffic ผ่าน ห่วงโซ่นโยบาย. เมื่อมีการพยายามเชื่อมต่อเข้ามาในระบบ iptables จะค้นหากฎในรายการที่ตรงกับการเชื่อมต่อนั้น ซึ่งช่วยให้คุณจัดการความปลอดภัยของเครือข่ายได้อย่างมีประสิทธิภาพ หากไม่พบกฎที่ตรงกัน ระบบจะใช้การดำเนินการเริ่มต้นแทน
iptables มักติดตั้งมาพร้อมกับ การแจกจ่าย Linux. คุณสามารถใช้คำสั่งต่อไปนี้เพื่ออัปเดตหรือติดตั้ง:
sudo apt-get install iptables
ทำไมเราถึงใช้ Iptables?
ในฐานะ firewall แบบ command-line สำหรับ Linux iptables ช่วยให้ผู้ดูแลระบบจัดการ traffic ขาเข้าและขาออกผ่านกฎของตาราง (table rules) ที่กำหนดค่าได้ iptables ใช้ชุดของตารางที่ประกอบด้วย chain ซึ่งมีกฎแบบ built-in หรือกำหนดเองได้
ดังที่กล่าวไว้ในส่วนก่อนหน้า iptables มีบทบาทสำคัญในการรักษาความปลอดภัยเครือข่ายสำหรับระบบ Linux ส่วนที่เหลือของบทความนี้มุ่งเน้นไปที่การอธิบายการแสดงกฎทั้งหมดของ iptables รวมถึงวิธีดูกฎและการลบกฎ iptables
โดยเฉพาะอย่างยิ่ง บทความนี้จะกล่าวถึงงานหลักของ iptables ได้แก่ การแสดงรายการกฎ การล้างตัวนับ packet และ byte การลบกฎ iptables การ flush chains และการลบทุก chain พร้อมตั้งค่าให้รับ traffic ทั้งหมด
คู่มือครบถ้วนสำหรับ Iptables ใน Ubuntu
ก่อนจะเริ่มต้นดูกฎ iptables โปรดตรวจสอบว่าคุณใช้งานเซิร์ฟเวอร์ Linux ที่ติดตั้งคำสั่ง iptables ไว้แล้ว นอกจากนี้ คุณต้องมีสิทธิ์ sudo ด้วย เมื่อทำงานกับ firewall ควรระวังอย่าบล็อก traffic SSH (port 22 ตามค่าเริ่มต้น) จนทำให้ตัวเองเข้าเซิร์ฟเวอร์ไม่ได้ หากเกิดกรณีนั้นขึ้น คุณอาจต้องเชื่อมต่อผ่าน out-of-band console เพื่อแก้ไขปัญหา
อ่านเพิ่มเติม: วิธีเปลี่ยนพอร์ต SSH บน Linux | คู่มือทีละขั้นตอนสำหรับจัดการพอร์ต SSH
การแสดงรายการ Rules ตามข้อกำหนด
คุณสามารถดูกฎ iptables ที่ใช้งานอยู่ได้ ในตาราง หรือเป็น รายการข้อกำหนดของกฎทั้งสองวิธีให้ข้อมูลเดียวกันในรูปแบบที่ต่างกัน หากต้องการแสดงรายการกฎทั้งหมดของ iptables ที่ใช้งานอยู่ในรูปแบบ specification ให้รันคำสั่ง iptables พร้อมกับ ตัวเลือก -S:
sudo iptables -S
หลังจากรันคำสั่ง iptables show rules แล้ว จะได้ผลลัพธ์ดังนี้:

การแสดงรายการ Chain เฉพาะ
หากต้องการจำกัดผลลัพธ์ของ iptables ให้แสดงเฉพาะ chain ที่ต้องการ เช่น INPUT, OUTPUT หรือ TCPสามารถระบุชื่อ chain ต่อท้าย option -S ได้โดยตรง ตัวอย่างเช่น คำสั่ง iptables show rules ต่อไปนี้จะแสดงกฎเฉพาะใน chain TCP:
sudo iptables -S TCP

อีกวิธีหนึ่งในการดูกฎ iptables คือการแสดงผลในรูปแบบตาราง ลองมาดูวิธีนี้กัน
การแสดงรายการ Rules แบบตาราง
การใช้คำสั่งแสดงกฎ iptables ในรูปแบบตารางช่วยให้เปรียบเทียบกฎต่าง ๆ ได้ง่ายขึ้น ให้รันคำสั่ง iptables ต่อไปนี้พร้อมกับ ตัวเลือก -L เพื่อแสดงกฎที่ใช้งานอยู่ทั้งหมดในรูปแบบตาราง:
sudo iptables -L
คำสั่งนี้จะแสดงกฎทั้งหมดที่มีอยู่โดยจัดกลุ่มตาม chain หากต้องการจำกัดผลลัพธ์ให้แสดงเฉพาะ chain ที่ต้องการ เช่น INPUT, OUTPUT, TCP เป็นต้น ให้ระบุชื่อ chain ต่อท้าย option -L โดยตรง ตัวอย่างต่อไปนี้จำกัดการแสดงกฎ iptables ให้เฉพาะ chain INPUT:
sudo iptables -L INPUT

บรรทัดแรกของผลลัพธ์แสดงชื่อ chain (ในที่นี้คือ INPUT) และ default policy (DROP) บรรทัดถัดมาแสดง header ของแต่ละคอลัมน์ในตาราง รวมถึงกฎของ chain นั้น ๆ เราจะอธิบายแต่ละคอลัมน์ดังนี้:
- Target: หากแพ็กเก็ตตรงกับกฎ target จะกำหนดว่าจะดำเนินการอย่างไรกับแพ็กเก็ตนั้น ไม่ว่าจะเป็นการยอมรับ (accept) ทิ้ง (drop) บันทึกล็อก (log) หรือส่งต่อไปยัง chain อื่นเพื่อตรวจสอบกับกฎเพิ่มเติม
- prot: โปรโตคอลที่ใช้งาน (เช่น TCP, udp, ICMP หรือ all)
- opt: แสดง IP options (ไม่ค่อยได้ใช้งานบ่อย)
- source: แสดง IP address หรือ subnet ต้นทางของ traffic
- destination: แสดง IP address หรือ subnet ปลายทางของ traffic
คอลัมน์ที่ไม่มีชื่อจะแสดง option เพิ่มเติมของกฎที่ยังไม่ได้ระบุในคอลัมน์ก่อนหน้า ซึ่งอาจเป็นข้อมูลใด ๆ ก็ได้ ตั้งแต่ port ต้นทางและปลายทางไปจนถึง connection state ของแพ็กเก็ต
อ่านเพิ่มเติม: ติดตั้ง OpenVPN บน VPS – การตั้งค่า OpenVPN Client 🔑
วิธีแสดงจำนวน packet และขนาดรวม
ในการแสดงรายการกฎ iptables เราสามารถดูจำนวนแพ็กเก็ตและขนาดรวมของแพ็กเก็ตในหน่วย byte ที่ตรงกับแต่ละกฎ ซึ่งช่วยให้เข้าใจได้ว่ากฎใดมีผลกับแพ็กเก็ตจริง ต้องใช้ -L และ option -v ร่วมกันเพื่อให้ได้ผลลัพธ์ดังกล่าว นี้
ต่อไปนี้คือตัวอย่างที่ใช้ chain INPUT อีกครั้ง พร้อม option -v:
sudo iptables -L INPUT -v

สังเกตว่าตอนนี้รายการของเรามีคอลัมน์เพิ่มขึ้นอีกสองคอลัมน์ชื่อ pkts และ bytesเราได้เรียนรู้วิธีต่าง ๆ ในการใช้คำสั่ง iptables เพื่อแสดงกฎทั้งหมดแล้ว ถึงเวลาทำความเข้าใจวิธีรีเซ็ตจำนวนแพ็กเก็ตและขนาดรวมของข้อมูล
วิธีรีเซ็ตจำนวน packet และขนาดรวมทั้งหมด?
ใช้ตัวเลือก -Z หากต้องการล้างหรือรีเซ็ตตัวนับแพ็กเก็ตและไบต์ของกฎที่มีอยู่ ตัวนับเหล่านี้จะถูกรีเซ็ตโดยอัตโนมัติเมื่อรีบูตเครื่องด้วย ซึ่งมีประโยชน์เมื่อต้องการตรวจสอบว่าเซิร์ฟเวอร์กำลังรับทราฟฟิกใหม่ที่ตรงกับกฎปัจจุบันหรือไม่
คุณสามารถล้างตัวนับของทุก chain และกฎได้โดยใช้ ตัวเลือก -Z โดยตัวมันเอง:
sudo iptables -Z
หากต้องการล้างตัวนับของทุกกฎใน chain ที่ระบุ ให้ใช้ตัวเลือก -Z พร้อมระบุชื่อ chain ตัวอย่างเช่น คำสั่งต่อไปนี้ใช้สำหรับล้างตัวนับของ INPUT chain:
sudo iptables -Z INPUT
หากต้องการล้างตัวนับของกฎใดกฎหนึ่งโดยเฉพาะ ให้ระบุชื่อ chain และหมายเลขกฎให้ถูกต้อง ตัวอย่างเช่น คำสั่งต่อไปนี้ใช้รีเซ็ตตัวนับของกฎแรกใน INPUT chain:
sudo iptables -Z INPUT 1
นอกจากคำสั่ง iptables สำหรับแสดงกฎทั้งหมดและวิธีรีเซ็ตตัวนับแพ็กเก็ตและไบต์แล้ว ควรทราบวิธีลบกฎ iptables ด้วยเช่นกัน
อ่านเพิ่มเติม: วิธีติดตั้ง PPTP VPN Server บน VPS ของคุณ
วิธีลบกฎ iptables?
มีหลายคำสั่งที่ใช้ลบกฎ iptables หรือลบกฎทั้งหมดใน chain ได้ เราจะอธิบายแต่ละวิธีดังนี้
ลบกฎตามข้อกำหนด
วิธีหนึ่งในการลบกฎ iptables คือการระบุ rule specification โดยตรง ซึ่งใช้คำสั่ง iptables ร่วมกับ ตัวเลือก -D และ rule specification หากต้องการลบกฎด้วยวิธีนี้ สามารถอ้างอิงผลลัพธ์จากคำสั่ง iptables -S เพื่อช่วยในการระบุกฎได้
ตัวอย่างเช่น หากต้องการลบกฎที่ดรอปแพ็กเก็ตขาเข้าที่ไม่ถูกต้อง (-A INPUT -m conntrack –ctstate INVALID -j DROP) ให้รันคำสั่งต่อไปนี้:
sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
โปรดทราบว่าตัวเลือก -A ใช้สำหรับกำหนดตำแหน่งของกฎในขณะที่สร้าง ไม่ควรใส่ตัวเลือกนี้เมื่อต้องการลบกฎ
ลบกฎตามชื่อ chain และหมายเลข
อีกวิธีหนึ่งในการลบกฎ iptables คือการอ้างอิง chain และหมายเลขบรรทัด พิมพ์คำสั่งต่อไปนี้เพื่อดูหมายเลขบรรทัดของกฎ โดยแสดงกฎในรูปแบบตาราง พร้อมเพิ่ม ตัวเลือก –line-numbers:
sudo iptables -L --line-numbers

เมื่อรันคำสั่งนี้แล้ว กฎ iptables ทุกข้อจะมีหมายเลขบรรทัดแสดงอยู่ในคอลัมน์ num
เมื่อทราบกฎที่ต้องการลบแล้ว ให้จำชื่อ chain และหมายเลขบรรทัดของกฎนั้นไว้ จากนั้นใช้คำสั่ง iptables -D พร้อมระบุ chain และหมายเลขกฎ ตัวอย่างเช่น หากต้องการลบกฎ INPUT ที่ดรอปแพ็กเก็ตที่ไม่ถูกต้อง ซึ่งอยู่ที่กฎหมายเลข 3 ของ INPUT chain ให้รันคำสั่งนี้:
sudo iptables -D INPUT 3
วิธี flush chains?
มีวิธีลบกฎ iptables ทั้งหมดใน chain ซึ่งเรียกว่า ล้างห่วงโซ่เราจะอธิบายวิธีการต่าง ๆ สำหรับการดำเนินการนี้ ก่อนดำเนินการ โปรดระวังอย่าให้ตัวเองถูกล็อกออกจากเซิร์ฟเวอร์ผ่าน SSH เมื่อ flush chain ที่มี default policy เป็น drop หรือ deny เพราะหากเกิดขึ้น คุณอาจต้องเชื่อมต่อผ่าน console เพื่อกู้คืนสิทธิ์การเข้าถึง
Flush chain เดียว
หากต้องการ flush chain ใดโดยเฉพาะ หรือพูดง่าย ๆ คือลบกฎทั้งหมดใน chain นั้น ให้ใช้ -F หรือเทียบเท่า ตัวเลือก –flush พร้อมระบุชื่อ chain ที่ต้องการ ตัวอย่างเช่น หากต้องการลบกฎทั้งหมดใน INPUT chain ให้รันคำสั่งต่อไปนี้:
sudo iptables -F INPUT
Flush ทุก Chain
หากต้องการลบหรือ flush ทุก chain ให้ใช้ตัวเลือก -F หรือ –flush โดยไม่ต้องระบุพารามิเตอร์เพิ่มเติม:
sudo iptables -F
วิธีล้างกฎทั้งหมด ลบทุก chain และตั้งค่าให้รับ traffic ทั้งหมด?
ในส่วนนี้ เราจะอธิบายวิธี flush กฎ ตาราง และ chain ของ firewall ทั้งหมด พร้อมอนุญาตทราฟฟิกเครือข่ายทุกประเภท โปรดทราบว่าขั้นตอนนี้จะปิดการทำงานของ firewall โดยสมบูรณ์ ดังนั้นควรดำเนินการเฉพาะเมื่อต้องการตั้งค่า firewall ใหม่ตั้งแต่ต้นเท่านั้น
ขั้นแรก ให้ตั้งค่า default policy ของทุก built-in chain เป็น ACCEPT สาเหตุหลักที่ต้องทำขั้นตอนนี้ก่อน คือเพื่อให้แน่ใจว่าคุณจะไม่ถูกล็อกออกจากเซิร์ฟเวอร์ผ่าน SSH:
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
จากนั้นให้ล้างตาราง nat และ mangle รวมถึง flush ทุก chain (-F), และลบ chain ที่ไม่ใช่ค่าเริ่มต้นทั้งหมด (-X) แบบนี้:
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X
หลังจากรันคำสั่งข้างต้นแล้ว ไฟร์วอลล์จะอนุญาตการรับส่งข้อมูลเครือข่ายทั้งหมด หากต้องการดูรายการกฎในตอนนี้ จะพบว่าไม่มีกฎใดเหลืออยู่เลย มีเพียง chain ค่าเริ่มต้นสามรายการคือ INPUT, FORWARD และ OUTPUT เท่านั้น
วิธีตั้งค่า iptables ใน Ubuntu?
เช่นเดียวกับการทำงานของไฟร์วอลล์ทั่วไป กฎของ iptables จะถูกอ่านตามลำดับที่ปรากฏในแต่ละ chain ดังนั้นจึงต้องกำหนดกฎให้ถูกลำดับ เมื่อเพิ่มกฎใหม่ด้วย append กฎนั้นจะถูกต่อท้ายรายการกฎเสมอ หากต้องการแทรกกฎที่ตำแหน่งใดตำแหน่งหนึ่ง ให้ใช้คำสั่ง iptables -I <index> -command. ค่า <index> คือหมายเลขลำดับที่ต้องการแทรกกฎในคำสั่งนี้ สามารถใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่าควรใส่หมายเลข index ใด:
sudo iptables -L --line-numbers
ตัวเลขที่ต้นบรรทัดของแต่ละกฎแสดงตำแหน่งใน chain หากต้องการเพิ่มกฎใหม่ไว้เหนือกฎที่มีอยู่ ต้องระบุหมายเลข index ของกฎนั้น เช่น ถ้าต้องการเพิ่มกฎที่先頭สุดของ chain ให้ใช้คำสั่งต่อไปนี้โดยระบุ index เป็น 1:
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
iptables แตกต่างจาก firewalld อย่างไร?
ทั้ง iptables และ firewalld เป็นเครื่องมือที่ใช้งานได้จริงสำหรับการจัดการไฟร์วอลล์บนระบบ Linux ซึ่งออกแบบมาสำหรับการกรองแพ็กเก็ต (static filtering) โดยเฉพาะ การกรองแพ็กเก็ตคือกลยุทธ์ไฟร์วอลล์ที่ให้ผู้ใช้ควบคุมการเข้าถึงเครือข่ายด้วยการจัดการแพ็กเก็ตข้อมูลขาเข้าและขาออก โดยจะอนุญาตหรือปฏิเสธแพ็กเก็ตตามกฎที่กำหนดไว้ล่วงหน้า ซึ่งครอบคลุมโปรโตคอล พอร์ต และ IP address ของต้นทางและปลายทาง กฎเหล่านี้มอบกลไกการรักษาความปลอดภัยที่มีประสิทธิภาพ และทำให้การกรองแพ็กเก็ตเป็นแนวป้องกันที่ดีต่ออุปกรณ์ที่เชื่อมต่อจากภายนอก LAN (Local Area Network)
โปรดทราบว่า firewalld ถูกพัฒนาขึ้นในฐานะซอฟต์แวร์สำหรับจัดการ iptables เพื่อให้ผู้ใช้งานใช้งานได้ง่ายขึ้น เมื่อทำความเข้าใจทั้ง firewalld และ iptables แล้ว มาเปรียบเทียบทั้งสองในเชิงลึกกัน
iptables vs firewalld: การตั้งค่าระบบ
Firewalld และ iptables ใช้การกำหนดค่าและการจัดเก็บข้อมูลเริ่มต้นที่แตกต่างกัน ใน iptables ทุกครั้งที่มีการเปลี่ยนแปลง ระบบต้องล้างกฎทั้งหมดและโหลดกฎใหม่ ซึ่งต้องรีบูตระบบ แต่ใน firewalld กฎจะไม่ถูกสร้างขึ้นใหม่ทั้งหมด แต่จะนำเฉพาะส่วนที่เปลี่ยนแปลงไปปรับใช้กับกฎที่มีอยู่แทน ทำให้เห็นผลได้ทันทีในขณะที่ระบบทำงานอยู่
iptables vs firewalld: ส่วนติดต่อผู้ใช้
Firewalld ใช้ GUI (Graphic User Interface) ในขณะที่ iptables ใช้ CLI (Command Line Interface) ซึ่งอาจเป็นอุปสรรคสำหรับผู้ใช้บางส่วนในการเข้าถึงกฎไฟร์วอลล์ของ Linux kernel ทำให้ firewalld เป็นตัวเลือกที่เข้าถึงได้ง่ายกว่า อย่างไรก็ตาม ควรคำนึงว่า iptables มีเวลาตอบสนองสั้นกว่า เนื่องจากใช้คำสั่งที่กระชับ ท้ายที่สุดแล้ว ทั้งสองมีกรณีใช้งานของตัวเอง ให้เลือกใช้ตัวที่ถนัดกว่า
สรุป: การแสดงกฎ iptables
Iptables เป็นยูทิลิตีไฟร์วอลล์ที่ยืดหยุ่นสูง สร้างขึ้นมาสำหรับระบบปฏิบัติการ Linux โดยเฉพาะ ไม่ว่าคุณจะเป็นผู้ใช้ Linux มือใหม่หรือผู้ดูแลระบบมืออาชีพ กฎของ iptables ก็มีประโยชน์ต่อคุณได้ทั้งนั้น บทความนี้นำเสนอคำสั่งพื้นฐานสำหรับยูทิลิตีไฟร์วอลล์นี้ ครอบคลุมการแสดงกฎและการลบกฎของ iptables เพื่อเป็นภาพรวมของความสามารถของ Linux นอกจากนี้ คุณยังสามารถใช้ โซลูชันการโฮสติ้ง Linux VPS เพื่อใช้ประโยชน์จากระบบปฏิบัติการที่ยอดเยี่ยมนี้อย่างเต็มที่ ที่ Cloudzy เรามีแผน Linux VPS ที่ขับเคลื่อนด้วย KVM หลากหลายรูปแบบ เหมาะสำหรับหลายกรณีการใช้งาน ไม่ว่าจะเป็น web hosting, การ deploy web app หรือการสร้างสภาพแวดล้อมสำหรับพัฒนา ทดสอบ และทำงานอัตโนมัติ
คำถามที่พบบ่อย
วิธีดูกฎ iptables ทั้งหมดของ Linux ตามข้อกำหนด?
หากต้องการแสดงรายการกฎ iptables ที่ใช้งานอยู่ในปัจจุบันทั้งหมดตามข้อกำหนดหรือฟังก์ชัน สามารถทำได้โดยใช้คำสั่ง iptables ตามด้วย -S flag. ให้ใช้ sudo keyword ในกรณีนี้:
sudo iptables -S
วิธีลบกฎ iptables?
หากต้องการลบ chain ที่ระบุ ซึ่งจะลบกฎทั้งหมดใน chain นั้น คุณต้อง ใช้ option -F หรือ –flush พร้อมระบุชื่อ chain สมมติว่าต้องการลบกฎทั้งหมดใน OUTPUT chain จะทำอย่างไร? ให้รันคำสั่งนี้:
sudo iptables -F OUTPUT
iptables ทำงานอย่างไรใน Ubuntu?
ไฟร์วอลล์ iptables จะเปรียบเทียบการรับส่งข้อมูลเครือข่ายกับชุดกฎที่กำหนดไว้ กฎของ iptables ระบุลักษณะของแพ็กเก็ตที่ตรงกับกฎนั้น และกำหนดว่าควรดำเนินการอย่างไรเมื่อแพ็กเก็ตตรงตามเงื่อนไข แน่นอนว่ามีตัวเลือกมากมายสำหรับการกำหนดว่าแพ็กเก็ตใดตรงกับกฎที่ระบุ
กฎ iptables มีผลทันทีหรือไม่? เพราะอะไร?
กฎของ iptables มีผลทันที เนื่องจาก script ของคุณกำลัง append เข้า INPUT และ OUTPUT chain และกฎจะถูกเพิ่มต่อท้าย chain เหล่านั้น