Giới thiệu về Firewalld và lệnh firewall-cmd trên linux Fedora

gioi thieu ve firewalld va lenh firewall cmd tren linux 1 1

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ì:

$ firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work

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:

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens5f5
  sources:
  services: ssh mdns dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

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:

# firewall-cmd --zone=external --list-all
external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

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:

# firewall-cmd --set-default=external

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à:

# firwall-cmd --zone=external --add-service=samba
success

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:

$ sudo firewall-cmd --zone=external --list-services
ssh samba

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ụ:

# firewall-cmd --reload

Sau đó, kiểm tra lại các dịch vụ được phép trong vùng external:

# firewall-cmd --zone=external --list-services
ssh

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:

# firewall-cmd --permanent --zone=external --add-service=samba

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:

# firewall-cmd --permanent --zone=external --remove-service=samba

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:

# firewall-cmd --permanent --zone=external --add-port=139/tcp

Để xác nhận rằng cổng đã được thêm vào vùng:

# firewall-cmd --zone=external --list-ports
139/tcp

Thao tác đã thành công. Tương tự, để xóa một cổng, ta thực hiện:

# firewall-cmd --permanent --zone=external --remove-port=139/tcp

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:

# firewall-cmd --permanent --new-zone=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:

# firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig

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:

# firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5

Nếu truy vấn vùng để xem các giao diện đã được gán cho nó, ta sẽ thấy:

# firewall-cmd --zone=linuxconfig --list-interfaces
ens5f5

Việc loại bỏ giao diện khỏi vùng cũng rất đơn giản:

# firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig

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:

# firewall-cmd --zone=linuxconfig --add-rich-rule="rule \
    family="ipv4" \
    source address=192.168.0.37 \
    service name=ssh \
    reject \

Để 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:

ssh 192.168.0.35
ssh: connect to host 192.168.0.35 port 22: Connection refused

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:

# firewall-cmd --panic-on

Để thoát khỏi chế độ khẩn, lệnh là:

# firewall-cmd --panic-off

Bạn cũng có thể truy vấn trạng thái chế độ khẩn bằng lệnh:

# firewall-cmd --query-panic

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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *