ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ตั้งค่า Firewall ด้วย UFW บน Ubuntu

ตั้งค่า Firewall ด้วย UFW บน Ubuntu

UFW (Uncomplicated Firewall) เป็นเครื่องมือจัดการ Firewall ที่มาพร้อม Ubuntu ช่วยให้กำหนดกฎได้ด้วยคำสั่งสั้น ๆ แทนการเขียนกฎ iptables/nftables เอง แนวคิดที่แนะนำคือปิดทุกการเชื่อมต่อขาเข้าไว้ก่อน แล้วเปิดเฉพาะ Port ที่บริการจำเป็นต้องใช้ เช่น SSH, HTTP และ HTTPS

คู่มือนี้ใช้ได้กับ Ubuntu 22.04 และ 24.04 หากต้องการกำหนดกฎในระดับละเอียดกว่านี้ ดู วิธีการกำหนดค่าไฟร์วอลล์บน Linux ด้วย iptables สำหรับ AlmaLinux และ Rocky Linux ให้ใช้ firewalld แทน

สิ่งที่ต้องเตรียม

  • Ubuntu 22.04/24.04 และผู้ใช้ที่ใช้ sudo ได้
  • รู้ว่า SSH ของคุณใช้ Port อะไร (ค่าเริ่มต้นคือ 22) ตรวจได้ด้วย sudo ss -tlnp | grep ssh
  • รายการบริการที่ต้องเปิดให้ภายนอกเข้าถึง เช่น เว็บ (80, 443) หรือฐานข้อมูลที่ต้องเข้าจาก IP เฉพาะ

หมายเหตุ: ถ้าเปิด UFW โดยยังไม่อนุญาต SSH คุณจะถูกตัดการเชื่อมต่อทันที เปิด SSH Session ค้างไว้ และเตรียม Console Server ผ่าน Web UI ไว้เป็นช่องทางสำรอง

ขั้นตอนที่ 1: ตรวจสถานะ UFW

sudo ufw status verbose

บนเครื่องใหม่มักได้ Status: inactive ถ้าไม่พบคำสั่ง ufw ให้ติดตั้งก่อน

sudo apt update
sudo apt install ufw

ขั้นตอนที่ 2: กำหนดนโยบายเริ่มต้น

ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมด และอนุญาตขาออกทั้งหมด (เพื่อให้เซิร์ฟเวอร์ยังอัปเดตแพ็กเกจและเรียก API ภายนอกได้)

sudo ufw default deny incoming
sudo ufw default allow outgoing

คำสั่งนี้ยังไม่มีผลจนกว่าจะเปิดใช้งาน UFW ในขั้นตอนที่ 4

ขั้นตอนที่ 3: อนุญาต SSH และบริการที่ต้องใช้

อนุญาต SSH ก่อนเสมอ ถ้าใช้ Port 22 ตามค่าเริ่มต้น

sudo ufw allow OpenSSH

OpenSSH เป็นชื่อ Application Profile ที่หมายถึง 22/tcp ถ้าคุณเปลี่ยน SSH Port แล้ว ให้ระบุเลข Port แทน

sudo ufw allow 2222/tcp

หากคุณเข้าจาก IP คงที่ของสำนักงาน การจำกัด SSH ให้เข้าได้เฉพาะ IP นั้นจะปลอดภัยกว่า

sudo ufw allow from 198.51.100.25 to any port 22 proto tcp

เปิดเว็บ HTTP และ HTTPS

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

ถ้าติดตั้ง Nginx หรือ Apache จาก apt แล้ว จะมี Profile ให้ใช้แทนได้ เช่น sudo ufw allow 'Nginx Full' หรือ sudo ufw allow 'Apache Full' ดูรายชื่อ Profile ที่มีได้ด้วย

sudo ufw app list

ตัวอย่างการเปิดฐานข้อมูล MySQL ให้เฉพาะ Application Server หนึ่งเครื่อง (ไม่ควรเปิด 3306 ให้ทั้งอินเทอร์เน็ต)

sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp

ขั้นตอนที่ 4: เปิดใช้งาน UFW

ตรวจอีกครั้งว่าได้อนุญาต SSH แล้ว จากนั้นเปิดใช้งาน

