/static/codemoomoo2.png

UFW (Uncomplicated Firewall): คู่มือการใช้งานฉบับละเอียด

UFW (Uncomplicated Firewall) คือเครื่องมือจัดการไฟร์วอลล์ที่ออกแบบมาเพื่อให้การตั้งค่า iptables/nftables บน Linux ทำได้ง่ายขึ้น เหมาะสำหรับผู้ดูแลระบบที่ต้องการความปลอดภัยระดับ Host-based Firewall โดยไม่ต้องจดจำ syntax ที่ซับซ้อนของ iptables


สารบัญ (Table of Contents)

  1. บทนำ: UFW คืออะไร
  2. การติดตั้งและการเปิดใช้งาน
  3. แนวคิดพื้นฐาน: Default Policy
  4. การจัดการกฎพื้นฐาน (Basic Rules)
  5. การกำหนดกฎขั้นสูง (Advanced Rules)
  6. IPv6
  7. Logging และการตรวจสอบ
  8. โครงสร้างไฟล์คอนฟิกูเรชัน
  9. กรณีศึกษา: ตั้งค่า Port Forwarding / NAT ด้วย UFW
  10. แนวทางปฏิบัติที่แนะนำ (Best Practices)
  11. ตารางสรุปคำสั่งที่ใช้บ่อย (Quick Reference)
  12. แบบฝึกหัด (Lab Exercise)
  13. เอกสารอ้างอิงเพิ่มเติม

1. บทนำ: UFW คืออะไร

1.1 ความเป็นมา

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"]

1.2 ทำไมต้องใช้ UFW

คุณสมบัติ รายละเอียด
ใช้งานง่าย คำสั่งเป็นภาษาที่เข้าใจง่าย เช่น ufw allow 22 แทน syntax ที่ซับซ้อนของ iptables
เหมาะกับ Host-based Firewall ใช้ป้องกันเครื่องเซิร์ฟเวอร์แต่ละเครื่องได้ดี โดยเฉพาะ VPS หรือ Cloud Instance
รองรับ IPv4 และ IPv6 จัดการได้พร้อมกันในคำสั่งเดียว
มี Application Profile กำหนดพอร์ตล่วงหน้าให้กับซอฟต์แวร์ยอดนิยม เช่น OpenSSH, Nginx, Apache
Logging ในตัว สามารถเปิด log เพื่อตรวจสอบ traffic ที่ถูกบล็อกหรืออนุญาต

2. การติดตั้งและการเปิดใช้งาน

2.1 การติดตั้ง

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

2.2 ตรวจสอบสถานะ

sudo ufw status
sudo ufw status verbose
sudo ufw status numbered

⚠️ ข้อควรระวังก่อนเปิดใช้งาน (สำคัญมาก)

หากกำลังทำงานผ่าน SSH ต้องอนุญาตพอร์ต SSH (โดยทั่วไปคือพอร์ต 22) ก่อน เปิดใช้งาน UFW เสมอ มิฉะนั้นจะถูกตัดการเชื่อมต่อและไม่สามารถเข้าเซิร์ฟเวอร์ได้อีก

sudo ufw allow ssh
sudo ufw enable

2.3 การเปิด/ปิดใช้งาน

sudo ufw enable    # เปิดใช้งานไฟร์วอลล์ และตั้งให้ทำงานตอนบูตเครื่อง
sudo ufw disable   # ปิดใช้งานไฟร์วอลล์
sudo ufw reset      # รีเซ็ตกฎทั้งหมดกลับเป็นค่าเริ่มต้น (ต้องยืนยัน)

3. แนวคิดพื้นฐาน: Default Policy

ก่อนเพิ่มกฎเฉพาะเจาะจง ควรกำหนดนโยบายเริ่มต้น (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

4. การจัดการกฎพื้นฐาน (Basic Rules)

4.1 อนุญาต/ปฏิเสธตามหมายเลขพอร์ต

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)

4.2 อนุญาต/ปฏิเสธตามชื่อบริการ

UFW จะอ้างอิงจากไฟล์ /etc/services เพื่อแปลงชื่อบริการเป็นหมายเลขพอร์ตให้อัตโนมัติ

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ftp

4.3 ช่วงพอร์ต (Port Range)

sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp

4.4 การลบกฎ

sudo ufw status numbered      # ดูหมายเลขกฎก่อน
sudo ufw delete 3             # ลบกฎลำดับที่ 3
sudo ufw delete allow 80/tcp  # ลบกฎโดยระบุเงื่อนไขโดยตรง

