0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Firewalld: Quản lý Tường lửa Hiện đại trên Linux

Đăng vào 7 tháng trước

• 8 phút đọc

Giới thiệu về Firewalld

Firewalld là một công cụ quản lý tường lửa động trên hệ điều hành Linux, cho phép người dùng cấu hình các quy tắc tường lửa mà không cần khởi động lại dịch vụ. Điều này mang lại sự linh hoạt hơn so với các hệ thống tường lửa tĩnh như iptables. Trong bài viết này, chúng ta sẽ đi sâu vào cách sử dụng lệnh firewall-cmd, các khái niệm chính, và cách tối ưu hóa cấu hình tường lửa của bạn.

Các Khái Niệm Chính

Zones

Firewalld sử dụng khái niệm zones để quản lý các môi trường mạng khác nhau. Mỗi zone là một tập hợp các quy tắc xác định loại lưu lượng nào được phép. Bạn có thể gán các giao diện mạng vào các zone cụ thể. Một số zone phổ biến bao gồm:

  • public: Dùng cho mạng không đáng tin cậy, như Internet.
  • trusted: Dùng cho tất cả các kết nối mạng; chấp nhận mọi lưu lượng.
  • home: Dùng cho các mạng đáng tin cậy; cho phép lưu lượng vào liên quan đến các dịch vụ trong gia đình.
  • internal: Dùng cho các mạng nội bộ.

Services

Một service là một tập hợp các quy tắc được định nghĩa sẵn cho một ứng dụng hoặc giao thức cụ thể, như HTTP, SSH, hoặc FTP. Việc sử dụng các service giúp đơn giản hóa quản lý tường lửa, vì bạn không cần nhớ các số cổng cụ thể.

Permanent vs. Runtime

Các thay đổi được thực hiện bằng lệnh firewall-cmd có thể là runtime (hoạt động ngay lập tức nhưng sẽ mất đi khi khởi động lại) hoặc permanent (lưu vào file cấu hình và áp dụng khi khởi động lại). Để làm cho một thay đổi trở thành permanent, bạn cần sử dụng tham số --permanent.

Các Tùy Chọn của Lệnh firewall-cmd

Lệnh Chung

  • --state: Kiểm tra trạng thái của dịch vụ firewalld.
  • --reload: Tải lại các quy tắc tường lửa từ cấu hình permanent. Điều này rất quan trọng để áp dụng các thay đổi permanent mà không cần khởi động lại.

Quản Lý Zone

  • --get-active-zones: Liệt kê tất cả các zone đang hoạt động và các giao diện được gán cho chúng.
  • --get-default-zone: Hiển thị zone mặc định hiện tại.
  • --set-default-zone=<zone>: Đặt một zone mặc định mới.
  • --get-zones: Liệt kê tất cả các zone có sẵn.
  • --list-all-zones: Liệt kê tất cả thông tin cho tất cả các zone.
  • --zone=<zone> --list-all: Liệt kê tất cả quy tắc, dịch vụ, cổng và thông tin khác cho một zone cụ thể.

Quản Lý Dịch Vụ

  • --zone=<zone> --add-service=<service>: Thêm một dịch vụ được định nghĩa sẵn vào một zone.
  • --zone=<zone> --remove-service=<service>: Gỡ bỏ một dịch vụ khỏi một zone.
  • --get-services: Liệt kê tất cả các dịch vụ được định nghĩa sẵn.

Quản Lý Cổng

  • --zone=<zone> --add-port=<port>/<protocol>: Thêm một cổng và giao thức cụ thể vào một zone. Ví dụ: --add-port=8080/tcp.
  • --zone=<zone> --remove-port=<port>/<protocol>: Gỡ bỏ một cổng khỏi một zone.

Quy Tắc Rich

Quy tắc rich cung cấp khả năng kiểm soát chi tiết hơn so với các quy tắc đơn giản về cổng hoặc dịch vụ. Chúng có thể được sử dụng cho việc lọc IP nguồn, ghi log, và chuyển tiếp lưu lượng phức tạp hơn.

  • --add-rich-rule='rule ...': Thêm một quy tắc rich.
  • --remove-rich-rule='rule ...': Gỡ bỏ một quy tắc rich.

