iptables เป็นเครื่องมือสำหรับกำหนดค่ากฎไฟร์วอลล์ใน Linux โดยทำงานร่วมกับ Netfilter ซึ่งเป็นส่วนหนึ่งของเคอร์เนล Linux ที่ใช้สำหรับควบคุมและกรองแพ็กเก็ตเครือข่าย
หลักการทำงานของ iptables
iptables ทำงานโดยการสร้าง กฎ (rules) ที่กำหนดว่าจะแบน (DROP), อนุญาต (ACCEPT) หรือดำเนินการอื่น ๆ กับแพ็กเก็ตเครือข่ายที่เข้ามา ขาออก หรือถูกส่งผ่านเซิร์ฟเวอร์
โครงสร้างของ iptables
Tables (ตาราง): ประกอบด้วยกฎหลาย ๆ ข้อที่ใช้กำหนดการควบคุมแพ็กเก็ต
filter – ใช้สำหรับควบคุมการอนุญาตและปฏิเสธแพ็กเก็ต
nat – ใช้สำหรับการเปลี่ยนเส้นทางและการแปลงที่อยู่ IP
mangle – ใช้สำหรับแก้ไขแพ็กเก็ตเฉพาะทาง เช่น QoS
raw – ใช้สำหรับกำหนดแพ็กเก็ตที่ไม่ต้องการให้ถูกตรวจสอบโดยระบบติดตามการเชื่อมต่อ (connection tracking)
Chains (เชน): เป็นชุดของกฎที่ใช้กำหนดเส้นทางของแพ็กเก็ตในแต่ละตาราง
INPUT – ควบคุมแพ็กเก็ตที่เข้ามาในเซิร์ฟเวอร์
OUTPUT – ควบคุมแพ็กเก็ตที่ออกจากเซิร์ฟเวอร์
FORWARD – ควบคุมแพ็กเก็ตที่ถูกส่งผ่านเซิร์ฟเวอร์ไปยังเครือข่ายอื่น
PREROUTING – ใช้เปลี่ยนแปลงแพ็กเก็ตก่อนเข้าสู่กระบวนการ Routing
POSTROUTING – ใช้เปลี่ยนแปลงแพ็กเก็ตก่อนออกจากเซิร์ฟเวอร์
วิธีการ Setup iptables
1. ดูกฎที่มีอยู่ใน iptables
ดูกฎทั้งหมดใน Chain INPUT, OUTPUT, FORWARD
sudo iptables -L -v --line-numbers-L → แสดงรายการกฎทั้งหมด-v → แสดงรายละเอียดเพิ่มเติม--line-numbers → แสดงหมายเลขของกฎแต่ละข้อ
ดูกฎเฉพาะ Chain INPUT
sudo iptables -L INPUT -v --line-numbers
ดูกฎที่เกี่ยวข้องกับพอร์ตที่ต้องการ (เช่น 5015)
sudo iptables -L INPUT -v | grep 5015
ดูกฎทั้งหมดในรูปแบบที่ใช้กับ iptables-save
sudo iptables-save
2. เพิ่มกฎใหม่เข้า iptables (ตัวในการเพิ่ม)
ตัวอย่าง: อนุญาต TCP ขาเข้า (INPUT) บนพอร์ต 5015
sudo iptables -I INPUT -p tcp --dport 5015 -j ACCEPT
-I INPUT → แทรกกฎเข้า INPUT (เป็นลำดับแรก)-p tcp → ใช้กับโปรโตคอล TCP--dport 5015 → พอร์ตปลายทางคือ 5015-j ACCEPT → อนุญาตให้แพ็กเก็ตผ่าน
เพิ่มกฎให้อยู่ท้ายสุดของ Chain
sudo iptables -A INPUT -p tcp --dport 5015 -j ACCEPT-A INPUT → เพิ่มกฎไว้ท้ายสุดของ Chain INPUT
3. ลบกฎออกจาก iptables
วิธีที่ 1: ลบกฎโดยใช้เงื่อนไขเดียวกับตอนเพิ่ม
sudo iptables -D INPUT -p tcp --dport 5015 -j ACCEPT
วิธีที่ 2: ลบกฎโดยใช้หมายเลขบรรทัด
sudo iptables -L INPUT --line-numbers
ลบกฎที่หมายเลข (เช่น หมายเลข 3)
sudo iptables -D INPUT 3
4. บันทึกและกู้คืนกฎ iptables (ให้รอดจากการรีสตาร์ท)
บันทึกกฎปัจจุบัน (Ubuntu/Debian)
sudo iptables-save > /etc/iptables/rules.v4
โหลดกฎกลับมาใช้ใหม่
sudo iptables-restore < /etc/iptables/rules.v4
ตัวอย่างการใช้งาน
อนุญาต SSH (พอร์ต 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
บล็อก IP 192.000.0.000 ไม่ให้เข้าเซิร์ฟเวอร์
sudo iptables -A INPUT -s 192.000.0.000 -j DROP
อนุญาตให้เครื่อง IP 192.111.0.000 ใช้พอร์ต 3306 (MySQL)
sudo iptables -A INPUT -p tcp -s 192.111.0.000 --dport 3306 -j ACCEPT
ลบกฎที่บล็อก IP 192.000.0.000
sudo iptables -D INPUT -s 192.000.0.000 -j DROP
สรุป
- ใช้
iptables -L เพื่อตรวจสอบกฎ - ใช้
iptables -A หรือ iptables -I เพื่อเพิ่มกฎ - ใช้
iptables -D เพื่อลบกฎ - ใช้
iptables-save และ iptables-restore เพื่อบันทึกและโหลดกฎใหม่
หมายเหตุ: iptables จะรีเซ็ตหลังรีบูต เว้นแต่จะบันทึกกฎไว้!