Kiến thức Hữu ích 😍

Lệnh firewall-cmd Linux: Hướng dẫn cài đặt & quản lý hiệu quả


Bạn đã bao giờ tự hỏi làm thế nào để bảo vệ máy chủ Linux của mình khỏi các mối đe dọa trên Internet chưa? Một trong những tuyến phòng thủ đầu tiên và quan trọng nhất chính là tường lửa (firewall). Trong môi trường Linux hiện đại, firewalld là một giải pháp quản lý tường lửa mạnh mẽ, và firewall-cmd chính là công cụ dòng lệnh giúp bạn tương tác và ra lệnh cho nó. Đây là một tiện ích không thể thiếu cho bất kỳ quản trị viên hệ thống nào, cho phép bạn kiểm soát lưu lượng mạng ra vào máy chủ một cách linh hoạt và chính xác.

Tầm quan trọng của việc quản lý firewall bằng firewall-cmd nằm ở khả năng kiểm soát chi tiết mà không cần phải hiểu sâu về cú pháp phức tạp của iptables. Thay vào đó, bạn có thể sử dụng các lệnh đơn giản, dễ nhớ để mở hoặc đóng các cổng, cho phép hoặc chặn các dịch vụ và địa chỉ IP cụ thể. Trong bài viết này, AZWEB sẽ cùng bạn đi từ những bước cơ bản nhất như cài đặt, cấu hình cho đến việc sử dụng các lệnh firewall-cmd để quản lý tường lửa một cách chuyên nghiệp, giúp bạn tự tin bảo vệ hệ thống của mình.

Hình minh họa

Cài đặt và cấu hình firewalld trên hệ điều hành Linux

Để bắt đầu sử dụng firewall-cmd, trước tiên bạn cần đảm bảo rằng dịch vụ firewalld đã được cài đặt và hoạt động trên hệ thống của mình. Đây là dịch vụ nền tảng mà firewall-cmd sử dụng để áp dụng các quy tắc tường lửa.

Hướng dẫn cài đặt firewalld

Quá trình cài đặt firewalld khá đơn giản và có thể khác nhau đôi chút tùy thuộc vào bản phân phối Linux bạn đang sử dụng. Hầu hết các hệ điều hành dựa trên Red Hat như CentOS, Fedora hay AlmaLinux đều cài đặt sẵn firewalld. Tuy nhiên, nếu bạn dùng một hệ thống khác hoặc firewalld chưa được cài đặt, bạn có thể làm theo các bước sau.

Đối với các hệ điều hành dựa trên Red Hat (CentOS, RHEL): Bạn có thể sử dụng trình quản lý gói yum hoặc dnf để cài đặt.

sudo yum install firewalld

Hoặc với các phiên bản mới hơn:

sudo dnf install firewalld

Đối với các hệ điều hành dựa trên Debian (Ubuntu): firewalld không phải là tường lửa mặc định (UFW thường được sử dụng), nhưng bạn hoàn toàn có thể cài đặt nó bằng trình quản lý gói apt.

sudo apt update
sudo apt install firewalld

Sau khi cài đặt xong, bạn nên kiểm tra trạng thái của dịch vụ để chắc chắn rằng nó đã được cài đặt thành công. Sử dụng lệnh sau:

sudo systemctl status firewalld

Nếu dịch vụ đang chạy, bạn sẽ thấy trạng thái là “active (running)”. Nếu không, bạn cần khởi động nó ở bước tiếp theo.

Hình minh họa

Thiết lập cấu hình ban đầu cho firewalld

Sau khi cài đặt, bạn cần khởi động dịch vụ và kích hoạt nó để tự động chạy mỗi khi hệ thống khởi động. Điều này đảm bảo rằng các quy tắc tường lửa của bạn luôn được áp dụng, bảo vệ máy chủ liên tục.

Sử dụng các lệnh systemctl sau:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Lệnh start sẽ khởi chạy dịch vụ ngay lập tức, còn lệnh enable sẽ tạo một liên kết để dịch vụ tự khởi động cùng hệ thống.