Masquerading và Chuyển Tiếp Cổng

Masquerading (Dịch địa chỉ mạng hay NAT) cho phép một máy tính hoạt động như một cổng cho các thiết bị khác trên một mạng riêng, chia sẻ kết nối Internet của nó.

  • --zone=<zone> --add-masquerade: Bật masquerading cho một zone.
  • --zone=<zone> --add-forward-port=port=<port>:proto=<protocol>:toport=<port>:toaddr=<address>: Chuyển tiếp lưu lượng từ một cổng sang cổng khác hoặc đến một địa chỉ IP khác.

Các Tập Tin Cấu Hình Firewalld

Firewalld sử dụng hai vị trí chính cho các tập tin cấu hình của nó: runtime và permanent.

Cấu Hình Runtime

/run/firewalld/: Thư mục này chứa các cấu hình runtime tạm thời. Bất kỳ thay đổi nào được thực hiện mà không có tham số --permanent đều được lưu trữ ở đây. Các tập tin này thường được tạo ra và quản lý bởi dịch vụ firewalld và không được sửa đổi trực tiếp.

Cấu Hình Permanent

/usr/lib/firewalld/: Thư mục này giữ các tập tin cấu hình mặc định hoặc do hệ thống cung cấp, bao gồm các zone và dịch vụ đã được định nghĩa sẵn. Bạn không nên chỉnh sửa các tập tin này trực tiếp.

/etc/firewalld/: Đây là vị trí chính cho các cấu hình permanent do người dùng tạo và chỉnh sửa. Khi bạn sử dụng tham số --permanent với lệnh firewall-cmd, các thay đổi được lưu trong thư mục này. Các tập tin trong /etc/firewalld/ sẽ ghi đè lên các tập tin mặc định trong /usr/lib/firewalld/.

Các Tập Tin Cấu Hình Chính

  • /etc/firewalld/firewalld.conf: Tập tin cấu hình chính của firewalld. Nó thiết lập zone mặc định và các thiết lập toàn cục khác.
  • /etc/firewalld/zones/: Thư mục này chứa các tập tin XML cho mỗi zone (ví dụ: public.xml, home.xml). Các tập tin này xác định các quy tắc cho mỗi zone.
  • /etc/firewalld/services/: Thư mục này chứa các tập tin XML cho các dịch vụ do người dùng định nghĩa. Bạn có thể tạo một tập tin dịch vụ mới ở đây để xác định một tập hợp các cổng và giao thức cho một ứng dụng mới.
  • /etc/firewalld/icmptypes/: Thư mục này chứa các tập tin XML cho các loại ICMP do người dùng định nghĩa.

Chặn Lưu Lượng Từ Địa Chỉ IP Cụ Thể

Bạn có thể chặn lưu lượng từ các địa chỉ IP cụ thể bằng cách sử dụng lệnh firewall-cmd giống như bạn đã làm với iptables. Cách linh hoạt nhất để làm điều này là sử dụng quy tắc rich. Quy tắc rich cung cấp khả năng kiểm soát chi tiết hơn và là phương pháp được khuyến nghị cho các chính sách tường lửa phức tạp trong firewalld.

Chặn Một Địa Chỉ IP Cụ Thể

Để chặn tất cả lưu lượng đến từ một địa chỉ IP cụ thể (ví dụ: 192.168.1.100) đến máy chủ của bạn, bạn có thể sử dụng hành động reject trong một quy tắc rich. Điều này sẽ gửi một thông điệp "ICMP host unreachable" trở lại cho người gửi, cho phép họ biết kết nối đã bị từ chối.

bash Copy
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'  
firewall-cmd --reload
  • --permanent: Giúp quy tắc này tồn tại qua các lần khởi động lại.
  • --add-rich-rule: Yêu cầu firewalld thêm một quy tắc rich mới.
  • rule family="ipv4": Chỉ rõ rằng quy tắc này áp dụng cho lưu lượng IPv4.
  • source address="192.168.1.100": Địa chỉ IP nguồn bạn muốn chặn.
  • reject: Hành động cần thực hiện, trong trường hợp này là từ chối kết nối.

Chặn Địa Chỉ IP Đối Với Một Dịch Vụ Cụ Thể (Ví dụ: SSH)

