Security

Cài đặt và cấu hình Firewalld trên AlmaLinux 9 cho VPS

Khi nhận một VPS Linux mới với AlmaLinux 9, việc đầu tiên bạn cần làm là bảo vệ nó. Không giống như Ubuntu dùng UFW, AlmaLinux và các hệ thống RHEL-based sử dụng firewalld làm tường lửa mặc định. Nó vừa mạnh mẽ lại vừa linh hoạt nhờ backend nftables. Bài này sẽ hướng dẫn bạn từ đầu đến cuối cách cài đặt và cấu hình firewalld, đảm bảo VPS của bạn an toàn ngay từ phút đầu tiên.

  • Firewalld mặc định đã được cài sẵn trên AlmaLinux 9 nhưng chưa được kích hoạt.
  • Cách đơn giản nhất để quản lý là dùng lệnh firewall-cmd.
  • Bạn có thể mở port, tạo zone riêng hoặc chặn IP theo nhu cầu.
  • Luôn nhớ kiểm tra trạng thái và reload để áp dụng thay đổi lâu dài.

Yêu cầu trước khi bắt đầu

  • Một VPS đã cài AlmaLinux 9 (bản full OS, có hỗ trợ từ nhà cung cấp như thueVPS).
  • Bạn có quyền root hoặc user sudo.
  • Kết nối SSH vào VPS để thao tác.

Vì sao nên dùng Firewalld trên AlmaLinux?

Firewalld không chỉ là tường lửa thông thường. Nó hoạt động theo zone, cho phép bạn áp dụng các bộ quy tắc khác nhau cho từng giao diện mạng. Ví dụ: giao diện public chỉ mở port 80 và 443, trong khi giao diện internal có thể mở rộng hơn. Điều này rất hữu ích khi bạn quản lý VPS chạy nhiều dịch vụ. Hơn nữa, firewalld trên AlmaLinux 9 sử dụng nftables backend, hiện đại và hiệu suất cao hơn iptables cũ.

Bước 1 - Kiểm tra và kích hoạt Firewalld

Trước hết, kiểm tra xem firewalld đã được cài đặt chưa:

sudo systemctl status firewalld

Nếu chưa có, cài đặt ngay:

sudo dnf install firewalld -y

Kích hoạt và khởi động firewalld:

sudo systemctl enable --now firewalld

Verify: Chạy sudo firewall-cmd --state, output phải là running.

Bước 2 - Các lệnh cơ bản với Firewalld

Hầu hết thao tác đều qua lệnh firewall-cmd. Dưới đây là các lệnh bạn sẽ dùng thường xuyên:

  • Xem zone mặc định: sudo firewall-cmd --get-default-zone, kết quả thường là public.
  • Liệt kê tất cả zone: sudo firewall-cmd --get-zones.
  • Xem chi tiết zone đang dùng: sudo firewall-cmd --list-all.
  • Xem tất cả quy tắc: sudo firewall-cmd --list-all-zones.

Bước 3 - Mở port cho các dịch vụ phổ biến

VPS cần mở port để các dịch vụ như SSH, web, database… hoạt động. Có hai cách: theo service name hoặc theo port+protocol. Cách theo service name gọn hơn và tự động hiểu protocol.

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

Nếu dịch vụ không có trong danh sách mặc định, bạn phải mở bằng port cụ thể. Ví dụ mở port 3306 cho MySQL/MariaDB (chỉ nên giới hạn cho IP nội bộ, xem bước 5):

sudo firewall-cmd --permanent --add-port=3306/tcp

Sau khi thêm xong, reload để áp dụng:

sudo firewall-cmd --reload

Verify: sudo firewall-cmd --list-services hoặc sudo firewall-cmd --list-ports.

Bước 4 - Tạo và quản lý zone riêng

Giả sử bạn có 2 giao diện mạng: eth0 (public) và eth1 (internal). Bạn muốn giao diện internal được phép truy cập nhiều dịch vụ hơn. Tạo một zone mới tên internal và gán nó cho giao diện eth1:

sudo firewall-cmd --permanent --new-zone=internal
sudo firewall-cmd --permanent --zone=internal --add-source=192.168.1.0/24
sudo firewall-cmd --permanent --zone=internal --add-service=mysql
sudo firewall-cmd --reload

Giải thích: Lệnh trên tạo zone internal, cho phép dải IP 192.168.1.0/24 nằm trong zone này và dịch vụ mysql được phép truy cập từ dải IP đó. Đây là cách bảo mật tốt hơn là mở MySQL ra toàn internet.

Bước 5 - Chặn IP bằng Rich-Rules

Khi phát hiện IP lạ quét SSH hoặc tấn công, bạn có thể chặn ngay lập tức bằng rich-rule:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" reject'
sudo firewall-cmd --reload

Để chặn toàn bộ một dải IP:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" drop'
sudo firewall-cmd --reload

Verify: sudo firewall-cmd --list-rich-rules.

Bước 6 - Xử lý lỗi thường gặp

  • Lỗi không reload được: Kiểm tra log với journalctl -u firewalld -n 20. Thường do sai cú pháp rich-rule hoặc conflict với các tường lửa khác (như iptables service).
  • Dịch vụ không hoạt động sau khi mở port: Kiểm tra sudo firewall-cmd --list-all xem port đã xuất hiện chưa. Nếu chưa, bạn có thể đã quên thêm flag --permanent hoặc chưa reload.
  • Firewalld không start: Xung đột với iptables-services. Hãy disable iptables: sudo systemctl mask iptables.

Câu hỏi thường gặp

Làm sao để xóa một port đã mở?

Dùng lệnh sudo firewall-cmd --permanent --remove-port=3306/tcp hoặc --remove-service=mysql. Sau đó reload.

Firewalld và iptables khác nhau thế nào?

Firewalld là công cụ quản lý tường lửa cấp cao, tự động động và hỗ trợ zone. Nó dùng nftables backend thay vì iptables. Nên dùng firewalld trên AlmaLinux thay vì iptables thủ công.

Có nên tắt firewalld không?

rất cao không. Nếu bạn có một tường lửa khác (ví dụ của nhà cung cấp VPS hoặc bên thứ ba), bạn có thể disable firewalld, nhưng thường thì firewalld là đủ. Chỉ tắt khi bạn thực sự hiểu rủi ro.

Zone mặc định có thay đổi được không?

Có. Dùng sudo firewall-cmd --set-default-zone=internal. Lưu ý thêm --permanent nếu muốn áp dụng lâu dài.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.