Trong bài hướng dẫn này, bạn sẽ được tìm hiểu cách thiết lập tường lửa trên Rocky Linux 9 với firewalld của mình và nắm được những kiến thức cơ bản về quản lý tường lửa thông qua công cụ quản trị firewall-cmd.
Firewalld là phần mềm quản lý tường lửa có sẵn cho nhiều bản phân phối Linux, hoạt động như giao diện phía trước cho các hệ thống lọc gói dựa trên nftables hoặc iptables được tích hợp trong kernel của Linux.
Yêu cầu tiên quyết
Để hoàn thành bài hướng dẫn này, bạn cần có một máy chủ đang chạy Rocky Linux 9. Bạn nên đăng nhập vào máy chủ này bằng tài khoản không phải root nhưng có quyền sudo. Để thiết lập, hãy tham khảo Thiết Lập Máy Chủ Rocky Linux 9
DataOnline cho thuê VPS giá rẻ rên nền tảng cloud thực thụ. Hỗ trợ rất tốt Rocky Linux 9. Tự kích hoạt VPS dùng thử 7 ngày. Với Rocky Linux 9 tích hợp sẵn firewalld
Bước 1 — Ôn lại các Khái niệm Cốt lõi về firewalld
Trước khi tìm hiểu cách sử dụng tiện ích firewall-cmd để quản lý cấu hình tường lửa, bạn cần làm quen với một số khái niệm mà công cụ này giới thiệu.
Các Vùng (Zones)
Dịch vụ firewalld quản lý nhóm các quy tắc thông qua các thực thể gọi là zones. Các zones là tập hợp các quy tắc xác định lưu lượng nào nên được cho phép, tùy thuộc vào mức độ tin cậy bạn dành cho mạng. Các giao diện mạng được gán vào một zone để xác định hành vi mà tường lửa áp dụng.
Đối với các máy tính thường xuyên di chuyển giữa các mạng (như laptop), tính linh hoạt này cho phép thay đổi quy tắc theo môi trường. Bạn có thể áp dụng các quy tắc nghiêm ngặt khi đang kết nối vào mạng WiFi công cộng và áp dụng quy tắc nhẹ nhàng hơn khi ở nhà. Với máy chủ, các zone thường ít quan trọng hơn vì môi trường mạng hầu như không thay đổi.
Dù môi trường mạng của bạn có thay đổi hay không, bạn vẫn nên làm quen với ý tưởng chung của các zones được định nghĩa sẵn trong firewalld. Các zones định nghĩa sẵn, theo thứ tự từ ít tin cậy đến tin cậy nhất, bao gồm:
- drop: Mức độ tin cậy thấp nhất. Tất cả các kết nối đến đều bị loại bỏ (DROP) mà không gửi phản hồi, chỉ cho phép lưu lượng đi ra.
- block: Tương tự như drop, nhưng thay vì loại bỏ, các yêu cầu đến sẽ bị từ chối (reject) với thông báo icmp-host-prohibited hoặc icmp6-adm-prohibited.
- public: Đại diện cho các mạng công cộng, không tin cậy. Bạn không tin tưởng các máy tính khác nhưng có thể cho phép một số kết nối đến theo trường hợp.
- external: Mạng ngoài, dùng khi bạn sử dụng tường lửa như một gateway. Zone này được cấu hình NAT masquerading để mạng nội bộ của bạn vẫn được bảo mật nhưng có thể truy cập.
- internal: Phía bên trong của zone external, dùng cho phần nội bộ của gateway. Các máy tính ở đây được tin cậy hơn và có thêm một số dịch vụ.
- dmz: Dành cho các máy tính trong DMZ (mạng biệt lập, không có quyền truy cập vào phần còn lại của mạng). Chỉ cho phép một số kết nối đến.
- work: Dành cho các máy làm việc. Tin tưởng hầu hết các máy trong mạng và có thể cho phép thêm một số dịch vụ.
- home: Môi trường gia đình. Thường ngụ ý rằng bạn tin tưởng hầu hết các máy khác và cho phép thêm một số dịch vụ.
- trusted: Tin cậy hoàn toàn với tất cả các máy trong mạng. Đây là zone mở nhất và nên được sử dụng hạn chế.
Để sử dụng tường lửa, bạn có thể tạo các quy tắc và thay đổi thuộc tính của các zones, sau đó gán giao diện mạng của bạn vào zone phù hợp nhất.
Tính Bền Vững của Quy tắc
Trong firewalld, các quy tắc có thể được áp dụng cho cấu hình tường lửa hiện tại (runtime ruleset) hoặc được lưu vĩnh viễn. Mặc định, khi bạn thêm hoặc sửa đổi một quy tắc, chỉ tường lửa đang chạy được thay đổi. Sau lần khởi động lại – hoặc reload dịch vụ firewalld – chỉ các quy tắc vĩnh viễn sẽ còn lại.
Hầu hết các thao tác của firewall-cmd có thể nhận tham số --permanent
(tham số này được dịch là “tham số”) để chỉ ra rằng thay đổi nên được áp dụng cho cấu hình vĩnh viễn. Ngoài ra, tường lửa hiện hành có thể được lưu vào cấu hình vĩnh viễn bằng lệnh:
firewall-cmd --runtime-to-permanent
Sự tách biệt giữa cấu hình runtime và cấu hình vĩnh viễn cho phép bạn an toàn thử nghiệm các quy tắc trong tường lửa đang chạy, sau đó reload để quay lại cấu hình ban đầu nếu gặp vấn đề.
Bước 2 — Cài đặt và Kích hoạt firewalld | Rocky Linux 9 firewalld
firewalld được cài đặt mặc định trên một số bản phân phối Linux, bao gồm nhiều triển khai của Rocky Linux. Tuy nhiên, bạn có thể cần phải tự cài đặt firewalld. Sử dụng trình quản lý gói dnf của Rocky để cài đặt:
sudo dnf install firewalld -y
Sau khi cài đặt firewalld, bạn cần kích hoạt dịch vụ bằng systemctl. Lưu ý rằng việc kích hoạt firewalld sẽ làm cho dịch vụ tự khởi động khi máy chủ bật. Tốt nhất bạn hãy tạo các quy tắc tường lửa và kiểm tra chúng khi đang đăng nhập qua SSH để tránh rủi ro mất kết nối.
sudo systemctl enable firewalld sudo systemctl start firewalld
Bạn có thể kiểm tra xem dịch vụ đã chạy hay chưa bằng lệnh:
sudo firewall-cmd --state
Output
running
Điều này cho biết tường lửa của bạn đang hoạt động với cấu hình mặc định. Trước khi thực hiện các thay đổi thêm, bạn nên làm quen với môi trường và các quy tắc mặc định do firewalld cung cấp.
Khám phá Cấu hình Mặc định
Bạn có thể xem zone mặc định hiện tại bằng lệnh:
firewall-cmd --get-default-zone
Output
public
Vì bạn chưa thay đổi zone nào, và không có giao diện nào được cấu hình sang zone khác, zone mặc định (public) sẽ là zone duy nhất đang hoạt động (zone điều khiển lưu lượng của các giao diện).
Để kiểm tra các zone đang hoạt động, chạy:
firewall-cmd --get-active-zones
Output
public interfaces: eth0 eth1
Bạn cũng có thể in ra các quy tắc của zone mặc định bằng cách sử dụng:
sudo firewall-cmd --list-all
Output
public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Bạn có thể nhận ra từ đầu ra rằng zone này vừa là mặc định và cũng đang hoạt động, đồng thời các giao diện eth0 và eth1 đều được gán vào zone này. Từ dòng services:, bạn cũng thấy rằng zone này cho phép lưu lượng cho một client DHCP (để cấp phát địa chỉ IP), SSH (cho quản trị từ xa) và Cockpit (một bảng điều khiển qua web).
Khám phá các Zone Thay Thế
Bạn cũng có thể tìm hiểu thông tin về các zone khác.
Để lấy danh sách các zone có sẵn, hãy chạy:
firewall-cmd --get-zones
Output
block dmz drop external home internal nm-shared public trusted work
Bạn có thể xem cấu hình cụ thể của một zone bằng cách sử dụng tham số --zone=
kết hợp với lệnh --list-all
. Ví dụ, để xem cấu hình của zone home, hãy chạy:
sudo firewall-cmd --zone=home --list-all
Output
home target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client mdns samba-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Bạn có thể xuất toàn bộ các định nghĩa của zone bằng cách sử dụng tùy chọn --list-all-zones
. Tiếp theo, bạn sẽ tìm hiểu cách gán các zone cho các giao diện mạng.
Bước 3 — Chọn Zones cho Các Giao Diện Mạng của Bạn
Mặc định, nếu bạn chưa cấu hình giao diện mạng, mỗi giao diện sẽ được gán vào zone mặc định khi tường lửa khởi động.
Thay đổi Zone của Một Giao Diện
Bạn có thể chuyển một giao diện giữa các zones trong phiên làm việc bằng cách sử dụng tham số --zone=
kết hợp với --change-interface=
. Lưu ý rằng tất cả các lệnh thay đổi tường lửa đều cần dùng sudo.
Ví dụ, để chuyển giao diện eth0 sang zone home:
sudo firewall-cmd --zone=home --change-interface=eth0
Output
success
Khi chuyển giao diện sang zone mới, bạn cần lưu ý rằng bạn đang thay đổi các dịch vụ sẽ được mở. Trong trường hợp này, chuyển sang zone home (zone này cho phép SSH), nên kết nối của bạn sẽ không bị mất. Một số zones khác không mở SSH theo mặc định, việc chuyển sang chúng có thể làm mất kết nối và ngăn bạn đăng nhập lại.
Để kiểm tra lại các zones đang hoạt động, chạy:
firewall-cmd --get-active-zones
Output
home interfaces: eth0 public interfaces: eth1
Điều chỉnh Zone Mặc định
Nếu tất cả các giao diện của bạn có thể được xử lý tốt bởi một zone định nghĩa sẵn, bạn nên chỉ định zone đó làm mặc định. Để thay đổi zone mặc định, sử dụng tham số:
sudo firewall-cmd --set-default-zone=home
Output
success
Bước 4 — Đặt Quy tắc cho Ứng dụng của Bạn
Hãy cùng xem qua các cách định nghĩa ngoại lệ cho tường lửa.
Thêm Dịch vụ vào Zones của Bạn
Phương pháp đơn giản nhất là thêm các dịch vụ (service) hoặc cổng (port) mà bạn cần vào các zone đang sử dụng. Bạn có thể xem danh sách các dịch vụ có sẵn bằng lệnh:
firewall-cmd --get-services
Output
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-api kube-apiserver kube-control-plane kube-controller-manager kube-scheduler kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd netbios-ns nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wireguard wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
Lưu ý: Bạn có thể tìm hiểu thêm chi tiết về từng dịch vụ bằng cách xem các file .xml tương ứng trong thư mục /usr/lib/firewalld/services. Ví dụ, dịch vụ SSH được định nghĩa trong file /usr/lib/firewalld/services/ssh.xml.
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/> </service>
Để kích hoạt một dịch vụ cho một zone, sử dụng tham số --add-service=
. Mặc định, lệnh này chỉ thay đổi cấu hình tường lửa hiện tại (runtime). Ví dụ, nếu máy chủ web của bạn phục vụ lưu lượng HTTP thông thường, bạn có thể tạm thời cho phép lưu lượng này đối với các giao diện ở zone public:
sudo firewall-cmd --zone=public --add-service=http
Bạn có thể bỏ qua tham số --zone=
để thay đổi zone mặc định. Để xác minh, dùng lệnh:
sudo firewall-cmd --zone=public --list-services
Output
cockpit dhcpv6-client http ssh
Để lưu thay đổi vĩnh viễn, thêm tham số --permanent
:
sudo firewall-cmd --zone=public --add-service=http --permanent
Output
success
Hoặc bạn có thể chuyển cấu hình runtime hiện tại sang cấu hình vĩnh viễn bằng lệnh:
sudo firewall-cmd --runtime-to-permanent
Sau đó, xác minh cấu hình vĩnh viễn:
sudo firewall-cmd --zone=public --list-services --permanent
Output
cockpit dhcpv6-client http ssh
Nếu máy chủ web của bạn sử dụng SSL/TLS, bạn cũng cần thêm dịch vụ https. Thêm vào phiên làm việc hiện tại và vĩnh viễn:
sudo firewall-cmd --zone=public --add-service=https sudo firewall-cmd --zone=public --add-service=https --permanent
Mở Cổng cho Zones của Bạn
Một cách trực tiếp khác để hỗ trợ ứng dụng cụ thể là mở cổng mà ứng dụng sử dụng trong zone phù hợp. Bạn có thể chỉ định cổng hoặc dải cổng và giao thức liên quan (TCP hoặc UDP).
Ví dụ, nếu ứng dụng của bạn chạy trên cổng 5000 với giao thức TCP, bạn có thể tạm thời mở cổng đó cho zone public:
sudo firewall-cmd --zone=public --add-port=5000/tcp
Output
success
Xác minh với:
sudo firewall-cmd --zone=public --list-ports
Output
5000/tcp
Bạn cũng có thể chỉ định dải cổng, ví dụ, nếu ứng dụng của bạn sử dụng các cổng UDP từ 4990 đến 4999:
sudo firewall-cmd --zone=public --add-port=4990-4999/udp
Sau khi thử nghiệm, bạn có thể lưu các thay đổi vĩnh viễn bằng cách chạy lại lệnh với tham số --permanent
:
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp sudo firewall-cmd --zone=public --permanent --list-ports
Output
success success 5000/tcp 4990-4999/udp
Định Nghĩa Một Dịch vụ
Mặc dù mở cổng là cách đơn giản, nhưng theo dõi các cổng đã mở có thể gây khó khăn khi gỡ bỏ dịch vụ cũ. Để tránh tình trạng này, bạn có thể định nghĩa một dịch vụ mới.
Dịch vụ là tập hợp các cổng với tên và mô tả đi kèm. Quản lý tường lửa bằng dịch vụ thường dễ bảo trì hơn việc quản lý cổng riêng lẻ, nhưng đòi hỏi một chút cấu hình ban đầu. Bạn có thể bắt đầu bằng cách sao chép một file định nghĩa dịch vụ hiện có trong thư mục /usr/lib/firewalld/services vào thư mục /etc/firewalld/services (nơi tường lửa tìm các định nghĩa không chuẩn).
Ví dụ, sao chép định nghĩa dịch vụ SSH:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
Sau đó, mở file bằng trình soạn thảo yêu thích (ví dụ, vi
):
sudo vi /etc/firewalld/services/example.xml
Ban đầu, file sẽ chứa định nghĩa của SSH. Bạn cần thay đổi nội dung bên trong thẻ <short>
để đặt tên dịch vụ (tên hiển thị cho con người) và chỉnh sửa mô tả. Thay đổi cấu hình duy nhất ảnh hưởng đến chức năng của dịch vụ là phần định nghĩa cổng, nơi bạn chỉ định số cổng và giao thức mở. Bạn có thể có nhiều thẻ <port/>
.
Ví dụ, giả sử dịch vụ của bạn cần mở cổng 7777 cho TCP và 8888 cho UDP, chỉnh sửa file như sau:
/etc/firewalld/services/example.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/> </service>
Lưu và đóng file.
Reload tường lửa để nạp định nghĩa dịch vụ mới:
sudo firewall-cmd --reload
Bạn có thể xem danh sách các dịch vụ hiện có bằng:
firewall-cmd --get-services
Output (ví dụ)
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server example finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-api kube-apiserver kube-control-plane kube-controller-manager kube-scheduler kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd netbios-ns nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wireguard wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
Giờ đây, bạn có thể sử dụng dịch vụ này trong các zones như thông thường.
Bước 5 — Tạo Zone Riêng của Bạn
Mặc dù các zones được định nghĩa sẵn thường đủ cho hầu hết người dùng, đôi khi bạn muốn tạo các zone mô tả rõ chức năng của chúng.
Ví dụ, bạn có thể cần tạo một zone cho máy chủ web của bạn, gọi là publicweb. Hoặc tạo một zone cho dịch vụ DNS trên mạng riêng của bạn, ví dụ gọi là privateDNS.
Khi thêm một zone, bạn phải thêm nó vào cấu hình tường lửa vĩnh viễn. Sau đó, reload để nạp cấu hình vào phiên runtime. Ví dụ, tạo 2 zone sau:
sudo firewall-cmd --permanent --new-zone=publicweb sudo firewall-cmd --permanent --new-zone=privateDNS
Xác minh các zone này có trong cấu hình vĩnh viễn:
sudo firewall-cmd --permanent --get-zones
Output
block dmz drop external home internal nm-shared privateDNS public publicweb trusted work
Reload tường lửa để đưa các zone mới vào cấu hình runtime:
sudo firewall-cmd --reload firewall-cmd --get-zones
Output
block dmz drop external home internal nm-shared privateDNS public publicweb trusted work
Bây giờ, bạn có thể bắt đầu gán các dịch vụ và cổng phù hợp cho các zone của mình.
Ví dụ, cho zone publicweb, thêm các dịch vụ SSH, HTTP và HTTPS:
sudo firewall-cmd --zone=publicweb --add-service=ssh sudo firewall-cmd --zone=publicweb --add-service=http sudo firewall-cmd --zone=publicweb --add-service=https sudo firewall-cmd --zone=publicweb --list-all
utput
publicweb target: default icmp-block-inversion: no interfaces: sources: services: http https ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
sudo firewall-cmd --zone=privateDNS --add-service=dns sudo firewall-cmd --zone=privateDNS --list-all
Output
privateDNS target: default icmp-block-inversion: no interfaces: sources: services: dns ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Sau đó, bạn có thể chuyển giao diện mạng sang các zone mới này để kiểm tra. Ví dụ:
sudo firewall-cmd --zone=publicweb --change-interface=eth0 sudo firewall-cmd --zone=privateDNS --change-interface=eth1
Bây giờ, bạn có thể thử nghiệm cấu hình. Nếu mọi thứ hoạt động ổn, bạn nên lưu các quy tắc này vĩnh viễn. Bạn có thể chạy lại tất cả lệnh với tham số --permanent
, hoặc dùng lệnh:
sudo firewall-cmd --runtime-to-permanent
Sau khi áp dụng các quy tắc vĩnh viễn, reload tường lửa để kiểm tra:
sudo firewall-cmd --reload
Xác minh các zone được gán đúng:
firewall-cmd --get-active-zones
Output
privateDNS interfaces: eth1 publicweb interfaces: eth0
Kiểm tra các dịch vụ của từng zone:
sudo firewall-cmd --zone=publicweb --list-services
Output
http https ssh
Và:
sudo firewall-cmd --zone=privateDNS --list-services
Output
dns
Để đặt một zone làm mặc định cho các giao diện khác, sử dụng tham số:
sudo firewall-cmd --set-default-zone=publicweb
Kết Luận
Hiện tại, bạn đã có một hiểu biết khá toàn diện về cách quản trị dịch vụ firewalld trên hệ thống Rocky Linux cho mục đích sử dụng hàng ngày.
Dịch vụ firewalld cho phép bạn cấu hình các quy tắc và tập hợp quy tắc một cách dễ bảo trì, đồng thời cân nhắc đến môi trường mạng của bạn. Nó cho phép bạn chuyển đổi giữa các chính sách tường lửa khác nhau thông qua việc sử dụng zones. Việc nắm vững hệ thống này sẽ giúp bạn tận dụng tối đa sự linh hoạt và sức mạnh mà công cụ này cung cấp.
Để biết thêm thông tin về firewalld, vui lòng xem tài liệu chính thức của firewalld.