4.5 Application Profiles

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 (ทั้งสองพอร์ต)


5. การกำหนดกฎขั้นสูง (Advanced Rules)

5.1 จำกัดตาม IP Address หรือ Subnet

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 ที่น่าสงสัย

5.2 จำกัดตาม Network Interface

sudo ufw allow in on eth0 to any port 80
sudo ufw deny in on eth1

5.3 Rate Limiting (ป้องกัน Brute-force)

คำสั่ง 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)

5.4 การปฏิเสธแบบเงียบ (Reject vs Deny)

sudo ufw reject 25/tcp

โดยทั่วไปแนะนำให้ใช้ deny มากกว่าในบริบทความปลอดภัย เพราะไม่เปิดเผยข้อมูลให้ผู้โจมตี (security through minimal information disclosure)

5.5 ลำดับความสำคัญของกฎ (Rule Insertion)

กฎใน UFW จะถูกประมวลผลตามลำดับจากบนลงล่าง หากต้องการแทรกกฎให้มีความสำคัญก่อนกฎอื่น ใช้ insert

sudo ufw insert 1 deny from 203.0.113.5

6. IPv6

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 โดยอัตโนมัติ


7. Logging และการตรวจสอบ

7.1 ระดับของ Log

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        # บันทึกทุกอย่างไม่มีการจำกัด

7.2 ตำแหน่งไฟล์ Log

sudo tail -f /var/log/ufw.log

7.3 การกรอง Log ด้วย grep

grep 'UFW BLOCK' /var/log/ufw.log | tail -20
grep 'SRC=203.0.113.5' /var/log/ufw.log

8. โครงสร้างไฟล์คอนฟิกูเรชัน

ไฟล์/โฟลเดอร์ หน้าที่
/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 ปกติได้


9. กรณีศึกษา: ตั้งค่า Port Forwarding / NAT ด้วย 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

9.1 NAT ไปยัง IP ปลายทางที่ระบุเอง (SNAT)

ตัวอย่างข้างต้นใช้ 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)


10. แนวทางปฏิบัติที่แนะนำ (Best Practices)

  1. เปิดพอร์ต SSH ก่อนเปิดใช้งาน UFW เสมอ เพื่อป้องกันการถูกล็อกเอาต์จากเซิร์ฟเวอร์ตัวเอง
  2. ใช้ ufw limit กับพอร์ตที่ใช้ authentication เช่น SSH เพื่อลดความเสี่ยงจาก brute-force
  3. กำหนด default policy แบบ deny incoming / allow outgoing เป็นจุดเริ่มต้นเสมอ
  4. เปิดเฉพาะพอร์ตที่จำเป็นจริง ๆ ตามหลัก least privilege
  5. ใช้ Application Profile แทนการจำหมายเลขพอร์ต เพื่อลดความผิดพลาด
  6. เปิด logging ระดับ low หรือ medium ไว้เป็นค่าเริ่มต้นเพื่อการตรวจสอบย้อนหลัง
  7. ตรวจสอบ ufw status verbose เป็นระยะ เพื่อยืนยันว่ากฎที่ใช้งานอยู่ตรงตามที่ตั้งใจ
  8. สำรอง (backup) ไฟล์ /etc/ufw/ ก่อนแก้ไขขั้นสูง เช่นการตั้งค่า NAT

11. ตารางสรุปคำสั่งที่ใช้บ่อย (Quick Reference)

คำสั่ง ความหมาย
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 รีเซ็ตกฎทั้งหมด

12. แบบฝึกหัด (Lab Exercise)

  1. ติดตั้งและเปิดใช้งาน UFW บนเครื่อง Virtual Machine ทดสอบ (ห้ามลืมเปิดพอร์ต SSH ก่อน)
  2. ตั้งค่า default policy เป็น deny incoming / allow outgoing
  3. เปิดพอร์ตสำหรับเว็บเซิร์ฟเวอร์ (HTTP/HTTPS) โดยใช้ Application Profile
  4. ตั้งค่า rate limiting สำหรับพอร์ต SSH
  5. จำลองการเชื่อมต่อจาก IP ที่ไม่ได้รับอนุญาต แล้วตรวจสอบผลลัพธ์ผ่าน /var/log/ufw.log
  6. ทดลองลบกฎที่สร้างไว้ทีละกฎโดยใช้ ufw status numbered และ ufw delete

เอกสารอ้างอิงเพิ่มเติม