UFW (Uncomplicated Firewall) เป็น Frontend สำหรับ iptables ที่ออกแบบมาให้ใช้งานง่ายกว่า มีไวยากรณ์ที่อ่านเข้าใจได้ทันที เช่น ufw allow ssh หรือ ufw deny 3306 แทนที่จะต้องจำ Syntax iptables ยาว ๆ UFW มาพร้อมกับ Ubuntu ทุกเวอร์ชันและติดตั้งง่ายบน Debian เหมาะสำหรับ Cloud VPS ที่ต้องการ Firewall พร้อมใช้งานอย่างรวดเร็ว
บทความนี้อธิบายการติดตั้งและใช้งาน UFW ตั้งแต่การเปิดใช้งาน, การเพิ่มและลบ Rules, การตั้งค่า Default Policy, Logging, Application Profiles รวมถึงการทำงานร่วมกับ Docker และ IPv6 บน Production Server
ติดตั้งและเปิดใช้งาน UFW
# ติดตั้ง (Ubuntu มีมาแล้ว แต่ถ้าไม่มี)
sudo apt install ufw
# ตรวจสอบสถานะ
sudo ufw status
sudo ufw status verbose # ละเอียดกว่า
sudo ufw status numbered # พร้อม Line Number
# ⚠️ ก่อนเปิด UFW ให้อนุญาต SSH ก่อนเสมอ
sudo ufw allow ssh # หรือ: sudo ufw allow 22/tcp
# เปิด UFW
sudo ufw enable
# ปิด UFW (ฉุกเฉิน)
sudo ufw disable
# Reset กลับเป็นค่าเริ่มต้น (ลบ Rules ทั้งหมด)
sudo ufw reset
Default Policy
# ดู Default Policy ปัจจุบัน
sudo ufw status verbose | grep "Default"
# ตั้ง Default Policy — Best Practice สำหรับ Server
sudo ufw default deny incoming # บล็อก Traffic เข้าทั้งหมด
sudo ufw default allow outgoing # อนุญาต Traffic ออกทั้งหมด
sudo ufw default deny forward # บล็อก Forward (ถ้าไม่ต้องการ Route)
# ตรวจสอบ
sudo ufw status verbose
# Output:
# Default: deny (incoming), allow (outgoing), deny (routed)
เพิ่ม Rules พื้นฐาน
# อนุญาตด้วยชื่อ Service (อ่านใน /etc/services)
sudo ufw allow ssh # Port 22
sudo ufw allow http # Port 80
sudo ufw allow https # Port 443
sudo ufw allow smtp # Port 25
sudo ufw allow imap # Port 143
# อนุญาตด้วย Port Number
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp
# อนุญาต Port Range
sudo ufw allow 8000:8100/tcp # อนุญาต Port 8000-8100
# อนุญาต UDP
sudo ufw allow 53/udp
sudo ufw allow 123/udp # NTP
# อนุญาตจาก IP เฉพาะ
sudo ufw allow from 192.168.1.10
sudo ufw allow from 192.168.1.0/24
# อนุญาตจาก IP เฉพาะถึง Port เฉพาะ
sudo ufw allow from 10.0.0.5 to any port 3306 proto tcp
sudo ufw allow from 10.0.0.0/8 to any port 22 proto tcp
# บล็อก IP เฉพาะ
sudo ufw deny from 203.0.113.10
sudo ufw deny from 198.51.100.0/24
ลบ Rules
# ลบด้วยการระบุ Rule เหมือนตอนเพิ่ม (แต่ใส่ delete)
sudo ufw delete allow 80/tcp
sudo ufw delete allow ssh
# ลบด้วย Line Number (ดูจาก ufw status numbered)
sudo ufw status numbered
# Output:
# To Action From
# -- ------ ----
# [ 1] 22/tcp ALLOW IN Anywhere
# [ 2] 80/tcp ALLOW IN Anywhere
# [ 3] 443/tcp ALLOW IN Anywhere
sudo ufw delete 2 # ลบ Rule บรรทัดที่ 2 (Port 80)
Application Profiles
UFW มี Application Profiles ที่ Application ต่าง ๆ ลงทะเบียนไว้ใน /etc/ufw/applications.d/ ช่วยให้ไม่ต้องจำ Port Number
# ดู Application Profiles ทั้งหมด
sudo ufw app list
# ตัวอย่าง Output:
# Available applications:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
# Apache
# Apache Full
# Apache Secure
# ดูรายละเอียดของ Profile
sudo ufw app info "Nginx Full"
# Output:
# Profile: Nginx Full
# Title: Web Server (Nginx, HTTP + HTTPS)
# Description: ...
# Ports: 80,443/tcp
# อนุญาตด้วย Application Profile
sudo ufw allow "OpenSSH"
sudo ufw allow "Nginx Full" # อนุญาตทั้ง HTTP และ HTTPS
sudo ufw allow "Nginx HTTP" # อนุญาตเฉพาะ HTTP
sudo ufw allow "Nginx HTTPS" # อนุญาตเฉพาะ HTTPS
# สร้าง Application Profile เอง
sudo tee /etc/ufw/applications.d/myapp <<'EOF'
[MyApp]
title=My Custom Application
description=Custom app on port 8080
ports=8080/tcp
EOF
sudo ufw reload
Logging
# เปิด Logging
sudo ufw logging on
# ระดับ Log:
# off — ปิด Log ทั้งหมด
# low — บันทึกเฉพาะ Packet ที่ถูก Block ที่ตรง Default Policy
# medium — low + Block ที่ตรง Deny Rules + Invalid Packets
# high — medium + ทุก Packet ที่ผ่าน Allow Rules
# full — ทุก Packet ทั้งหมด (ระวัง Log ใหญ่มาก)
sudo ufw logging low # แนะนำสำหรับ Production
sudo ufw logging medium # เพื่อ Debug
# ดู Log
sudo grep "UFW BLOCK\|UFW ALLOW" /var/log/ufw.log | tail -20
sudo journalctl | grep "UFW" | tail -20
# ตัวอย่าง Log:
# UFW BLOCK IN=eth0 SRC=203.0.113.50 DST=10.0.0.1 PROTO=TCP DPT=22
UFW กับ IPv6
# ตรวจสอบว่า IPv6 เปิดใน UFW หรือไม่
cat /etc/default/ufw | grep IPV6
# IPV6=yes → รองรับ IPv6 แล้ว
# ถ้า IPV6=no → แก้เป็น yes
sudo nano /etc/default/ufw
# IPV6=yes
sudo ufw disable && sudo ufw enable
# Rules ที่เพิ่มจะมีผลกับทั้ง IPv4 และ IPv6 อัตโนมัติ
sudo ufw allow ssh
# จะสร้าง:
# ALLOW IN Anywhere on tcp dport 22 (v4)
# ALLOW IN Anywhere (v6) on tcp dport 22 (v6)
# ดู Rules ทั้ง IPv4 และ IPv6
sudo ufw status verbose
UFW กับ Docker
Docker ใช้ iptables โดยตรงและ Bypass UFW ทำให้ Container Port ที่ Expose อาจเข้าถึงได้จากภายนอกโดย UFW ไม่ได้ Block ต้องแก้ไข Docker Configuration เพื่อให้ UFW ทำงานได้ถูกต้อง
# ปัญหา: Docker Bypass UFW
# docker run -p 8080:80 nginx
# → Port 8080 เข้าถึงได้จากภายนอก แม้ UFW จะ deny 8080
# วิธีแก้: ให้ Docker Bind บน localhost แทน
docker run -p 127.0.0.1:8080:80 nginx
# → Port 8080 เข้าถึงได้เฉพาะ localhost เท่านั้น
# วิธีที่ 2: แก้ Docker daemon ให้ไม่ใช้ iptables
sudo tee /etc/docker/daemon.json <<'EOF'
{
"iptables": false
}
EOF
sudo systemctl restart docker
# แล้วจัดการ iptables/UFW เองทั้งหมด
# วิธีที่ 3: ใช้ UFW-Docker (third-party script)
# https://github.com/chaifeng/ufw-docker
ตัวอย่าง Configuration ครบถ้วนสำหรับ Web Server
#!/bin/bash
# ตั้งค่า UFW สำหรับ Web Server
# Reset และตั้งใหม่
sudo ufw reset
# Default Policy
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH — อนุญาตก่อนเปิด UFW เสมอ
sudo ufw allow from any to any port 22 proto tcp comment 'SSH'
# Web
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
# จำกัด SSH จาก IP ที่รู้จัก (ปลอดภัยกว่า)
# sudo ufw allow from 203.0.113.5 to any port 22 proto tcp
# Database เฉพาะจาก App Server
sudo ufw allow from 10.0.0.5 to any port 3306 proto tcp comment 'MySQL from App'
# Monitoring
sudo ufw allow from 10.0.0.10 to any port 9100 proto tcp comment 'Prometheus Node Exporter'
# เปิด UFW
sudo ufw enable
# ตรวจสอบ
sudo ufw status verbose
Rate Limiting ด้วย UFW
# UFW มี limit สำหรับ Rate Limiting บนพื้นฐาน iptables hashlimit
# Default: Block หาก Connection เกิน 6 ครั้งใน 30 วินาทีจาก IP เดียว
# เปิด Rate Limit บน SSH (ป้องกัน Brute Force)
sudo ufw limit ssh
sudo ufw limit 22/tcp
# ดูผลลัพธ์
sudo ufw status verbose
# 22/tcp LIMIT IN Anywhere
# Rate Limiting ซับซ้อนกว่านี้ต้องใช้ iptables โดยตรง หรือ fail2ban
สรุป
UFW ทำให้การจัดการ Firewall บน Linux ง่ายขึ้นมากด้วย Syntax ที่อ่านเข้าใจได้ ขั้นตอนพื้นฐานคือ ตั้ง Default Policy เป็น deny incoming และ allow outgoing อนุญาต SSH ก่อนเปิด UFW แล้วค่อยเพิ่ม Rules ที่ต้องการ Application Profiles ช่วยให้ไม่ต้องจำ Port Number สำหรับ Production Server ควรเปิด Logging ระดับ low เป็นอย่างน้อย และถ้าใช้ Docker ต้องระวัง Docker Bypass UFW ด้วยการ Bind บน localhost หรือปิด Docker iptables
แนะนำบริการ DE
การตั้งค่า UFW บน Cloud VPS ต้องการสิทธิ์ Root และ Console Access เพื่อแก้ไขหากตั้งค่าผิดพลาด Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบพร้อม Console Access ผ่าน Web Panel รองรับ Ubuntu ที่มี UFW มาพร้อมกัน เหมาะสำหรับการตั้งค่า Firewall บน Production Server ที่ต้องการความยืดหยุ่น
หากต้องการโฮสต์เว็บไซต์โดยมี Firewall จัดการให้อัตโนมัติ Cloud Hosting ของ DE มีระบบป้องกัน DDoS และ Firewall พร้อมใช้งานโดยไม่ต้องตั้งค่าเอง

