Firewall บน VPS ด้วย UFW และ iptables ป้องกันการเข้าถึงที่ไม่ควรเปิด
Firewall คือด่านแรกที่กรอง network traffic ก่อนถึง application บน VPS ที่ไม่มี firewall ทุก port ที่ service รันอยู่จะถูกเข้าถึงได้จากทุกที่บนอินเทอร์เน็ต
UFW: Firewall ง่ายสำหรับมือใหม่
UFW (Uncomplicated Firewall) เป็น frontend ของ iptables ที่ใช้งานง่าย เหมาะกับ VPS ทั่วไป
apt install ufw
# กำหนด policy เริ่มต้น
ufw default deny incoming
ufw default allow outgoing
# เปิด port ที่ต้องการ
ufw allow 22/tcp # SSH (หรือ port ที่เปลี่ยนไว้)
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
# เปิด firewall
ufw enable
ufw status verbose
เปิด Port เฉพาะ IP ที่เชื่อถือได้
# เปิด MySQL เฉพาะ IP ที่กำหนด
ufw allow from 1.2.3.4 to any port 3306
# เปิด SSH เฉพาะ IP ที่บ้านหรือที่ทำงาน
ufw allow from 203.0.113.0/24 to any port 22
ลบ Rule
ufw status numbered # ดูหมายเลข rule
ufw delete 3 # ลบ rule หมายเลข 3
iptables: ควบคุมได้ละเอียดกว่า
iptables คือ firewall ระดับ kernel ที่ UFW ใช้อยู่เบื้องหลัง เหมาะกับคนที่ต้องการ rule ซับซ้อน
# ดู rule ปัจจุบัน
iptables -L -n -v --line-numbers
# เปิด port
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Block IP ที่น่าสงสัย
iptables -A INPUT -s 1.2.3.4 -j DROP
# Drop ทุก incoming ที่ไม่ได้กำหนด
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
บันทึก iptables ให้คงอยู่หลัง reboot:
apt install iptables-persistent
netfilter-persistent save
Rate Limiting: ป้องกัน Brute Force
จำกัด connection ใหม่ต่อนาทีต่อ IP เพื่อป้องกัน brute force:
ufw limit ssh/tcp
# หรือด้วย iptables
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --set -j ACCEPT
ปัญหา Docker กับ UFW
Docker เพิ่ม iptables rule โดยตรงโดย bypass UFW ถ้า publish port ด้วย -p 3306:3306 port จะเปิดออก internet แม้ UFW จะ block ไว้
วิธีแก้: bind เฉพาะ localhost -p 127.0.0.1:3306:3306 หรือใช้ Docker network แทน
ตรวจสอบว่า Firewall ทำงานถูกต้อง
# ดู rule ทั้งหมดที่ active
ufw status numbered
ufw status verbose
# ตรวจ port ที่เปิดอยู่จากภายนอก
nmap -p 22,80,443 YOUR_VPS_IP
# ดู listening ports ทั้งหมดบน VPS
ss -tlnp
แก้ปัญหาที่พบบ่อย
Error: SSH เข้าไม่ได้หลัง enable UFW
ลืมเปิด SSH port ก่อน enable หรือเปิดผิด port:
ยืนยันจากภายนอกอีกชั้นด้วย เครื่องมือเช็คพอร์ตของ dnsxray.com ลองสแกนพอร์ตสำคัญ (22, 80, 443, 3306) จากอินเทอร์เน็ตจริง ถ้าพอร์ตที่ตั้งใจปิดยังขึ้น Open แปลว่า Rule ยังไม่ทำงานหรือเรียงลำดับผิด
# ถ้ายังเข้า console ของ VPS provider ได้ (KVM/VNC)
ufw disable # ปิด UFW ชั่วคราว
ufw allow YOUR_SSH_PORT/tcp
ufw enable
# ตรวจ SSH port ที่ใช้จริง
grep Port /etc/ssh/sshd_config
Docker container เข้าถึงได้จากภายนอกแม้ UFW บล็อก
Docker ข้าม UFW โดย inject iptables rule โดยตรง วิธีแก้ที่ง่ายที่สุด:
# bind เฉพาะ localhost แทนการ publish ออก internet
docker run -p 127.0.0.1:3306:3306 mysql
# แทน
docker run -p 3306:3306 mysql
UFW rule บันทึกแล้วแต่หายหลัง reboot
# ตรวจว่า UFW service enabled
systemctl is-enabled ufw
systemctl enable ufw
# ตรวจ backup rule files
ls /etc/ufw/
cat /etc/ufw/user.rules
iptables rule หายหลัง reboot
iptables ไม่ persistent โดยค่าเริ่มต้น ต้องติดตั้งและ save:
apt install iptables-persistent
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
Rate limit ทำงานแล้วแต่ตัวเองก็โดน block ด้วย
ufw limit ssh block IP ที่ connect เกิน 6 ครั้งใน 30 วินาที ยกเว้น IP ของตัวเองได้:
# ยกเว้น IP ของตัวเอง — match ก่อน limit rule
ufw allow from YOUR_HOME_IP to any port 22
คำถามที่พบบ่อย
UFW กับ iptables ใช้ร่วมกันได้ไหม?
ได้ UFW เป็น wrapper ของ iptables อยู่แล้ว ถ้าต้องการ rule ซับซ้อนเพิ่มเติมใส่ใน /etc/ufw/before.rules แทนการ run iptables แยก
ควร reset UFW แล้วตั้งใหม่ยังไง?
ufw reset # ลบ rule ทั้งหมดและ disable
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
VPS ที่ใช้ Cloudflare จำเป็นต้องมี firewall เองไหม?
จำเป็น Cloudflare ป้องกัน traffic ที่ผ่าน Cloudflare เท่านั้น ถ้า attacker รู้ IP จริงของ VPS ก็เชื่อมตรงได้ การ block ทุก IP ยกเว้น Cloudflare range ใน UFW เป็น best practice
สรุป
UFW เพียงพอสำหรับ VPS ทั่วไป ตั้งค่า deny-all แล้วเปิดเฉพาะ port ที่จำเป็น ตรวจสอบ ufw status สม่ำเสมอว่ามี port ที่เปิดไว้โดยไม่ตั้งใจหรือเปล่า