Một trong những khái niệm cốt lõi của firewalld là “vùng” (zone). Một vùng là một tập hợp các quy tắc được xác định trước, quyết định mức độ tin cậy của các kết nối mạng. Mỗi giao diện mạng (network interface) trên máy chủ của bạn sẽ được gán cho một vùng cụ thể. Vùng mặc định thường là public, được thiết kế cho các mạng công cộng không đáng tin cậy. Một số vùng phổ biến khác bao gồm internal (cho mạng nội bộ tin cậy), dmz (cho các máy chủ cần truy cập từ bên ngoài nhưng được cách ly) và trusted (cho phép tất cả các kết nối). Hiểu rõ về vùng sẽ giúp bạn áp dụng các quy tắc bảo mật một cách hợp lý và hiệu quả.

Hình minh họa

Các lệnh cơ bản với firewall-cmd để quản lý firewall

Khi firewalld đã hoạt động, bạn có thể bắt đầu sử dụng firewall-cmd để quản lý các quy tắc. Các lệnh cơ bản xoay quanh việc thêm, xóa và kiểm tra các quy tắc để kiểm soát lưu lượng truy cập vào máy chủ của bạn.

Thêm quy tắc firewall

Một trong những tác vụ phổ biến nhất là mở một cổng hoặc cho phép một dịch vụ cụ thể đi qua tường lửa. Ví dụ, nếu bạn chạy một máy chủ web, bạn cần mở cổng 80 (HTTP) và 443 (HTTPS).

Bạn có thể thêm quy tắc theo dịch vụ (dễ nhớ hơn) hoặc theo số cổng.

Cách 1: Cho phép một dịch vụ
firewalld có một danh sách các dịch vụ được định nghĩa sẵn. Để cho phép dịch vụ HTTP, bạn dùng lệnh:

sudo firewall-cmd --zone=public --add-service=http --permanent

Lệnh này có nghĩa là: trong vùng public, hãy thêm dịch vụ http. Cờ --permanent rất quan trọng, nó đảm bảo quy tắc này sẽ được lưu lại và áp dụng lại sau khi khởi động lại máy chủ. Nếu không có cờ này, quy tắc sẽ chỉ có hiệu lực cho phiên làm việc hiện tại.

Cách 2: Mở một cổng cụ thể
Nếu dịch vụ của bạn chạy trên một cổng không phổ biến, bạn có thể mở cổng đó trực tiếp. Ví dụ, để mở cổng 3000 cho giao thức TCP:

sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent

Sau khi thêm bất kỳ quy tắc --permanent nào, bạn cần tải lại cấu hình tường lửa để áp dụng thay đổi:

sudo firewall-cmd --reload

Lệnh reload sẽ áp dụng các thay đổi vĩnh viễn mà không làm mất các kết nối hiện tại, đây là cách an toàn để cập nhật tường lửa.

Hình minh họa

Xóa quy tắc firewall

Khi một dịch vụ không còn cần thiết hoặc bạn muốn thắt chặt an ninh, việc xóa các quy tắc đã thêm là rất quan trọng. Cú pháp để xóa quy tắc tương tự như khi thêm, chỉ cần thay add bằng remove.

Ví dụ, để xóa quy tắc cho phép dịch vụ HTTP đã thêm trước đó:

sudo firewall-cmd --zone=public --remove-service=http --permanent

Tương tự, để đóng lại cổng 3000/tcp:

sudo firewall-cmd --zone=public --remove-port=3000/tcp --permanent

Giống như khi thêm, sau khi xóa một quy tắc vĩnh viễn, bạn cũng phải chạy lệnh reload để các thay đổi có hiệu lực:

sudo firewall-cmd --reload

Việc thường xuyên rà soát và loại bỏ các quy tắc không cần thiết giúp giảm thiểu bề mặt tấn công và giữ cho cấu hình tường lửa của bạn luôn gọn gàng, dễ quản lý.

Kiểm tra trạng thái và cấu hình hiện tại của firewall

