
UFW (Uncomplicated Firewall) คือเครื่องมือจัดการไฟร์วอลล์ที่ออกแบบมาเพื่อให้การตั้งค่า
iptables/nftablesบน Linux ทำได้ง่ายขึ้น เหมาะสำหรับผู้ดูแลระบบที่ต้องการความปลอดภัยระดับ Host-based Firewall โดยไม่ต้องจดจำ syntax ที่ซับซ้อนของ iptables
UFW ถูกพัฒนาโดยทีมงาน Ubuntu และเปิดตัวครั้งแรกในปี 2008 โดยมีเป้าหมายเพื่อลดความซับซ้อนในการจัดการไฟร์วอลล์บน Linux ในทางเทคนิคแล้ว UFW ไม่ใช่ไฟร์วอลล์เอนจิ้นด้วยตัวเอง แต่เป็น front-end ที่ครอบการทำงานของ iptables (หรือ nftables ในระบบรุ่นใหม่) ไว้อีกชั้นหนึ่ง
graph LR
A["ผู้ดูแลระบบ
Administrator"] -->|"คำสั่ง ufw"| B["UFW
(Front-end)"]
B -->|"แปลงเป็น rule"| C["iptables / nftables
(Netfilter Engine)"]
C -->|"บังคับใช้กฎ"| D["Linux Kernel
Packet Filtering"]
D --> E["เครือข่าย
Network Traffic"]
| คุณสมบัติ | รายละเอียด |
|---|---|
| ใช้งานง่าย | คำสั่งเป็นภาษาที่เข้าใจง่าย เช่น ufw allow 22 แทน syntax ที่ซับซ้อนของ iptables |
| เหมาะกับ Host-based Firewall | ใช้ป้องกันเครื่องเซิร์ฟเวอร์แต่ละเครื่องได้ดี โดยเฉพาะ VPS หรือ Cloud Instance |
| รองรับ IPv4 และ IPv6 | จัดการได้พร้อมกันในคำสั่งเดียว |
| มี Application Profile | กำหนดพอร์ตล่วงหน้าให้กับซอฟต์แวร์ยอดนิยม เช่น OpenSSH, Nginx, Apache |
| Logging ในตัว | สามารถเปิด log เพื่อตรวจสอบ traffic ที่ถูกบล็อกหรืออนุญาต |
UFW เป็น front-end ที่ไม่ได้ผูกติดกับ distro ใด distro หนึ่ง จึงสามารถติดตั้งได้บน Linux หลายค่าย แม้จะพัฒนาโดยทีม Ubuntu ก็ตาม ด้านล่างเป็นตัวอย่างการติดตั้งบน 3 distro ที่นิยมใช้งาน
Ubuntu / Debian
บน Ubuntu ส่วนใหญ่ UFW จะถูกติดตั้งมาให้อยู่แล้วโดยค่าเริ่มต้น แต่หากยังไม่มีสามารถติดตั้งได้ดังนี้
sudo apt update
sudo apt install ufw -y
Arch Linux
ติดตั้งผ่าน pacman จาก official repository (community/extra) จากนั้นต้องเปิดใช้งานผ่าน systemd เพราะ Arch ไม่ได้ enable service ให้อัตโนมัติ
sudo pacman -Syu
sudo pacman -S ufw
sudo systemctl enable --now ufw
openSUSE Tumbleweed
ติดตั้งผ่าน zypper เช่นเดียวกัน และต้อง enable service ด้วย systemctl เหมือนกับ Arch โดย openSUSE บางเวอร์ชันอาจมี firewalld เปิดใช้งานอยู่ก่อนแล้ว ควรปิด firewalld ก่อนเปิด UFW เพื่อไม่ให้ชนกัน
sudo zypper refresh
sudo zypper install ufw
sudo systemctl disable --now firewalld # ปิด firewalld ถ้ามีอยู่ก่อน (กันชนกับ ufw)
sudo systemctl enable --now ufw
หมายเหตุ: บน Arch Linux และ openSUSE เนื่องจากไม่ได้ enable service ให้อัตโนมัติเหมือน Ubuntu การรัน
sudo ufw enableเพียงอย่างเดียวอาจไม่เพียงพอให้ UFW ทำงานตอนบูตเครื่อง จึงควรตรวจสอบด้วยsystemctl status ufwเสมอ
ตรวจสอบเวอร์ชันที่ติดตั้ง (ใช้ได้กับทุก distro)
ufw version
sudo ufw status
sudo ufw status verbose
sudo ufw status numbered
status — แสดงสถานะทั่วไปว่า active หรือ inactivestatus verbose — แสดงรายละเอียดเพิ่มเติม เช่น default policy, logging levelstatus numbered — แสดงกฎพร้อมหมายเลขลำดับ ใช้สำหรับการลบกฎในภายหลังหากกำลังทำงานผ่าน SSH ต้องอนุญาตพอร์ต SSH (โดยทั่วไปคือพอร์ต 22) ก่อน เปิดใช้งาน UFW เสมอ มิฉะนั้นจะถูกตัดการเชื่อมต่อและไม่สามารถเข้าเซิร์ฟเวอร์ได้อีก
sudo ufw allow ssh
sudo ufw enable
sudo ufw enable # เปิดใช้งานไฟร์วอลล์ และตั้งให้ทำงานตอนบูตเครื่อง
sudo ufw disable # ปิดใช้งานไฟร์วอลล์
sudo ufw reset # รีเซ็ตกฎทั้งหมดกลับเป็นค่าเริ่มต้น (ต้องยืนยัน)
ก่อนเพิ่มกฎเฉพาะเจาะจง ควรกำหนดนโยบายเริ่มต้น (default policy) สำหรับ traffic ทุกทิศทางก่อน
sudo ufw default deny incoming # ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมดโดยค่าเริ่มต้น
sudo ufw default allow outgoing # อนุญาตการเชื่อมต่อขาออกทั้งหมดโดยค่าเริ่มต้น
แนวคิดนี้เรียกว่า "deny by default, allow by exception" — ปฏิเสธทุกอย่างเป็นค่าเริ่มต้น แล้วค่อยเปิดเฉพาะสิ่งที่จำเป็น ถือเป็นหลักการพื้นฐานของความปลอดภัยเครือข่าย (principle of least privilege)
flowchart TD
Start["Packet เข้ามาที่เครื่อง"] --> Check{"ตรงกับกฎ
ที่กำหนดไว้หรือไม่?"}
Check -->|"ตรงกับกฎ ALLOW"| Allow["อนุญาตให้ผ่าน"]
Check -->|"ตรงกับกฎ DENY"| Deny["ปฏิเสธ / ทิ้ง packet"]
Check -->|"ไม่ตรงกับกฎใดเลย"| Default["ใช้ Default Policy"]
Default -->|"deny incoming"| Deny
Default -->|"allow outgoing"| Allow
sudo ufw allow 22 # อนุญาตพอร์ต 22 ทั้ง TCP และ UDP
sudo ufw allow 80/tcp # อนุญาตเฉพาะ TCP พอร์ต 80
sudo ufw allow 53/udp # อนุญาตเฉพาะ UDP พอร์ต 53
sudo ufw deny 23 # ปฏิเสธพอร์ต 23 (Telnet)
UFW จะอ้างอิงจากไฟล์ /etc/services เพื่อแปลงชื่อบริการเป็นหมายเลขพอร์ตให้อัตโนมัติ
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ftp
sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp
sudo ufw status numbered # ดูหมายเลขกฎก่อน
sudo ufw delete 3 # ลบกฎลำดับที่ 3
sudo ufw delete allow 80/tcp # ลบกฎโดยระบุเงื่อนไขโดยตรง
UFW มาพร้อมโปรไฟล์สำหรับซอฟต์แวร์ยอดนิยม เก็บไว้ที่ /etc/ufw/applications.d/
sudo ufw app list # แสดงรายชื่อโปรไฟล์ที่มี
sudo ufw app info 'Nginx Full' # ดูรายละเอียดของโปรไฟล์
sudo ufw allow 'Nginx Full' # อนุญาตทั้ง HTTP และ HTTPS
sudo ufw allow 'OpenSSH'
ตัวอย่างโปรไฟล์ของ Nginx โดยทั่วไปมี 3 แบบ: Nginx HTTP (พอร์ต 80), Nginx HTTPS (พอร์ต 443), และ Nginx Full (ทั้งสองพอร์ต)
sudo ufw allow from 192.168.1.100 # อนุญาตทุกพอร์ตจาก IP นี้
sudo ufw allow from 192.168.1.0/24 # อนุญาตทั้ง subnet
sudo ufw allow from 192.168.1.100 to any port 22 # อนุญาตเฉพาะพอร์ต 22 จาก IP นี้
sudo ufw deny from 203.0.113.5 # ปฏิเสธ IP ที่น่าสงสัย
sudo ufw allow in on eth0 to any port 80
sudo ufw deny in on eth1
คำสั่ง limit จะบล็อก IP ที่พยายามเชื่อมต่อเกิน 6 ครั้งภายใน 30 วินาที เหมาะสำหรับป้องกันการโจมตีแบบ brute-force บนพอร์ต SSH
sudo ufw limit ssh
sudo ufw limit 22/tcp
sequenceDiagram
participant Attacker as ผู้โจมตี
participant UFW as UFW (limit rule)
participant SSHD as SSH Daemon
Attacker->>UFW: พยายามเชื่อมต่อครั้งที่ 1-6 (ภายใน 30 วิ)
UFW->>SSHD: ส่งต่อ connection ตามปกติ
Attacker->>UFW: พยายามเชื่อมต่อครั้งที่ 7
UFW-->>Attacker: บล็อกชั่วคราว (rate limit exceeded)
deny — ทิ้ง packet โดยไม่ตอบกลับใด ๆ (ผู้โจมตีไม่รู้ว่าพอร์ตถูกบล็อกหรือปิดอยู่)reject — ทิ้ง packet และส่ง response กลับไปแจ้งว่าถูกปฏิเสธsudo ufw reject 25/tcp
โดยทั่วไปแนะนำให้ใช้ deny มากกว่าในบริบทความปลอดภัย เพราะไม่เปิดเผยข้อมูลให้ผู้โจมตี (security through minimal information disclosure)
กฎใน UFW จะถูกประมวลผลตามลำดับจากบนลงล่าง หากต้องการแทรกกฎให้มีความสำคัญก่อนกฎอื่น ใช้ insert
sudo ufw insert 1 deny from 203.0.113.5
UFW รองรับ IPv6 โดยอัตโนมัติหากเปิดใช้งานไว้ในระบบ ตรวจสอบและเปิดใช้งานได้ที่ไฟล์ /etc/default/ufw
sudo nano /etc/default/ufw
IPV6=yes
หลังแก้ไขแล้วต้อง restart UFW
sudo ufw disable
sudo ufw enable
เมื่อเปิดใช้งานแล้ว คำสั่งเดิม เช่น ufw allow 80/tcp จะสร้างกฎให้ทั้ง IPv4 และ IPv6 โดยอัตโนมัติ
sudo ufw logging on
sudo ufw logging off
sudo ufw logging low # บันทึกเฉพาะ blocked packet ที่ไม่ตรงกับ default policy
sudo ufw logging medium # บันทึกเพิ่มเติมรวมถึง rate limiting
sudo ufw logging high # บันทึกละเอียดมาก รวมถึง rate limiting ต่อผู้ใช้
sudo ufw logging full # บันทึกทุกอย่างไม่มีการจำกัด
sudo tail -f /var/log/ufw.log
grep 'UFW BLOCK' /var/log/ufw.log | tail -20
grep 'SRC=203.0.113.5' /var/log/ufw.log
| ไฟล์/โฟลเดอร์ | หน้าที่ |
|---|---|
/etc/ufw/ufw.conf |
ค่าคอนฟิกหลัก เช่น เปิด/ปิด IPv6 |
/etc/ufw/before.rules |
กฎที่ประมวลผลก่อนกฎที่ผู้ใช้กำหนดผ่านคำสั่ง ufw |
/etc/ufw/after.rules |
กฎที่ประมวลผลหลังกฎของผู้ใช้ |
/etc/ufw/applications.d/ |
โปรไฟล์แอปพลิเคชันต่าง ๆ |
/etc/default/ufw |
ค่า default policy และการตั้งค่า IPv6 |
หมายเหตุ: การแก้ไขไฟล์
before.rulesและafter.rulesโดยตรงใช้สำหรับกรณีขั้นสูง เช่น การตั้งค่า NAT/Port Forwarding ซึ่งไม่สามารถทำผ่านคำสั่งufwปกติได้
การทำ NAT ต้องแก้ไขไฟล์ /etc/ufw/before.rules โดยเพิ่มตาราง nat ไว้ที่ด้านบนของไฟล์
sudo nano /etc/ufw/before.rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT
จากนั้นเปิดใช้งาน IP forwarding ในไฟล์ /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"
และเปิด packet forwarding ระดับ kernel ในไฟล์ /etc/ufw/sysctl.conf
net/ipv4/ip_forward=1
รีสตาร์ท UFW เพื่อให้มีผล
sudo ufw disable && sudo ufw enable
ตัวอย่างข้างต้นใช้ MASQUERADE ซึ่งเหมาะกับกรณีที่ IP ของ interface ขาออกอาจเปลี่ยนแปลงได้ (เช่นได้รับผ่าน DHCP) แต่หากต้องการ ระบุกลุ่มเครือข่าย (subnet) ให้ถูก NAT ไปเป็น IP ที่กำหนดไว้ตายตัว ควรใช้ SNAT แทน ซึ่งมีประสิทธิภาพดีกว่าเล็กน้อยเพราะไม่ต้อง lookup IP ของ interface ทุก packet
| MASQUERADE | SNAT | |
|---|---|---|
| IP ที่ใช้แปลง | ดึงจาก interface อัตโนมัติ (แบบ dynamic) | ระบุ IP ตายตัวที่ต้องการ |
| เหมาะกับ | เครื่องที่ได้ IP แบบ DHCP หรือเปลี่ยนบ่อย | เครื่องที่มี Static IP แน่นอน |
| ประสิทธิภาพ | ต่ำกว่าเล็กน้อย (lookup ทุก packet) | สูงกว่าเล็กน้อย |
แก้ไขไฟล์เดิมที่ /etc/ufw/before.rules ในส่วน *nat แต่เปลี่ยนจาก MASQUERADE เป็น SNAT --to-source
sudo nano /etc/ufw/before.rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
COMMIT
จากตัวอย่างนี้ ทุก packet ที่มาจากเครือข่าย 192.168.1.0/24 และออกทาง interface eth0 จะถูกแปลง source IP เป็น 203.0.113.10 เสมอ
เจาะจงเฉพาะกลุ่มปลายทางบางกลุ่ม สามารถเพิ่มเงื่อนไข -d (destination) เพื่อให้ NAT เฉพาะเวลาที่ปลายทางเป็นเครือข่ายที่กำหนดเท่านั้น
-A POSTROUTING -s 192.168.1.0/24 -d 10.0.0.0/8 -o eth0 -j SNAT --to-source 203.0.113.10
NAT แบบ pool (หลาย IP) หากต้องการกระจาย traffic ไปยัง IP ปลายทางหลายตัวเพื่อทำ load balancing สามารถระบุเป็นช่วง IP ได้
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10-203.0.113.12
หลังแก้ไขไฟล์แล้ว ต้องเปิด DEFAULT_FORWARD_POLICY="ACCEPT" ใน /etc/default/ufw และเปิด net/ipv4/ip_forward=1 ใน /etc/ufw/sysctl.conf เหมือนขั้นตอนของ MASQUERADE จากนั้น restart UFW
sudo ufw disable && sudo ufw enable
ข้อควรระวัง: IP ที่ระบุใน
--to-sourceต้องเป็น IP ที่ผูกอยู่กับ interface นั้นจริง หรือเป็น IP ที่ router/upstream รับรู้ว่าเป็นของเครื่องนี้ มิฉะนั้น traffic ขากลับจะหาทางกลับไม่ถูก (asymmetric routing)
ufw limit กับพอร์ตที่ใช้ authentication เช่น SSH เพื่อลดความเสี่ยงจาก brute-forceufw status verbose เป็นระยะ เพื่อยืนยันว่ากฎที่ใช้งานอยู่ตรงตามที่ตั้งใจ/etc/ufw/ ก่อนแก้ไขขั้นสูง เช่นการตั้งค่า NAT| คำสั่ง | ความหมาย |
|---|---|
sudo ufw enable |
เปิดใช้งานไฟร์วอลล์ |
sudo ufw disable |
ปิดใช้งานไฟร์วอลล์ |
sudo ufw status verbose |
ดูสถานะแบบละเอียด |
sudo ufw default deny incoming |
ตั้ง default policy ปฏิเสธขาเข้า |
sudo ufw allow 22/tcp |
อนุญาตพอร์ต 22 TCP |
sudo ufw deny 23 |
ปฏิเสธพอร์ต 23 |
sudo ufw limit ssh |
จำกัดอัตราการเชื่อมต่อ SSH |
sudo ufw allow from 192.168.1.0/24 |
อนุญาต subnet ที่ระบุ |
sudo ufw delete 3 |
ลบกฎลำดับที่ 3 |
sudo ufw app list |
แสดงโปรไฟล์แอปพลิเคชัน |
sudo ufw logging medium |
ตั้งระดับการบันทึก log |
sudo ufw reset |
รีเซ็ตกฎทั้งหมด |
/var/log/ufw.logufw status numbered และ ufw deleteman ufw/etc/ufw/, /etc/default/ufw