Trước khi tìm hiểu về Firewalld, tôi chưa từng dùng nó và thậm chí cảm thấy lạ lẫm với khái niệm tường lửa trong hệ thống mạng. Tuy nhiên, sau những ngày nỗ lực tìm hiểu và làm việc với Firewalld, tôi đã có được một trải nghiệm thực tế đáng giá. Bài blog này sẽ là nơi tôi chia sẻ những kiến thức, kinh nghiệm và giải pháp mà tôi đã tích lũy trong quá trình làm việc với Firewalld. Hy vọng nó sẽ giúp bạn tận dụng công cụ này một cách hiệu quả và tăng cường bảo mật mạng của bạn.


1. Firewalld là gì ?

Trước khi khám phá Firewalld, tôi đã có kinh nghiệm làm việc với iptables, một công cụ tường lửa mạng phổ biến trên hệ điều hành Linux. Vậy Firewalld là gì và mối quan hệ giữa Firewalld và iptables như thế nào? Chúng ta hãy cùng tìm hiểu.

Firewalld, cũng như tên gọi của nó, kết hợp từ "fire" nghĩa là lửa và "wall" có nghĩa là tường, tạo nên thuật ngữ "Firewall" - Tường lửa.

Còn trong thuật ngữ IT nó được định nghĩa như sau: Firewalld là một công cụ quản lý tường lửa mạng mạnh mẽ và linh hoạt dành cho hệ điều hành Linux. Được phát triển nhằm cung cấp giải pháp bảo mật mạng hiệu quả, Firewalld giúp người dùng kiểm soát và quản lý quyền truy cập vào hệ thống từ các thiết bị mạng khác nhau.

Có lẽ nhiều bạn sẽ nhận xét rằng định nghĩa trên rất là khô khan, khó nuốt cũng như khó để hình dung được nó là gì vì nó toàn là những chữ cái không hình.

Vậy sau khi xem hình vẽ ở trên, bạn có nhận được cái nhìn tổng quan hơn về Firewalld chưa? Đối với bản thân tôi, tôi xem Firewalld như một giao diện người dùng (Frontend) và Iptables là hệ thống phía sau (Backend). Firewalld đóng vai trò là một giao diện giúp người dùng tương tác và quản lý dữ liệu được lưu trữ trong Iptables.

Cùng mình tìm hiểu một số lợi ích của việc sử dụng Firewalld nhé.

  • Bảo vệ mạng và dữ liệu: Firewalld giúp ngăn chặn các truy cập không mong muốn vào máy chủ, bảo vệ mạng và dữ liệu của bạn khỏi các cuộc tấn công mạng.
  • Quản lý truy cập mạng: Bạn có thể dễ dàng quản lý các quy tắc truy cập mạng thông qua Firewalld để chỉ định các dịch vụ hoặc ứng dụng nào được phép hoạt động qua mạng và dịch vụ nào bị chặn.
  • Kiểm soát cổng kết nối: Firewalld cho phép bạn quản lý cổng kết nối (port) mà máy chủ sử dụng để truy cập các dịch vụ khác nhau. Bạn có thể mở hoặc đóng cổng cụ thể tùy theo nhu cầu.
  • Dễ dàng cấu hình: Firewalld có giao diện dòng lệnh và giao diện đồ họa (firewall-config trên GNOME hoặc firewall-cmd) giúp bạn dễ dàng cấu hình và quản lý tường lửa của hệ thống.

Để tóm lại về định nghĩa của Firewalld, nó là một công cụ quản lý tường lửa mạng trên hệ điều hành Linux. Firewalld cho phép người dùng kiểm soát và quản lý quyền truy cập vào hệ thống từ các thiết bị mạng khác nhau, bằng cách sử dụng mô hình quản lý zone và luật lọc dựa trên khu vực mạng.

Bây giờ, chúng ta sẽ tiếp tục với cách cài đặt và cấu hình Firewalld.

