ตั้งค่า UFW บน VPS ให้ปลอดภัยโดยไม่ล็อก SSH
เรียนรู้การตั้งค่า UFW บน VPS ด้วยนโยบาย default-deny อนุญาตเฉพาะพอร์ตที่จำเป็น และเปิดใช้งานโดยไม่ทำให้ SSH หลุดหรือเข้าเซิร์ฟเวอร์ไม่ได้
UFW คืออะไรและทำไมคุณถึงควรใช้
UFW ย่อมาจาก Uncomplicated Firewall ซึ่งชื่อนี้สะท้อนความเป็นจริงได้ดี มันเป็นส่วนติดต่อผู้ใช้ที่ใช้งานง่ายสำหรับไฟร์วอลล์ที่มีอยู่แล้วใน Linux kernel แทนที่จะต้องเขียนกฎดิบๆ คุณสามารถพิมพ์คำสั่งสั้นๆ เช่น ufw allow 22/tcp ได้เลย บน VPS ที่เพิ่งติดตั้งใหม่ บริการทุกอย่างที่เปิดพอร์ตไว้จะสามารถเข้าถึงได้จากอินเทอร์เน็ตโดยค่าเริ่มต้น ไฟร์วอลล์จะเปลี่ยนสถานะนี้โดยการปฏิเสธการเชื่อมต่อทั้งหมด แล้วอนุญาตเฉพาะพอร์ตที่คุณใช้งานจริงเท่านั้น การเปลี่ยนแปลงเพียงขั้นตอนเดียวนี้จะช่วยลดความเสี่ยงส่วนใหญ่ของคุณได้ด้วยคำสั่งเพียง 4 คำสั่ง UFW เป็นเครื่องมือสำหรับ Ubuntu และ Debian ดังนั้นหาก VPS ของคุณใช้ Rocky หรือ AlmaLinux คุณควรใช้ firewalld แทน ซึ่งจะจัดระเบียบกฎต่างๆ ไว้เป็นโซน
ก่อนจะเริ่มใช้งาน คุณควรทราบก่อนว่ามีบริการใดบ้างที่กำลังเปิดพอร์ตอยู่ เพราะนั่นคือบริการที่ไฟร์วอลล์จะเข้ามาควบคุม การตรวจสอบว่ามีบริการใดเปิดพอร์ตอยู่บ้าง ด้วย ss -tlnp คือขั้นตอนแรกที่ถูกต้อง
กฎข้อเดียวที่ป้องกันไม่ให้คุณถูกล็อกออกจากระบบ
นี่คือความผิดพลาดที่ทำให้หลายคนกลัวการใช้ไฟร์วอลล์ คุณเปิดใช้งาน UFW ด้วยนโยบายปฏิเสธการเชื่อมต่อทั้งหมด (default-deny) แต่คุณลืมอนุญาต SSH ดังนั้นทันทีที่ไฟร์วอลล์เริ่มทำงาน การเชื่อมต่อของคุณจะถูกตัดและคุณจะไม่สามารถเข้าสู่ระบบได้อีก วิธีป้องกันคือต้องอนุญาต SSH ก่อนเปิดใช้งาน UFW เสมอ นี่คือเคล็ดลับทั้งหมด และขั้นตอนด้านล่างนี้จะแนะนำลำดับการทำงานที่ปลอดภัย
หากเหตุการณ์นี้เกิดขึ้นกับคุณ คุณยังไม่สิ้นหวัง: คอนโซลบนเว็บของผู้ให้บริการของคุณผ่าน VNC หรือ serial ไม่ได้ผ่าน SSH ดังนั้นคุณสามารถล็อกอินผ่านช่องทางนั้นแล้วรัน ufw disable หรือเพิ่มกฎที่ขาดไปได้ อาการล็อกเอาต์จากไฟร์วอลล์มีจุดสังเกตที่ชัดเจน เพราะแพ็กเก็ตที่ถูกดรอปจะทำให้ SSH client ของคุณค้างจนกว่าจะหมดเวลา (timeout) ในขณะที่ SSH daemon ที่หยุดทำงานจะปฏิเสธการเชื่อมต่อทันที ซึ่งนี่คือ ความแตกต่างระหว่าง connection refused และ connection timed out
ขั้นตอนที่ 1: ตั้งค่านโยบายเริ่มต้น
เริ่มต้นด้วยการกำหนดให้ UFW ปฏิเสธการเชื่อมต่อขาเข้าทั้งหมด และอนุญาตการเชื่อมต่อขาออกทั้งหมด:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming คือส่วนสำคัญ ซึ่งหมายความว่าพอร์ตใดก็ตามที่ไม่มี rule อนุญาตโดยชัดแจ้ง จะถูกปิดจากภายนอก แม้ว่าจะมี service กำลัง listening อยู่ก็ตาม allow outgoing อนุญาตให้ server ของคุณเชื่อมต่ออินเทอร์เน็ตได้ตามปกติ เพื่อรับการอัปเดตและดำเนินการอื่นที่เกี่ยวข้อง คำสั่งทั้งสองนี้เปลี่ยนเฉพาะ policy เท่านั้น ระบบจะยังไม่บังคับใช้นโยบายจนกว่าคุณจะ enable UFW ในขั้นตอนที่ 3
ขั้นตอนที่ 2: อนุญาตพอร์ตที่จำเป็นต้องใช้จริง
ก่อนเปิดใช้กฎ ให้เปิด SSH เพื่อไม่ให้การเชื่อมต่อของคุณหลุด:
sudo ufw allow 22/tcpUFW ยังจำกัดอัตราการเชื่อมต่อ SSH ให้คุณได้ด้วย: sudo ufw limit 22/tcp จะอนุญาตพอร์ต แต่บล็อกที่อยู่ใดก็ตามที่สร้างการเชื่อมต่อตั้งแต่หกครั้งขึ้นไปภายในสามสิบวินาที ซึ่งช่วยลดผลกระทบจากสคริปต์โจมตีแบบ brute-force โดยไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติม
หากคุณใช้เว็บเซิร์ฟเวอร์ ให้อนุญาต HTTP และ HTTPS ด้วย:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpอนุญาตเฉพาะบริการที่คุณเปิดให้สาธารณะเข้าถึงเท่านั้น ฐานข้อมูลอย่าง Postgres ที่พอร์ต 5432 แทบไม่ควรมี rule แบบ allow ให้ผูกบริการไว้กับ 127.0.0.1 แทน เพื่อให้เข้าถึงได้เฉพาะบนเครื่องนั้น ทุกพอร์ตที่คุณเปิดจะต้องได้รับการป้องกัน ดังนั้นควรรักษารายการให้สั้น
คุณยังสามารถสร้างชุดคำสั่ง ufw ทั้งหมดสำหรับเซิร์ฟเวอร์ของคุณที่นี่ แล้วเรียกใช้ตามลำดับ:
ขั้นตอนที่ 3: เปิดใช้งานและยืนยันว่าเปิดอยู่
sudo ufw enableระบบจะแจ้งเตือนว่าคำสั่งนี้อาจรบกวนการเชื่อมต่อ SSH ที่มีอยู่ เนื่องจากคุณอนุญาต 22/tcp ในขั้นตอนที่ 2 เซสชันของคุณจึงยังใช้งานต่อได้ ยืนยันผลลัพธ์:
sudo ufw status verboseStatus: active
Default: deny (incoming), allow (outgoing)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp ALLOW IN Anywhereให้ตรวจสอบ 2 รายการที่นี่ Status: active หมายความว่าไฟร์วอลล์กำลังทำงาน และกฎทุกข้อจะแสดง 2 ครั้ง ครั้งหนึ่งเป็นรูปแบบปกติ และอีกครั้งมี (v6) ซึ่งแสดงว่า UFW ครอบคลุมทั้ง IPv6 และ IPv4 หากไม่มีบรรทัด (v6) แสดงว่าส่วน IPv6 ของคุณไม่ได้รับการจัดการ ซึ่งเป็นปัญหาอีกประการหนึ่งที่อธิบายไว้ใน บทความเกี่ยวกับไฟร์วอลล์ IPv6
การจัดการกฎในภายหลัง
หากต้องการดูรายการกฎพร้อมหมายเลขเพื่อที่จะลบกฎบางข้อออก:
sudo ufw status numbered
sudo ufw delete 3หากต้องการอนุญาตพอร์ตเฉพาะจากที่อยู่ IP เดียว ซึ่งเป็นวิธีที่ดีในการเปิดบริการสำหรับผู้ดูแลระบบให้เข้าถึงได้จาก IP ของคุณเท่านั้น:
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcpแนวทางนี้จะใช้ไม่ได้ผลเมื่อที่อยู่ IP ของคุณเปลี่ยนไปหรือมีหลายเครื่องที่ต้องการเข้าถึง วิธีแก้ไขทั่วไปคือการหยุดเปิดพอร์ตสู่สาธารณะโดยสิ้นเชิง แล้วเข้าถึงบริการผ่านเครือข่ายส่วนตัวแทน ซึ่งเป็นสิ่งที่ การประกาศ private subnet ของเซิร์ฟเวอร์ไปยัง tailnet ของคุณ มีไว้เพื่อการนี้
ไฟร์วอลล์เป็นเพียงชั้นหนึ่งเท่านั้น มันควบคุมสิ่งที่สามารถเข้าถึงพอร์ตได้ แต่ไม่ได้ช่วยชะลอผู้ที่พยายามสุ่มเดารหัสผ่านในพอร์ตที่คุณเปิดทิ้งไว้ เช่น SSH สำหรับกรณีนี้ ให้เพิ่ม Fail2ban ไว้หน้า SSH เพื่อแบนผู้ที่พยายามบุกรุกซ้ำๆ การป้องกันเชิงลึก (defence in depth) หมายถึงแต่ละชั้นต้องครอบคลุมสิ่งที่ชั้นอื่นทำไม่ได้
ไฟร์วอลล์จะมีประโยชน์ก็ต่อเมื่อคุณเข้าใจ พอร์ตคืออะไรและบริการต่างๆ เปิดพอร์ตอย่างไร และการกำหนดค่าไฟร์วอลล์เป็นขั้นตอนหนึ่งใน 10 นาทีแรกบน VPS ใหม่
FAQ
การเปิดใช้งาน UFW จะตัดการเชื่อมต่อ SSH ของฉันหรือไม่
ไม่ตัด หากคุณอนุญาต SSH ก่อน ให้เรียกใช้ sudo ufw allow 22/tcp ก่อน sudo ufw enable การเชื่อมต่อจะยังคงอยู่ เพราะไฟร์วอลล์อนุญาต port 22 แล้ว อันตรายเกิดจากการเปิดใช้งานไฟร์วอลล์ที่ปฏิเสธการเชื่อมต่อทั้งหมดเป็นค่าเริ่มต้นโดยไม่มี allow rule สำหรับ SSH ซึ่งจะทำให้คุณถูกตัดการเชื่อมต่อ หากเกิดกรณีนี้ ให้เข้าสู่ระบบผ่าน VNC หรือ serial console ของผู้ให้บริการ แล้วเรียกใช้ ufw disable
ควรเปิด port ใดบน VPS
เปิดเฉพาะ port ที่ให้บริการแก่สาธารณะเท่านั้น เปิด SSH (22/tcp) เพื่อจัดการเครื่อง และเปิด HTTP กับ HTTPS (80/tcp, 443/tcp) หากคุณให้บริการเว็บไซต์ ให้ port อื่นทั้งหมดถูกปฏิเสธ บริการภายใน เช่น ฐานข้อมูล ควร bind กับ 127.0.0.1 และไม่ต้องกำหนด firewall rule ใดๆ เพื่อไม่ให้เข้าถึงได้จาก network
UFW รองรับ IPv6 หรือไม่
รองรับบน Ubuntu รุ่นปัจจุบัน โดย IPV6=yes ถูกตั้งค่าไว้ใน /etc/default/ufw ดังนั้นแต่ละ rule จะมีผลกับทั้งสอง stack และ ufw status จะแสดง rule ของ IPv6 พร้อม suffix (v6) วิธีที่ยังทำให้เกิดปัญหาได้มีอธิบายไว้ใน กับดักของไฟร์วอลล์ IPv6
จะลบ UFW rule ได้อย่างไร
เรียกใช้ sudo ufw status numbered เพื่อแสดงรายการ rule พร้อมหมายเลขลำดับ จากนั้นเรียกใช้ sudo ufw delete N โดย N คือหมายเลขของ rule ที่ต้องการลบ คุณยังสามารถลบโดยระบุข้อกำหนดได้ เช่น sudo ufw delete allow 80/tcp
จะอนุญาตให้ port รับการเชื่อมต่อจาก IP address เดียวได้อย่างไร
ใช้ rule แบบ from แทน allow แบบทั่วไป หากต้องการให้เฉพาะ office address ของคุณเข้าถึง PostgreSQL ให้เรียกใช้ sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp เมื่อใช้นโยบายที่ปฏิเสธการเชื่อมต่อทั้งหมดเป็นค่าเริ่มต้น port จะปิดสำหรับทุกคนจนกว่าจะมี rule เปิดใช้งาน ดังนั้น rule แบบ from นี้จึงเป็นช่องทางเดียวที่อนุญาตให้เข้าถึงได้ โดย network ทั้งหมดจะยังถูกบล็อก และเฉพาะ address ที่คุณระบุเท่านั้นที่จะผ่านได้ อย่าเพิ่ม allow 5432/tcp แบบทั่วไปด้วย เพราะจะเปิด port ให้ทุกคนเข้าถึง วิธีนี้ปลอดภัยที่สุดสำหรับการเปิดเผยฐานข้อมูลหรือ admin panel ตรวจสอบผลด้วย sudo ufw status verbose ซึ่งจะแสดง source address ถัดจาก port