ตั้งค่า Firewall ด้วย UFW บน Ubuntu
คำตอบสั้น ๆ: ตั้งนโยบายปิดขาเข้าทั้งหมด เปิดเฉพาะ SSH, HTTP และ HTTPS จำกัด Port ตาม IP ต้นทาง และจัดการกฎ UFW บน Ubuntu โดยไม่ตัดการเชื่อมต่อของตัวเอง
คู่มือนี้อธิบาย Firewall ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
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 ใช้เมื่อต้องการเริ่มใหม่เท่านั้น
ปัญหาที่พบบ่อยเกี่ยวกับ Firewall
เปิด 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/
อ่านเพิ่มเติมเกี่ยวกับ Firewall