2. Cài đặt và cấu hình Firewalld trên Linux

2.1 Cài đặt

Để cài đặt và sử dụng Firewalld trên một hệ thống Linux, bạn có thể tham khảo một số câu lệnh dưới đây nhé.

Trước tiên, hãy kiểm tra xem Firewalld đã được cài đặt và hoạt động trên hệ thống của bạn chưa. Bạn có thể sử dụng lệnh sau:

sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2023-09-11 17:20:25 JST; 2 days ago
     Docs: man:firewalld(1)
 Main PID: 22646 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─22646 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Trên đây là một ví dụ thực tế trên máy tính của tôi sau khi đã cài đặt và đang sử dụng Firewalld. Nếu Firewalld chưa được cài đặt, bạn sẽ nhận được thông báo rằng dịch vụ này không tồn tại.

Nếu Firewalld chưa được cài đặt, bạn có thể cài đặt nó bằng lệnh sau:

Trên các hệ thống sử dụng hệ thống quản lý gói yum (CentOS, Red Hat):

sudo yum install firewalld

Trên các hệ thống sử dụng apt (Ubuntu, Debian):

sudo apt-get install firewalld

Bật Firewalld và đặt nó để chạy khi khởi động hệ thống

sudo systemctl enable firewalld
sudo systemctl start firewalld

2.2 Cấu hình và sử dụng Firewalld

Trước khi đi đến phần tìm hiểu các lệnh cấu hình cũng như sử dụng Firewalld cùng mình xem qua một chút về các thành thành của Firewalld nhé.

  • Zones (Vùng): Xác định các vùng mạng với cấu hình tường lửa riêng biệt.
  • Services (Dịch vụ): Định rõ các dịch vụ mà máy chủ cung cấp hoặc sử dụng.
  • Ports (Cổng): Quy định các cổng kết nối mạng mà máy chủ sẽ chấp nhận.
  • Source Addresses (Địa chỉ Nguồn): Xác định địa chỉ IP nguồn cho phép hoặc từ chối kết nối.
  • Rules (Quy tắc): Đặt ra các quy tắc chi tiết để xác định cách xử lý kết nối dựa trên các yếu tố như dịch vụ, cổng và địa chỉ nguồn.

Tất cả chúng tạo ra một hệ thống tường lửa mạng mà bạn có thể tùy chỉnh để kiểm soát cách máy chủ tương tác với mạng, bảo vệ máy chủ khỏi các mối đe dọa mạng.

Cùng đến với các câu lệnh để tìm hiểu cơ bản về cấu hình của Firewalld nhé.

Để xem danh sách các zone (vùng) có sẵn

sudo firewall-cmd --get-zones

Để xem zone hiện tại của máy chủ:

sudo firewall-cmd --get-default-zone

Để cấu hình các quy tắc cho một zone cụ thể (ví dụ: public):

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

Để áp dụng các thay đổi:

sudo firewall-cmd --reload

Để kiểm tra các quy tắc đã được cấu hình cho zone:

sudo firewall-cmd --list-all

Sau hai phần giới thiệu và hướng dẫn cài đặt cấu hình Firewalld, bạn đã có một cái nhìn cơ bản về Firewalld và cách hoạt động của nó. Giờ chúng ta sẽ chuyển sang phần quan trọng nhất của bài viết, đó là việc giải quyết một bài toán thực tế mà tôi đã gặp trong hệ thống.

3. Bài toán thực tế gặp phải

Sau khi đã tìm hiểu về khái niệm cũng như các câu lệnh để thao tác với firewalld cũng như iptables thì tôi bắt đầu vào bài toán thực tế như sau.

Trên đây là kiến trúc hệ thống bài toán thực tế mình gặp phải.

Mô tả qua một chút thì chúng ta có thể thấy mô hình trên có 1 VPC (Virtual Private Cloud). Ở server đảm nhận nhiệm vụ LB (Load Balances) chúng ta có 2 đường mạng là eth0 (dùng cho global access) và eth1 (private access).