sudo ufw show added
sudo ufw enable

ระบบจะเตือน Command may disrupt existing ssh connections. Proceed with operation (y|n)? ตอบ y แล้วจะได้ Firewall is active and enabled on system startup UFW จะเปิดอัตโนมัติทุกครั้งที่บูตเครื่อง

ตรวจสอบผลลัพธ์

sudo ufw status verbose

ตัวอย่างผลลัพธ์ที่ถูกต้อง

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere

จากนั้นเปิดหน้าต่างใหม่แล้วลอง SSH เข้าเซิร์ฟเวอร์ และเปิดเว็บไซต์จากเบราว์เซอร์ หากใช้ได้ทั้งคู่จึงค่อยปิด Session เดิม

หากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ตนั้นเพิ่มด้วย เพราะแพ็กเก็ตต้องผ่านทั้งสองชั้น

การจัดการกฎที่ใช้บ่อย

ดูกฎพร้อมหมายเลข แล้วลบตามหมายเลข

sudo ufw status numbered
sudo ufw delete 3

ลบด้วยรูปแบบเดียวกับตอนเพิ่มก็ได้ เช่น sudo ufw delete allow 80/tcp หากมีทั้งกฎ IPv4 และ IPv6 (ขึ้นว่า (v6)) ให้ลบทีละรายการ และดูหมายเลขใหม่ทุกครั้งหลังลบ เพราะหมายเลขจะเลื่อน

จำกัดอัตราการเชื่อมต่อ SSH (ปฏิเสธ IP ที่เชื่อมต่อ 6 ครั้งขึ้นไปภายใน 30 วินาที) ช่วยลดการเดารหัสผ่านได้ระดับหนึ่ง

sudo ufw limit OpenSSH

บล็อก IP ที่ไม่ต้องการ ใช้ insert 1 เพื่อให้กฎนี้อยู่ลำดับแรก เพราะ UFW ใช้กฎแรกที่ตรงเงื่อนไข

sudo ufw insert 1 deny from 192.0.2.50

ปิด UFW ชั่วคราว (กฎยังเก็บไว้) ใช้ sudo ufw disable ส่วน sudo ufw reset จะลบกฎทั้งหมดและปิด UFW ใช้เมื่อต้องการเริ่มใหม่เท่านั้น

ปัญหาที่พบบ่อย

เปิด UFW แล้วเข้า SSH ไม่ได้

ลืมอนุญาต SSH หรืออนุญาต Port ผิด เข้าผ่าน Console แล้วรัน sudo ufw allow OpenSSH (หรือเลข Port จริง) หรือ sudo ufw disable เพื่อแก้ไขก่อน

Container ของ Docker ยังเข้าถึงได้จากภายนอกทั้งที่ UFW ปิด Port ไว้

Docker เขียนกฎ iptables ของตัวเองซึ่งทำงานก่อนกฎของ UFW Port ที่ publish ด้วย -p 8080:80 จึงเปิดสู่ภายนอกเสมอ วิธีที่ง่ายที่สุดคือ bind เฉพาะ localhost เช่น -p 127.0.0.1:8080:80 แล้วให้ Nginx เป็น Reverse Proxy อ่านรายละเอียดเพิ่มที่ เอกสาร Docker เรื่อง Packet filtering and firewalls

กฎ IPv6 ไม่ถูกสร้าง

ตรวจว่าไฟล์ /etc/default/ufw มี IPV6=yes (ค่าเริ่มต้นของ Ubuntu) หากแก้ไขค่า ให้รัน sudo ufw disable และ sudo ufw enable อีกครั้ง

อยากรู้ว่ามีอะไรถูกบล็อก

ดู Log ที่ขึ้นต้นด้วย [UFW BLOCK] ด้วย sudo grep 'UFW BLOCK' /var/log/ufw.log | tail -n 20 หรือ sudo journalctl -k | grep 'UFW BLOCK' ถ้าไม่มีไฟล์ ufw.log

หากตั้งค่าแล้วบริการยังเข้าถึงไม่ได้ หรือถูกล็อกออกจากเซิร์ฟเวอร์ ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security