firewall และ security shield

Firewall บน VPS ด้วย UFW และ iptables ป้องกันการเข้าถึงที่ไม่ควรเปิด

มิถุนายน 2026 · อ่าน 6 นาที

Firewall คือด่านแรกที่กรอง network traffic ก่อนถึง application บน VPS ที่ไม่มี firewall ทุก port ที่ service รันอยู่จะถูกเข้าถึงได้จากทุกที่บนอินเทอร์เน็ต

ระวัง: เปิด port SSH ไว้ก่อนเสมอก่อน enable firewall ไม่งั้นจะเข้าเซิร์ฟเวอร์ไม่ได้

UFW: Firewall ง่ายสำหรับมือใหม่

UFW (Uncomplicated Firewall) เป็น frontend ของ iptables ที่ใช้งานง่าย เหมาะกับ VPS ทั่วไป

apt install ufw

# กำหนด policy เริ่มต้น
ufw default deny incoming
ufw default allow outgoing

# เปิด port ที่ต้องการ
ufw allow 22/tcp     # SSH (หรือ port ที่เปลี่ยนไว้)
ufw allow 80/tcp     # HTTP
ufw allow 443/tcp    # HTTPS

# เปิด firewall
ufw enable
ufw status verbose

เปิด Port เฉพาะ IP ที่เชื่อถือได้

# เปิด MySQL เฉพาะ IP ที่กำหนด
ufw allow from 1.2.3.4 to any port 3306

# เปิด SSH เฉพาะ IP ที่บ้านหรือที่ทำงาน
ufw allow from 203.0.113.0/24 to any port 22

ลบ Rule

ufw status numbered    # ดูหมายเลข rule
ufw delete 3           # ลบ rule หมายเลข 3

iptables: ควบคุมได้ละเอียดกว่า

iptables คือ firewall ระดับ kernel ที่ UFW ใช้อยู่เบื้องหลัง เหมาะกับคนที่ต้องการ rule ซับซ้อน

# ดู rule ปัจจุบัน
iptables -L -n -v --line-numbers

# เปิด port
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Block IP ที่น่าสงสัย
iptables -A INPUT -s 1.2.3.4 -j DROP

# Drop ทุก incoming ที่ไม่ได้กำหนด
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

บันทึก iptables ให้คงอยู่หลัง reboot:

apt install iptables-persistent
netfilter-persistent save

Rate Limiting: ป้องกัน Brute Force

จำกัด connection ใหม่ต่อนาทีต่อ IP เพื่อป้องกัน brute force:

ufw limit ssh/tcp
# หรือด้วย iptables
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --set -j ACCEPT

ปัญหา Docker กับ UFW

Docker เพิ่ม iptables rule โดยตรงโดย bypass UFW ถ้า publish port ด้วย -p 3306:3306 port จะเปิดออก internet แม้ UFW จะ block ไว้

วิธีแก้: bind เฉพาะ localhost -p 127.0.0.1:3306:3306 หรือใช้ Docker network แทน


ตรวจสอบว่า Firewall ทำงานถูกต้อง

# ดู rule ทั้งหมดที่ active
ufw status numbered
ufw status verbose

# ตรวจ port ที่เปิดอยู่จากภายนอก
nmap -p 22,80,443 YOUR_VPS_IP

# ดู listening ports ทั้งหมดบน VPS
ss -tlnp
ระวัง cloud firewall: VPS provider หลายรายมี firewall ระดับ network อยู่ก่อน (Security Group / Cloud Firewall) ที่ทำงานแยกจาก UFW การตั้งค่า UFW อย่างเดียวอาจไม่เพียงพอถ้า cloud firewall เปิด port ไว้

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

Error: SSH เข้าไม่ได้หลัง enable UFW

ลืมเปิด SSH port ก่อน enable หรือเปิดผิด port:

ยืนยันจากภายนอกอีกชั้นด้วย เครื่องมือเช็คพอร์ตของ dnsxray.com ลองสแกนพอร์ตสำคัญ (22, 80, 443, 3306) จากอินเทอร์เน็ตจริง ถ้าพอร์ตที่ตั้งใจปิดยังขึ้น Open แปลว่า Rule ยังไม่ทำงานหรือเรียงลำดับผิด

# ถ้ายังเข้า console ของ VPS provider ได้ (KVM/VNC)
ufw disable   # ปิด UFW ชั่วคราว
ufw allow YOUR_SSH_PORT/tcp
ufw enable

# ตรวจ SSH port ที่ใช้จริง
grep Port /etc/ssh/sshd_config

Docker container เข้าถึงได้จากภายนอกแม้ UFW บล็อก

Docker ข้าม UFW โดย inject iptables rule โดยตรง วิธีแก้ที่ง่ายที่สุด:

# bind เฉพาะ localhost แทนการ publish ออก internet
docker run -p 127.0.0.1:3306:3306 mysql
# แทน
docker run -p 3306:3306 mysql

UFW rule บันทึกแล้วแต่หายหลัง reboot

# ตรวจว่า UFW service enabled
systemctl is-enabled ufw
systemctl enable ufw

# ตรวจ backup rule files
ls /etc/ufw/
cat /etc/ufw/user.rules

iptables rule หายหลัง reboot

iptables ไม่ persistent โดยค่าเริ่มต้น ต้องติดตั้งและ save:

apt install iptables-persistent
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Rate limit ทำงานแล้วแต่ตัวเองก็โดน block ด้วย

ufw limit ssh block IP ที่ connect เกิน 6 ครั้งใน 30 วินาที ยกเว้น IP ของตัวเองได้:

# ยกเว้น IP ของตัวเอง — match ก่อน limit rule
ufw allow from YOUR_HOME_IP to any port 22

คำถามที่พบบ่อย

UFW กับ iptables ใช้ร่วมกันได้ไหม?

ได้ UFW เป็น wrapper ของ iptables อยู่แล้ว ถ้าต้องการ rule ซับซ้อนเพิ่มเติมใส่ใน /etc/ufw/before.rules แทนการ run iptables แยก

ควร reset UFW แล้วตั้งใหม่ยังไง?

ufw reset        # ลบ rule ทั้งหมดและ disable
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

VPS ที่ใช้ Cloudflare จำเป็นต้องมี firewall เองไหม?

จำเป็น Cloudflare ป้องกัน traffic ที่ผ่าน Cloudflare เท่านั้น ถ้า attacker รู้ IP จริงของ VPS ก็เชื่อมตรงได้ การ block ทุก IP ยกเว้น Cloudflare range ใน UFW เป็น best practice


สรุป

UFW เพียงพอสำหรับ VPS ทั่วไป ตั้งค่า deny-all แล้วเปิดเฉพาะ port ที่จำเป็น ตรวจสอบ ufw status สม่ำเสมอว่ามี port ที่เปิดไว้โดยไม่ตั้งใจหรือเปล่า