Vậy câu hỏi đặt ra là làm thế nào để chúng ta có thể tạo ra những quy tắc nhất định được áp dụng cho mỗi đường mạng nhất định. Ở đây cụ thể là đường mạng eth0 và đường mạng eth1. Đó chính là lý do chúng ta tìm hiểu để làm việc với firewalld.

Nhìn vào kiến trúc ở trên chắc hẳn chúng ta cũng có được cách tiếp cận bài toán rồi nhỉ? Vậy chúng ta cùng đi đến cách tiếp cận bài toán của mình nhé.

Ở đây mình sử dụng firewalld-cmd để active 2 Zone cho 2 lớp mạng là eth0 và eth1.

Sau đó mình sử dụng firewalld-cmd để cấu hình rich-rule cho từng zone khác nhau.

Câu lệnh để thao tác cũng khá đơn giản để active 2 Zone.

sudo firewall-cmd --permanent --zone=internal --change-interface=eth1
sudo firewall-cmd --permanent --zone=external --change-interface=eth0

Cùng kiểm tra trạng thái sau khi active 2 Zone nào.

[root@lb-server ~]$ sudo firewall-cmd --get-active-zones
internal
  interfaces: eth1
external
  interfaces: eth0

Bước đầu vậy là đã active được 2 Zone như yêu cầu bài toán đặt ra. Tiếp theo chúng ta cùng sử dụng rich-rule để cấu hình các quy tắc riêng cho từng zone nào.

# add service http or https
sudo firewall-cmd --zone=internal --add-service=http --permanent
sudo firewall-cmd --zone=external --add-service=https --permanent
# add allow ip or reject ip
sudo firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address=20.127.203.212 port port=80 protocol=tcp reject'
sudo firewall-cmd --permanent --zone=external --add-rich-rule='rule family="ipv4" source address=20.127.203.212 port port=443 protocol=tcp accept'
# remove rule exists
sudo firewall-cmd --permanent --zone=internal --remove-rich-rule='rule family="ipv4" source address=20.127.203.212 port port=80 protocol=tcp reject'
sudo firewall-cmd --permanent --zone=external --remove-rich-rule='rule family="ipv4" source address=20.127.203.212 port port=443 protocol=tcp accept'

Trên đây là một số câu lệnh cơ bản để thao tác với rich-rule theo từng zone nhất định.

Chúng ta cùng nhìn qua một chút về hệ thống sau khi đã thao tách với rich-rule nhé.

Như chúng ta thấy, lúc này mỗi zone sẽ có một số quy tắc nhất định để phù hợp với yêu cầu bài toán của chúng ta đặt ra.

Tạm kết lại phần 1 về trải nghiệm thực tế của mình với firewalld và iptables ở đây. Qua bài viết trên hi vọng mọi người có được một cái nhìn tổng quan giữa firewalld và iptables cũng như một số thao tác làm việc với firewalld để đáp ứng bài toán đặt ra. Cùng chờ đón phần 2 với các thác tác liên quan đến tầng Transport trong mô hình TCP/IP cùng firewalld nhé mọi người.

4. Tổng kết

Quá trình tìm hiểu và làm việc với firewalld đã giúp chúng ta hiểu cách quản lý tường lửa trên hệ thống Linux một cách hiệu quả. Chúng ta đã học cách cài đặt, bật dịch vụ firewalld, mở các cổng cũng như các service trên firewalld cho phép truy cập đến hệ thống mình đang vận hành, và thậm chí tạo các luật tùy chỉnh để kiểm soát luồng dữ liệu vào và ra khỏi máy chủ của mình. Việc này giúp bảo vệ hệ thống khỏi các mối đe dọa mạng và duy trì tính bảo mật. Quá trình học tập và thực hành này là một phần quan trọng trong việc quản lý hệ thống Linux và bảo vệ dữ liệu của chúng ta trên internet.

5. Tài liệu tham khảo