Từ phiên bản 7 của Rhel và CentOS cũng như phiên bản 18 của Fedora, firewalld đã trở thành hệ thống tường lửa mặc định. Một trong những đặc điểm nổi bật của nó là tính mô-đun: firewalld hoạt động dựa trên khái niệm các vùng kết nối (zones). Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu thêm về firewalld và cách tương tác với nó thông qua tiện ích firewall-cmd.
Mục tiêu
Tìm hiểu các khái niệm cơ bản về firewalld và cách tương tác với nó thông qua tiện ích firewall-cmd.
Yêu cầu
● Quyền root
Độ khó
Dễ
Quy ước
● # – yêu cầu các lệnh Linux được thực thi với quyền root, có thể thực hiện trực tiếp với tài khoản root hoặc sử dụng lệnh sudo.
● $ – yêu cầu các lệnh Linux được thực thi với tư cách người dùng không có đặc quyền.
Tường lửa dựa trên các vùng (Zones)
firewalld là tường lửa dựa trên vùng: mỗi vùng có thể được cấu hình để cho phép hoặc từ chối một số dịch vụ hoặc cổng, từ đó có mức độ bảo mật khác nhau. Các vùng có thể được liên kết với một hoặc nhiều giao diện mạng. Thông thường, firewalld đi kèm với một tập hợp các vùng đã được cấu hình sẵn. Để liệt kê các vùng này và nói chung để tương tác với tường lửa, chúng ta sẽ sử dụng tiện ích firewall-cmd. Tôi đang chạy hệ thống Fedora 27, hãy kiểm tra xem những vùng khả dụng là gì:
Như bạn thấy, lệnh trên trả về danh sách tất cả các vùng có sẵn trên hệ thống của tôi. Tên của chúng khá gợi ý về mục đích sử dụng, nhưng chúng ta cần biết qua chúng thông qua những dịch vụ và cổng nào được phép truy cập: quy tắc mặc định chung là tất cả các dịch vụ hoặc cổng đều bị từ chối. Mỗi giao diện sau đó được cấu hình với một số ngoại lệ, tùy theo các dịch vụ cần được phép. Nếu chúng ta muốn có danh sách tất cả các dịch vụ liên kết với một vùng, ta có thể chạy firewall-cmd với tùy chọn –get-services. Nếu không chỉ định rõ vùng cho lệnh, vùng mặc định sẽ được truy vấn:
Lệnh trên trả về tóm tắt trạng thái của vùng (trong trường hợp này là vùng mặc định, “public”). Trong đó, bạn có thể dễ dàng nhận biết được giao diện mạng nào đang được liên kết với vùng này (ens5f5) và các dịch vụ nào được cho phép (ssh, mdns, dhcpv6-client). Nếu muốn lấy thông tin về một vùng cụ thể không phải mặc định, chúng ta nên truyền tên vùng đó qua tùy chọn –zone. Ví dụ, để lấy thông tin về vùng external, ta thực hiện:
Quản lý các vùng (Zones Manipulation)
Như đã nói ở trên, khi sử dụng công cụ firewall-cmd, nếu không chỉ định rõ vùng, thì mặc định sẽ tham chiếu đến vùng mặc định. Chúng ta có thể muốn thay đổi vùng mặc định. Ví dụ, nếu muốn đặt vùng external làm mặc định:
Rất đơn giản, phải không? Bây giờ, hãy xem cách thêm hoặc xóa dịch vụ hoặc cổng cho một vùng cụ thể. Trước hết, các dịch vụ là một tập hợp các cổng đã được cấu hình sẵn liên kết với một giao thức cụ thể. Ví dụ: dịch vụ ssh sẽ bao gồm cổng TCP 22, trong khi dịch vụ samba sẽ bao gồm các cổng TCP 139 và 445, cùng với các cổng UDP 137 và 138. Sử dụng dịch vụ giúp chúng ta tránh phải nhớ từng cổng cụ thể mỗi lần. Giả sử chúng ta muốn thêm dịch vụ samba vào vùng external, tất cả những gì cần làm là:
Dịch vụ firewalld đã trả về thành công, nghĩa là lệnh đã được thực thi thành công. Để xác nhận, hãy kiểm tra các dịch vụ của vùng:
Như bạn thấy, chúng ta đã sử dụng tùy chọn –list-services cho mục đích này. Kết quả lệnh cho thấy dịch vụ samba đã được thêm vào vùng. Tuy nhiên, các thay đổi được thực hiện theo cách này là tạm thời và sẽ không tồn tại sau khi khởi động lại dịch vụ firewalld. Hãy kiểm tra điều đó. Đầu tiên, chúng ta reload lại dịch vụ:
Sau đó, kiểm tra lại các dịch vụ được phép trong vùng external:
Như bạn thấy, dịch vụ duy nhất được phép trong vùng external là ssh. Để thực hiện thay đổi vĩnh viễn đối với một vùng, ta phải sử dụng tùy chọn –permanent:
Các thay đổi vĩnh viễn cần được reload lại firewall để có hiệu lực.
Nếu muốn thực hiện thao tác ngược lại, tức là xóa một dịch vụ khỏi vùng, ta thực hiện:
Cú pháp rất trực quan và không cần thêm giải thích. Nhưng nếu muốn thêm một cổng cụ thể thay vì dịch vụ, cú pháp sẽ thay đổi một chút:
Để xác nhận rằng cổng đã được thêm vào vùng:
Thao tác đã thành công. Tương tự, để xóa một cổng, ta thực hiện:
Tạo vùng tùy chỉnh
Cho đến thời điểm này, chúng ta chỉ biết cách sửa đổi các vùng có sẵn. Nhưng cũng có thể tạo thêm các vùng mới, và việc này cũng rất đơn giản. Giả sử chúng ta muốn tạo một vùng tùy chỉnh có tên là linuxconfig:
Một vùng mới rỗng đã được tạo ra: theo mặc định, không có dịch vụ hoặc cổng nào được phép trong đó. Ngoài ra, cũng có thể tạo một vùng bằng cách tải một file cấu hình:
Trong đó, file là đường dẫn tới file chứa định nghĩa vùng. Lưu ý rằng khi tạo hoặc xóa một vùng, tùy chọn –permanent là bắt buộc; nếu không cung cấp, sẽ báo lỗi.
Liên kết vùng với một giao diện
Việc tạo một vùng chỉ là bước đầu tiên: bây giờ chúng ta phải liên kết nó với một giao diện mạng. Giả sử ta muốn sử dụng vùng mới tạo và liên kết nó với giao diện ethernet ens5f5, đây là lệnh để thực hiện:
Nếu truy vấn vùng để xem các giao diện đã được gán cho nó, ta sẽ thấy:
Việc loại bỏ giao diện khỏi vùng cũng rất đơn giản:
Rich Rules
Trong một số tình huống, chúng ta có thể cần tạo các quy tắc phức tạp hơn, không chỉ cho phép một số cổng hoặc dịch vụ trong vùng. Ví dụ, ta có thể muốn tạo một quy tắc để chặn một loại lưu lượng từ một máy cụ thể. Đó chính là lúc rich rules được sử dụng. Một quy tắc cơ bản bao gồm hai phần: phần đầu tiên xác định các điều kiện để quy tắc được áp dụng, và phần thứ hai là hành động sẽ được thực hiện: accept, drop, hoặc reject.
Giả sử chúng ta muốn chặn lưu lượng từ máy có IP 192.168.0.37 trong mạng nội bộ, đây là cách chúng ta sẽ xây dựng quy tắc:
Để thêm một rich rule, ta sử dụng tùy chọn –add-rich-rule, mô tả quy tắc như một đối số. Quy tắc bắt đầu với từ khóa rule. Với tham số family ta chỉ định rằng quy tắc chỉ áp dụng cho các gói tin IPv4: nếu không chỉ định, quy tắc sẽ áp dụng cho cả IPv4 và IPv6. Sau đó, ta cung cấp địa chỉ nguồn của các gói tin cần khớp với quy tắc qua source address. Với service, ta chỉ định loại dịch vụ cho quy tắc, trong trường hợp này là ssh. Cuối cùng, ta cung cấp hành động thực hiện nếu gói tin khớp với quy tắc, ở đây là reject. Nếu bây giờ ta cố gắng thiết lập kết nối ssh từ máy có IP 192.168.0.37, kết quả sẽ như sau:
Quy tắc trên khá đơn giản, nhưng một quy tắc có thể trở nên rất phức tạp. Bạn nên kiểm tra tài liệu của firewalld để biết đầy đủ các cài đặt và tùy chọn có sẵn.
Chế độ khẩn (The Panic Mode)
Chế độ khẩn là chế độ chỉ nên được sử dụng trong những tình huống có vấn đề nghiêm trọng với môi trường mạng. Khi chế độ này được kích hoạt, tất cả các kết nối hiện có sẽ bị loại bỏ, và tất cả các gói tin đến và đi sẽ bị chặn. Để kích hoạt chế độ này, chạy:
Để thoát khỏi chế độ khẩn, lệnh là:
Bạn cũng có thể truy vấn trạng thái chế độ khẩn bằng lệnh:
Những tùy chọn này chỉ có hiệu lực khi chạy (runtime) và không thể sử dụng với tùy chọn –permanent.