Làm thế nào để biết tường lửa đang hoạt động và những quy tắc nào đang được áp dụng? firewall-cmd cung cấp nhiều lệnh hữu ích để bạn kiểm tra trạng thái và cấu hình hiện tại.

Đầu tiên, để kiểm tra xem dịch vụ firewalld có đang chạy hay không, bạn có thể dùng lệnh:

sudo firewall-cmd --state

Kết quả sẽ là “running” nếu dịch vụ đang hoạt động.

Để xem tất cả các cấu hình của vùng mặc định (thường là public), bao gồm các giao diện, dịch vụ và cổng được phép, hãy sử dụng lệnh:

sudo firewall-cmd --list-all

Lệnh này sẽ cung cấp một cái nhìn tổng quan rất chi tiết, ví dụ:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client http ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Nếu bạn muốn xem cấu hình của một vùng cụ thể khác, chỉ cần thêm tùy chọn --zone=<tên-vùng>. Ví dụ: sudo firewall-cmd --zone=internal --list-all. Việc thường xuyên kiểm tra cấu hình giúp bạn đảm bảo rằng các quy tắc mong muốn đang được áp dụng đúng cách và không có lỗ hổng bảo mật nào ngoài ý muốn.

Hình minh họa

Ví dụ thực tiễn sử dụng firewall-cmd trong quản lý firewall trên Linux

Lý thuyết là vậy, nhưng làm thế nào để áp dụng firewall-cmd vào các tình huống thực tế? Hãy cùng AZWEB xem qua một vài ví dụ phổ biến mà bất kỳ quản trị viên hệ thống nào cũng sẽ gặp phải.

Mở cổng HTTP và SSH

Đây là hai dịch vụ cơ bản nhất cần được cho phép trên hầu hết các máy chủ web. SSH (cổng 22) dùng để quản trị từ xa, và HTTP/HTTPS (cổng 80/443) dùng để phục vụ trang web. Việc mở các cổng này rất đơn giản với firewall-cmd.

Bước 1: Cho phép dịch vụ SSH
Mặc dù SSH thường được cho phép mặc định trong vùng public, bạn nên kiểm tra và chắc chắn rằng quy tắc này tồn tại. Nếu chưa có, hãy thêm nó:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

Điều này cực kỳ quan trọng, đặc biệt là khi bạn đang cấu hình từ xa, để tránh tự khóa mình ra khỏi máy chủ.

Bước 2: Cho phép dịch vụ HTTP và HTTPS
Tiếp theo, để máy chủ có thể phục vụ web, bạn cần cho phép lưu lượng truy cập web:

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

Bước 3: Tải lại cấu hình
Cuối cùng, đừng quên áp dụng các thay đổi vĩnh viễn vừa tạo:

sudo firewall-cmd --reload

Bây giờ, máy chủ của bạn đã sẵn sàng để nhận kết nối SSH và phục vụ các trang web qua HTTP/HTTPS.

Hình minh họa

Thiết lập quy tắc chặn IP hoặc giới hạn truy cập

Đôi khi, bạn sẽ cần các quy tắc nâng cao hơn, chẳng hạn như chặn một địa chỉ IP cụ thể đang cố gắng tấn công hệ thống của bạn. firewalld hỗ trợ một tính năng mạnh mẽ gọi là “rich rules” (quy tắc phức tạp) để xử lý các tình huống này.

Giả sử bạn phát hiện địa chỉ IP 192.168.100.50 đang có hành vi đáng ngờ và muốn chặn hoàn toàn truy cập từ IP này. Bạn có thể sử dụng rich rule sau:

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.50" reject' --permanent

Hãy phân tích lệnh này:
rule family="ipv4": Chỉ định rằng quy tắc này áp dụng cho địa chỉ IPv4.
source address="192.168.100.50": Xác định địa chỉ IP nguồn cần chặn.
reject: Hành động sẽ thực hiện. reject sẽ chặn kết nối và gửi lại một thông báo lỗi, trong khi drop sẽ âm thầm hủy bỏ gói tin mà không phản hồi.

Sau khi thêm quy tắc, hãy tải lại tường lửa:

sudo firewall-cmd --reload

Để xóa quy tắc này, bạn chỉ cần thay --add-rich-rule bằng --remove-rich-rule với nội dung quy tắc y hệt. Rich rules mang lại khả năng kiểm soát rất chi tiết, cho phép bạn tạo ra các chính sách bảo mật phức tạp và linh hoạt cho hệ thống của mình.

Hình minh họa

Những vấn đề thường gặp và cách xử lý

Ngay cả với một công cụ thân thiện như firewall-cmd, bạn vẫn có thể gặp phải một số vấn đề trong quá trình sử dụng. Dưới đây là những sự cố phổ biến nhất và cách khắc phục chúng.

Lệnh firewall-cmd không phản hồi hoặc báo lỗi

Khi bạn chạy một lệnh firewall-cmd và nó không hoạt động hoặc trả về lỗi như “command not found” hay “FirewallD is not running”, có một vài nguyên nhân chính bạn cần kiểm tra.

1. Dịch vụ firewalld chưa được cài đặt hoặc không chạy:
Đây là nguyên nhân phổ biến nhất. Hãy chắc chắn rằng firewalld đã được cài đặt trên hệ thống của bạn. Sau đó, kiểm tra trạng thái của dịch vụ:

sudo systemctl status firewalld

Nếu dịch vụ không hoạt động (inactive), bạn cần khởi động nó:

sudo systemctl start firewalld

Nếu bạn muốn nó tự khởi động cùng hệ thống, hãy chạy thêm:

sudo systemctl enable firewalld

2. Gõ sai lệnh:
Dòng lệnh rất nhạy cảm với lỗi chính tả. Hãy kiểm tra kỹ xem bạn đã gõ đúng tên lệnh (firewall-cmd), các tùy chọn (--add-service, --zone) và giá trị hay chưa. Một lỗi nhỏ như gõ firewall-command thay vì firewall-cmd cũng sẽ gây ra lỗi.

3. Không có quyền sudo:
Các lệnh thay đổi cấu hình tường lửa đòi hỏi quyền quản trị. Nếu bạn quên thêm sudo ở đầu lệnh, bạn sẽ nhận được thông báo lỗi “permission denied”. Luôn đảm bảo bạn đang chạy lệnh với quyền root.

Quy tắc firewall không áp dụng hoặc bị ghi đè sau khởi động lại

Một vấn đề gây khó chịu khác là khi bạn đã thêm một quy tắc, kiểm tra thấy nó hoạt động, nhưng sau khi khởi động lại máy chủ thì quy tắc đó biến mất.

Nguyên nhân của vấn đề này gần như luôn luôn là do bạn đã quên thêm cờ --permanent khi tạo quy tắc.

Khi bạn chạy một lệnh như sudo firewall-cmd --add-service=http, quy tắc này chỉ được thêm vào cấu hình đang chạy (runtime configuration) và sẽ mất khi firewalld được khởi động lại. Đây là một tính năng hữu ích để thử nghiệm các quy tắc một cách an toàn mà không làm ảnh hưởng lâu dài đến hệ thống.

Để một quy tắc tồn tại vĩnh viễn, bạn phải luôn thêm tùy chọn --permanent:

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

Tuy nhiên, việc thêm quy tắc vĩnh viễn không tự động áp dụng nó vào cấu hình đang chạy. Sau khi chạy lệnh với --permanent, bạn phải tải lại firewalld để đồng bộ hóa cấu hình vĩnh viễn với cấu hình đang chạy:

sudo firewall-cmd --reload

Ghi nhớ quy trình hai bước này: 1. Thêm quy tắc với --permanent. 2. Chạy firewall-cmd --reload. Đây là chìa khóa để đảm bảo các quy tắc của bạn được áp dụng một cách nhất quán và bền vững.

Hình minh họa

Lời khuyên và best practices khi sử dụng firewall-cmd

Việc sử dụng thành thạo firewall-cmd không chỉ dừng lại ở việc biết các lệnh. Áp dụng các phương pháp tốt nhất (best practices) sẽ giúp bạn quản lý tường lửa một cách an toàn, hiệu quả và tránh được những sai lầm đáng tiếc.

  • Luôn sao lưu cấu hình trước khi thay đổi: Trước khi thực hiện những thay đổi lớn, hãy sao lưu thư mục cấu hình của firewalld, thường nằm ở /etc/firewalld/. Một lệnh tar đơn giản có thể giúp bạn tạo một bản sao lưu nhanh chóng, cho phép bạn khôi phục lại trạng thái cũ nếu có sự cố xảy ra.
  • Sử dụng --permanent để quy tắc tồn tại vĩnh viễn: Như đã đề cập, đây là một trong những điểm quan trọng nhất. Hãy tạo thói quen sử dụng cờ --permanent cho mọi quy tắc mà bạn muốn duy trì lâu dài, và luôn nhớ chạy firewall-cmd --reload sau đó để áp dụng chúng.
  • Kiểm tra kỹ cổng/mạng trước khi mở hoặc chặn: Một sai lầm nhỏ trong việc chỉ định số cổng hoặc địa chỉ IP có thể tạo ra lỗ hổng bảo mật hoặc làm gián đoạn dịch vụ. Trước khi áp dụng quy tắc, hãy kiểm tra lại để chắc chắn rằng bạn đang mở đúng cổng cho đúng dịch vụ và chặn đúng địa chỉ IP không mong muốn.
  • Tránh vô tình khóa mất quyền truy cập SSH khi cấu hình từ xa: Đây là cơn ác mộng của mọi quản trị viên hệ thống. Khi làm việc trên một máy chủ từ xa, hãy luôn đảm bảo rằng quy tắc cho phép truy cập SSH (thường là cổng 22) đã được thiết lập và hoạt động. Trước khi áp dụng các quy tắc chặn diện rộng (ví dụ: thay đổi vùng mặc định thành drop), hãy thêm quy tắc cho phép SSH vào cấu hình vĩnh viễn và tải lại để chắc chắn bạn vẫn có thể kết nối.
  • Nguyên tắc đặc quyền tối thiểu: Chỉ mở những cổng và dịch vụ thực sự cần thiết. Đừng mở một cổng “để phòng hờ”. Mỗi cổng mở là một cánh cửa tiềm năng cho kẻ tấn công. Thường xuyên rà soát các quy tắc và đóng lại những cổng không còn sử dụng.

Hình minh họa

Kết luận

Qua bài viết này, chúng ta đã cùng nhau khám phá firewall-cmd, một công cụ dòng lệnh mạnh mẽ và linh hoạt để quản lý tường lửa trên Linux. Từ việc cài đặt và cấu hình firewalld ban đầu, tìm hiểu các khái niệm cốt lõi như “vùng”, cho đến việc thực hành các lệnh cơ bản để thêm, xóa và kiểm tra quy tắc, bạn đã có một nền tảng vững chắc để bắt đầu bảo vệ hệ thống của mình. Vai trò của firewall-cmd trong việc đơn giản hóa công tác quản trị firewall là không thể phủ nhận, giúp các quản trị viên hệ thống, dù mới vào nghề hay đã có kinh nghiệm, đều có thể thiết lập các chính sách bảo mật một cách hiệu quả.

AZWEB khuyến khích bạn áp dụng ngay những kiến thức này vào thực tế. Hãy bắt đầu bằng việc kiểm tra cấu hình tường lửa hiện tại trên máy chủ của bạn, rà soát lại các cổng và dịch vụ đang mở, và áp dụng các best practices mà chúng tôi đã chia sẻ. Bảo mật là một quá trình liên tục, và việc làm chủ các công cụ như firewall-cmd là một kỹ năng thiết yếu. Đừng ngần ngại thực hành trên một môi trường thử nghiệm để trở nên tự tin hơn. Tiếp tục tìm hiểu sâu hơn về các tính năng nâng cao như rich rules, IP sets để nâng tầm khả năng bảo mật của bạn. Chúc bạn thành công trên con đường trở thành một chuyên gia quản trị hệ thống Linux là gì.

Đánh giá