UFW Firewall บน Ubuntu/Debian: ตั้งค่าง่าย ปลอดภัยทันที
UFW (Uncomplicated Firewall) คือ front-end ของ iptables ที่ Ubuntu และ Debian จัดมาให้ใช้งานได้ทันทีโดยไม่ต้องจำ syntax iptables ที่ซับซ้อน ด้วยคำสั่งสั้นๆ ไม่กี่บรรทัด คุณสามารถล็อก VPS ไม่ให้มี Port ที่ไม่จำเป็นเปิดอยู่ และป้องกันการ brute-force ได้ในระดับ Firewall ก่อนที่ Traffic จะถึง Application เลย
UFW กับ iptables ต่างกันอย่างไร?
iptables เป็น kernel-level packet filtering ที่ทรงพลังมาก แต่ syntax ค่อนข้างยาก UFW เป็น wrapper ที่เขียนคำสั่งง่ายขึ้น แต่ใช้ iptables ทำงานอยู่ภายใต้ การตั้งกฎ UFW จะแปลงเป็น iptables rules อัตโนมัติ คุณยังสามารถดูกฎ iptables จริงๆ ด้วย ufw show added และแก้ไข /etc/ufw/before.rules สำหรับกรณีขั้นสูง
ติดตั้งและเปิดใช้ UFW
Ubuntu 20.04+ และ Debian 11+ มี UFW ติดตั้งมาแล้ว ถ้าไม่มีให้ติดตั้งด้วย:
apt update && apt install ufw -y
ขั้นตอนที่ 1 — ตั้ง Default Policy
หลักการ Firewall ที่ดีคือ "ปฏิเสธทุกอย่างก่อน แล้วค่อยอนุญาตสิ่งที่ต้องการ":
# ปฏิเสธ Traffic ขาเข้าทั้งหมดเป็น Default
ufw default deny incoming
# อนุญาต Traffic ขาออกทั้งหมด (VPS ต้องออกอินเทอร์เน็ตได้)
ufw default allow outgoing
ขั้นตอนที่ 2 — อนุญาต SSH ก่อนเปิด UFW
# ถ้าใช้ Port 22 (default)
ufw allow ssh
# หรือระบุ Port ตรงๆ (ถ้าเปลี่ยน SSH Port แล้ว)
ufw allow 2222/tcp
# ถ้าต้องการจำกัด SSH จาก IP เดียว (ปลอดภัยกว่า)
ufw allow from 203.0.113.10 to any port 22
ขั้นตอนที่ 3 — อนุญาต Service ที่จำเป็น
# Web Server
ufw allow http # Port 80
ufw allow https # Port 443
# ใช้ Application Profile (UFW มี profiles สำเร็จรูป)
ufw allow 'Nginx Full' # Port 80 + 443
ufw allow 'Apache Full' # Port 80 + 443
# Database (เปิดเฉพาะจาก IP ที่เชื่อถือได้)
ufw allow from 10.0.0.0/8 to any port 3306 # MySQL จาก private network
ufw allow from 10.0.0.0/8 to any port 5432 # PostgreSQL จาก private network
# Mail Server
ufw allow 25/tcp # SMTP
ufw allow 587/tcp # SMTP Submission
ufw allow 993/tcp # IMAPS
ufw allow 995/tcp # POP3S
ufw app list จะแสดง profiles ที่ติดตั้งในระบบ พร้อม Port ที่แต่ละ profile ครอบคลุม
ขั้นตอนที่ 4 — เปิดใช้ UFW
# เปิดใช้งาน UFW
ufw enable
# ตรวจสอบสถานะและกฎทั้งหมด
ufw status verbose
ผลลัพธ์ที่ควรเห็น:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
Rate Limiting — ป้องกัน Brute Force อัตโนมัติ
UFW มี Rate Limit ในตัว ซึ่งจะ Block IP ที่พยายาม connect เกิน 6 ครั้งใน 30 วินาที:
# เปิด Rate Limit บน SSH (แทน allow ssh ปกติ)
ufw limit ssh
# หรือระบุ Port ตรงๆ
ufw limit 22/tcp
ufw limit ssh แทน ufw allow ssh เสมอ เพราะป้องกัน brute-force ได้ทันทีโดยไม่ต้องติดตั้ง fail2ban เพิ่ม
การลบและแก้ไขกฎ
# ดูกฎพร้อมเลขลำดับ
ufw status numbered
# ลบกฎโดยระบุเลขลำดับ
ufw delete 3
# ลบกฎโดยระบุ Rule ตรงๆ
ufw delete allow http
ufw delete allow from 203.0.113.10 to any port 22
# ปิดใช้งาน UFW ชั่วคราว (ไม่ลบกฎ)
ufw disable
# Reset กฎทั้งหมดเริ่มใหม่
ufw reset
ตั้งค่า Logging
UFW สามารถบันทึก Log ของ Traffic ที่ถูก Block เพื่อวิเคราะห์การโจมตี:
# เปิด Logging ระดับ Low (Block events เท่านั้น)
ufw logging low
# ระดับ Medium (Block + Allow events)
ufw logging medium
# ดู Log แบบ real-time
tail -f /var/log/ufw.log
# ดูสถิติ IP ที่ถูก Block บ่อยที่สุด
grep "BLOCK" /var/log/ufw.log | awk '{print $12}' | sort | uniq -c | sort -rn | head -20
กฎขั้นสูง: เปิด Port เฉพาะช่วงเวลา
UFW ไม่รองรับ Time-based rules โดยตรง แต่สามารถใช้ cron เพื่อเปิด/ปิดกฎตามเวลาได้:
# เปิด Port 8080 เฉพาะช่วง 9 โมง-18 โมง ด้วย cron
# เพิ่มใน crontab -e
0 9 * * 1-5 ufw allow 8080/tcp
0 18 * * 1-5 ufw delete allow 8080/tcp
UFW บน VPS ที่ใช้ Docker
Docker จัดการ iptables โดยตรง ทำให้ UFW อาจไม่สามารถ Block Port ที่ Container expose ออกมาได้ แก้ไขโดย:
# แก้ไขไฟล์ /etc/ufw/after.rules
# เพิ่มบรรทัดนี้ก่อน *filter section
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
หรือเพิ่ม --iptables=false ใน Docker daemon config และจัดการ routing เองผ่าน UFW ทั้งหมด วิธีนี้เหมาะสำหรับผู้ที่ต้องการควบคุม Firewall อย่างเต็มที่
Checklist ก่อนเปิดให้บริการจริง
- Port SSH เปิดอยู่และ Rate Limit เปิดแล้ว (
ufw limit ssh) - Default Policy deny incoming ตั้งแล้ว
- เฉพาะ Port ที่จำเป็นเท่านั้นที่ถูก allow
- Database Port (3306, 5432) ไม่เปิดสู่โลกภายนอก
ufw status verboseตรวจแล้วไม่มี Port เกิน- Logging เปิดแล้วเพื่อ audit trail
UFW เป็น Firewall ที่เหมาะสมกับ VPS ระดับ Entry ถึง Mid-range เพราะตั้งค่าง่าย ดูแลง่าย และทำงานได้ดีพอสำหรับการ Block การโจมตีทั่วไป สำหรับงานที่ต้องการ rule ซับซ้อนกว่านี้ เช่น geo-blocking หรือ stateful inspection แบบ deep packet สามารถต่อยอดด้วย iptables โดยตรงหรือเพิ่ม fail2ban ร่วมกันได้
ตรวจสอบว่า UFW ทำงานถูกต้อง
# ดูสถานะและกฎทั้งหมด
ufw status verbose
# ดูกฎพร้อม line number (สำหรับลบ)
ufw status numbered
# ตรวจสอบว่า port ที่ต้องการเปิดจริงๆ
ss -tlnp | grep -E ':22|:80|:443'
# ดู UFW log แบบ real-time เพื่อดู blocked connections
tail -f /var/log/ufw.log
แก้ปัญหาที่พบบ่อย
Error: ล็อกตัวเองออกจาก SSH หลัง ufw enable
เกิดจาก enable UFW ก่อน allow SSH ถ้ายังมี console access (KVM/VNC จาก provider) ให้ทำ:
# เชื่อมต่อผ่าน VPS console (ไม่ใช่ SSH)
ufw disable
ufw allow ssh
ufw enable
# หรือถ้า ufw active และมี session อื่นอยู่
ufw allow 22/tcp
ufw reload
Error: Docker container เข้า internet ได้ทั้งที่ UFW block ไว้
Docker จัดการ iptables โดยตรง ทำให้ UFW ข้ามได้ วิธีแก้คือ bind container เฉพาะ 127.0.0.1:
# docker-compose.yml
ports:
- "127.0.0.1:8080:80" # ไม่ใช่ "8080:80"
# หรือเพิ่มใน /etc/docker/daemon.json
{
"iptables": false
}
# แล้วจัดการ routing ผ่าน UFW/iptables เองทั้งหมด
Error: กฎ UFW หายหลัง reboot
UFW ต้องมี ufw.service enable ใน systemd ถ้า disable ไว้กฎจะไม่โหลดตอน boot:
# ตรวจสอบว่า UFW service enabled
systemctl is-enabled ufw
systemctl enable ufw
# ตรวจสอบว่า ufw-init เปิดด้วย
grep "ENABLED" /etc/ufw/ufw.conf
# ต้องเป็น: ENABLED=yes
Error: ufw limit ทำให้ตัวเองถูก ban ตอนใช้งานจาก IP เดียวกัน
ufw limit block IP ที่ connect เกิน 6 ครั้งใน 30 วินาที ถ้าถูก ban IP ตัวเอง:
# ดู banned IP ใน iptables
iptables -L ufw-user-limit-accept -n -v
# ล้าง rate limit rules ชั่วคราว
ufw delete limit ssh
ufw allow ssh
# หรือรอ 30 วินาทีแล้ว retry (ban เป็นแบบชั่วคราว)
Error: "ufw: command not found" บน AlmaLinux/Rocky Linux
UFW มีเฉพาะ Debian/Ubuntu ระบบ RHEL-based ใช้ firewalld แทน:
# บน AlmaLinux/Rocky/CentOS ใช้ firewalld
systemctl start firewalld
systemctl enable firewalld
# เปิด port
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
คำถามที่พบบ่อย
UFW กับ firewalld ต่างกันอย่างไร? เลือกตัวไหน?
UFW ออกแบบมาสำหรับ Debian/Ubuntu มี syntax ง่าย เหมาะสำหรับ VPS ทั่วไป ส่วน firewalld ใช้บน RHEL/CentOS/AlmaLinux มี zone concept และ runtime + permanent rules แยกกัน ซับซ้อนกว่าแต่ยืดหยุ่นกว่า — เลือกตามระบบปฏิบัติการที่ใช้
UFW rules เก็บอยู่ที่ไหน? Backup ได้ไหม?
กฎ UFW เก็บอยู่ใน /etc/ufw/user.rules และ /etc/ufw/user6.rules (IPv6) สามารถ backup ด้วย cp -r /etc/ufw /backup/ufw-rules-$(date +%Y%m%d) และ restore ด้วยการ copy กลับแล้ว ufw reload
ต้องใช้ UFW ทั้งที่มี Security Group / Cloud Firewall จาก provider แล้วไหม?
แนะนำให้ใช้ทั้งสองชั้น Cloud Firewall ป้องกันที่ network level ก่อน traffic ถึง VPS ส่วน UFW ป้องกันที่ OS level ถ้า cloud firewall หลุดหรือ misconfigured UFW ยังเป็น last line of defense ได้ นอกจากนี้ UFW ยัง rate limit ได้ในระดับ OS ซึ่ง cloud firewall ส่วนใหญ่ไม่มี