Để chặn một địa chỉ IP cụ thể truy cập vào một dịch vụ nhất định, bạn có thể kết hợp quy tắc rich với tùy chọn dịch vụ hoặc cổng.
Ví dụ, để chặn một IP (192.168.1.100) không cho truy cập vào SSH:

bash Copy
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" reject'  
firewall-cmd --reload

Chặn Một Dải Địa Chỉ IP

Bạn cũng có thể chặn toàn bộ một dải địa chỉ IP (một subnet) bằng cách sử dụng ký hiệu CIDR.

bash Copy
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" reject'  
firewall-cmd --reload

Lệnh này sẽ chặn tất cả lưu lượng từ mạng 192.168.1.x.

Sau khi thêm bất kỳ quy tắc nào, bạn phải chạy firewall-cmd --reload để áp dụng các thay đổi từ cấu hình permanent vào tường lửa đang chạy.

Các Thực Hành Tốt Nhất

  • Luôn sao lưu cấu hình trước khi thực hiện bất kỳ thay đổi nào để có thể phục hồi nếu có vấn đề xảy ra.
  • Kiểm tra quy tắc của bạn bằng cách sử dụng lệnh firewall-cmd --list-all để đảm bảo rằng các quy tắc được áp dụng như mong muốn.
  • Sử dụng các dịch vụ được xác định sẵn để giảm thiểu sai sót khi nhập cổng và giao thức.
  • Giám sát tường lửa thường xuyên để đảm bảo rằng không có lưu lượng không mong muốn nào được phép vào hệ thống.

Các Cạm Bẫy Thường Gặp

  • Quên sử dụng tham số --permanent: Nếu bạn không sử dụng tùy chọn này, các thay đổi sẽ không được lưu và sẽ biến mất khi khởi động lại.
  • Sử dụng quy tắc quá phức tạp: Quy tắc rich rất mạnh mẽ nhưng cũng dễ gây nhầm lẫn. Hãy chắc chắn rằng bạn hiểu các quy tắc trước khi triển khai chúng.

Mẹo Tối Ưu Hiệu Suất

  • Sử dụng zone một cách hợp lý: Chỉ định các zone phù hợp cho từng giao diện mạng để giảm thiểu lưu lượng không cần thiết.
  • Tối ưu hóa quy tắc: Đặt các quy tắc thường xuyên được sử dụng lên đầu danh sách để xử lý nhanh hơn.
  • Thực hiện kiểm tra hiệu suất để đảm bảo rằng tường lửa không làm chậm hệ thống của bạn.

Kết Luận

Firewalld là một công cụ mạnh mẽ để quản lý tường lửa trên Linux, cung cấp tính linh hoạt và khả năng mở rộng mà nhiều hệ thống tường lửa truyền thống không có. Bằng cách hiểu rõ về cách sử dụng lệnh firewall-cmd, cũng như các khái niệm liên quan như zones, services và rich rules, bạn có thể bảo vệ hệ thống của mình một cách hiệu quả hơn. Hãy bắt đầu tối ưu hóa tường lửa của bạn ngay hôm nay để giữ cho hệ thống an toàn hơn!

Câu Hỏi Thường Gặp (FAQ)

1. Tôi có thể sử dụng firewalld trên hệ điều hành nào?

Firewalld chủ yếu được sử dụng trên các bản phân phối Linux như CentOS, Fedora và RHEL.

2. Làm thế nào để kiểm tra tường lửa đang chạy?

Bạn có thể sử dụng lệnh firewall-cmd --state để kiểm tra trạng thái của dịch vụ firewalld.

3. Tôi có thể khôi phục lại cấu hình tường lửa trước đó không?

Có, nếu bạn đã sao lưu cấu hình trước đó, bạn có thể khôi phục lại bằng cách thay thế các tập tin cấu hình trong /etc/firewalld/.

4. Firewalld có hỗ trợ IPv6 không?

Có, Firewalld hỗ trợ cả IPv4 và IPv6. Bạn có thể cấu hình các quy tắc riêng biệt cho từng loại địa chỉ.

Hãy áp dụng các kiến thức này để bảo vệ hệ thống của bạn một cách hiệu quả nhất!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào