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

Home ตั้งค่า Firewall ด้วย firewalld บน AlmaLinux และ Rocky Linux

ตั้งค่า Firewall ด้วย firewalld บน AlmaLinux และ Rocky Linux

firewalld เป็น Firewall มาตรฐานของ AlmaLinux และ Rocky Linux 8-9 ทำงานบน nftables และจัดกฎเป็นกลุ่มเรียกว่า Zone แต่ละ Zone มีรายการ Service และ Port ที่อนุญาต ส่วน Network Interface หรือ IP ต้นทางจะถูกผูกกับ Zone ใด Zone หนึ่ง เซิร์ฟเวอร์ทั่วไปใช้ Zone public เพียง Zone เดียวก็เพียงพอ

จุดที่ต้องเข้าใจก่อนเริ่มคือ firewalld มีค่าสองชุด ได้แก่ Runtime (มีผลทันทีแต่หายเมื่อรีโหลดหรือรีบูต) และ Permanent (บันทึกถาวรแต่ยังไม่มีผลจนกว่าจะรีโหลด) คู่มือนี้ใช้รูปแบบ --permanent ตามด้วย --reload ซึ่งเข้าใจง่ายและไม่ลืมบันทึก สำหรับ Ubuntu ให้ดู ตั้งค่า Firewall ด้วย UFW บน Ubuntu

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

  • AlmaLinux หรือ Rocky Linux 8/9 และสิทธิ์ root หรือ sudo
  • รู้ว่า SSH ใช้ Port อะไร ตรวจได้ด้วย sudo ss -tlnp | grep sshd
  • เปิด SSH Session ค้างไว้ และเตรียม Console Server ผ่าน Web UI เป็นช่องทางสำรอง

ขั้นตอนที่ 1: ติดตั้งและเปิดใช้งาน firewalld

Image บางแบบไม่ได้ติดตั้งหรือไม่ได้เปิด firewalld ไว้ ตรวจสถานะก่อน

sudo systemctl status firewalld

ถ้าไม่พบ Service ให้ติดตั้ง

sudo dnf install -y firewalld

ก่อนเปิดใช้งานครั้งแรก ให้ตรวจว่า Zone เริ่มต้นอนุญาต SSH อยู่แล้ว โดยใช้ firewall-offline-cmd ซึ่งทำงานได้แม้ firewalld ยังไม่รัน

sudo firewall-offline-cmd --get-default-zone
sudo firewall-offline-cmd --zone=public --list-services

ผลลัพธ์ปกติของ Zone public คือ cockpit dhcpv6-client ssh ถ้าไม่มี ssh ให้เพิ่มก่อนด้วย sudo firewall-offline-cmd --zone=public --add-service=ssh จากนั้นเปิด firewalld และตั้งให้ทำงานเมื่อบูต

sudo systemctl enable --now firewalld
sudo firewall-cmd --state

ผลลัพธ์ต้องเป็น running

ขั้นตอนที่ 2: ดูการตั้งค่าปัจจุบัน

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all

--get-active-zones บอกว่า Interface ใดอยู่ใน Zone ใด ส่วน --list-all แสดงรายละเอียดของ Zone เริ่มต้น ตัวอย่าง

public (active)
  target: default
  interfaces: eth0
  services: cockpit dhcpv6-client ssh
  ports:
  rich rules:

ขั้นตอนที่ 3: เปิด Service และ Port

เปิดเว็บ HTTP และ HTTPS ด้วยชื่อ Service ที่ firewalld รู้จัก

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

ดูรายชื่อ Service ทั้งหมดที่มีได้ด้วย sudo firewall-cmd --get-services ถ้าบริการของคุณไม่มีในรายการ ให้เปิดเป็นเลข Port แทน

sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=10000-10100/udp

ค่าที่ใส่ --permanent ยังไม่มีผลจนกว่าจะรีโหลด

sudo firewall-cmd --reload

ได้ผลลัพธ์ success การรีโหลดไม่ตัด SSH Session ที่เชื่อมต่ออยู่

ขั้นตอนที่ 4: อนุญาตเฉพาะ IP ต้นทางด้วย Rich Rule

บริการอย่างฐานข้อมูลไม่ควรเปิดให้ทั้งอินเทอร์เน็ต ตัวอย่างนี้อนุญาต MySQL (3306) เฉพาะจาก IP 203.0.113.20

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.20/32" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload

ถ้าต้องการให้ SSH เข้าได้เฉพาะ IP สำนักงาน ให้เพิ่ม Rich Rule สำหรับ SSH ก่อน รีโหลด และทดสอบเข้าด้วยหน้าต่างใหม่ให้ได้ แล้วจึงถอด Service ssh ออกจาก Zone

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25/32" service name="ssh" accept'
sudo firewall-cmd --reload
# ทดสอบ SSH จากหน้าต่างใหม่ให้ผ่านก่อน แล้วจึงรัน
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
sudo firewall-cmd --reload

บล็อก IP ที่ไม่ต้องการ

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.0.2.50" drop'
sudo firewall-cmd --reload

ขั้นตอนที่ 5: ปิด Service ที่ไม่ใช้

Zone public เปิด cockpit (Port 9090) ไว้ตั้งแต่ต้น ถ้าไม่ได้ใช้ Cockpit ควรปิด

sudo firewall-cmd --permanent --remove-service=cockpit
sudo firewall-cmd --reload

ลบ Port หรือ Rich Rule ใช้รูปแบบเดียวกับตอนเพิ่ม เพียงเปลี่ยน --add- เป็น --remove- เช่น --remove-port=8080/tcp

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

sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules

ตรวจว่า services, ports และ rich rules ตรงกับที่ต้องการ จากนั้นทดสอบจากภายนอก เช่น เปิดเว็บไซต์ในเบราว์เซอร์ และ SSH จากหน้าต่างใหม่ ถ้าต้องการทดสอบว่า Port ใดเปิดจากเครื่องอื่นที่เป็น Linux ใช้ nc -vz 203.0.113.10 443

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

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

เพิ่มกฎแล้วหายหลังรีบูต

เพิ่มกฎโดยไม่ใส่ --permanent กฎจึงอยู่แค่ใน Runtime หากทดสอบใน Runtime จนพอใจแล้ว สามารถบันทึกทั้งหมดเป็นถาวรได้ด้วย sudo firewall-cmd --runtime-to-permanent

เพิ่มกฎแบบ Permanent แล้วยังไม่มีผล

ยังไม่ได้รัน sudo firewall-cmd --reload ใช้ sudo firewall-cmd --list-all --permanent เทียบกับ sudo firewall-cmd --list-all จะเห็นความต่างระหว่างค่าถาวรกับค่าที่ใช้อยู่

เปิด Port แล้วแต่บริการยังเข้าไม่ได้

ตรวจว่าโปรแกรมฟังที่ IP ภายนอกจริง ไม่ใช่เฉพาะ 127.0.0.1 ด้วย sudo ss -tlnp ตรวจว่ากฎอยู่ใน Zone ที่ Interface ใช้งานจริง (ดูจาก --get-active-zones) และหากเป็น Port ที่ไม่ใช่มาตรฐานของบริการนั้น SELinux อาจบล็อกอยู่ ดู Log ด้วย sudo ausearch -m avc -ts recent

ล็อกตัวเองออกจาก SSH

เข้าผ่าน Console แล้วรัน sudo firewall-cmd --add-service=ssh เพื่อเปิดชั่วคราวใน Runtime จากนั้นแก้กฎ Permanent ให้ถูกต้องก่อนรีโหลด

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

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

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