Trong CentOS 7, FirewallD xuất hiện để cấu hình quy tắc lọc lưu lượng. Đây là công cụ khuyến khích dùng để quản lý quy tắc iptables. CentOS 8 dùng framework nftables thay vì dịch vụ lọc gói iptables tiêu chuẩn, và khi cấu hình quy tắc tường lửa trong firewalld, bạn thực tế đang cấu hình nftables. Trong bài viết này chúng ta sẽ xem cách cài đặt và cấu hình firewalld trên máy chủ chạy Linux CentOS 8 (và CentOS 7) và các khái niệm chính của tường lửa này.
FirewallD là dịch vụ tường lửa dùng để bảo vệ máy chủ khỏi lưu lượng không mong muốn. Nó hỗ trợ quản lý quy tắc tường lửa động (không cần khởi động lại). Nó hoạt động như giao diện cho iptables và nftables. FirewallD có thể dùng gần như tất cả các bản phân phối Linux.
Khái niệm cơ bản Firewalld: Zones & Rules
Trước khi cài đặt và cấu hình firewalld, chúng ta sẽ học zone là gì dùng để xác định mức độ tin cậy cho các kết nối khác nhau. Bạn có thể áp dụng quy tắc lọc khác nhau cho firewalld zone, đặt tùy chọn tường lửa hoạt động cho dịch vụ, giao thức hoặc cổng được định nghĩa trước, chuyển tiếp cổng và rich-rules.
Firewalld lọc lưu lượng inbound theo zone tùy thuộc vào quy tắc áp dụng cho zone. Nếu địa chỉ IP người gửi khớp quy tắc của zone, gói tin sẽ đi qua zone đó. Nếu địa chỉ IP không khớp zone nào cấu hình trên máy chủ, zone mặc định sẽ xử lý gói tin. Khi cài firewalld, zone mặc định gọi là public.
Firewalld có một số zone với quyền được cấu hình trước cho các dịch vụ khác nhau. Bạn có thể dùng cài đặt này hoặc tạo zone riêng. Đây là danh sách zone mặc định tạo khi cài firewalld (nằm trong /usr/lib/firewalld/zones/):
| Zone | Mô tả |
|---|---|
| drop | Mức tin cậy tối thiểu. Tất cả kết nối inbound bị chặn không phản hồi, chỉ cho phép kết nối outbound. |
| block | Tương tự zone trước, nhưng yêu cầu inbound bị từ chối với thông báo icmp-host-prohibited cho IPv4 hoặc icmp6-adm-prohibited cho IPv6. |
| public | Dùng cho mạng công cộng, không tin cậy. Có thể cho phép kết nối inbound riêng lẻ. |
| external | Chỉ bất kỳ mạng bên ngoài khi tường lửa dùng làm gateway. Dùng cho masking NAT, mạng nội bộ ở riêng tư nhưng có sẵn. |
| internal | Đối lập zone external. Host có mức tin cậy đủ, nhiều dịch vụ bổ sung có sẵn. |
| dmz | Dùng cho máy tính trong demilitarized zone (DMZ) và bao gồm máy tính cô lập không truy cập mạng. Chỉ kết nối inbound được chọn cho phép. |
| work | Zone cho máy tính công việc (hầu hết máy trong mạng được tin cậy) |
| home | Đề cập đến mạng gia đình. Bạn tin cậy hầu hết máy khác, nhưng chỉ hỗ trợ kết nối inbound được chọn. |
| trusted | Tất cả máy trong mạng được tin cậy. Tùy chọn mở nhất yêu cầu sử dụng có trách nhiệm. |
Firewalld dùng hai bộ quy tắc — permanent và runtime. Quy tắc runtime hoạt động cho đến khi restart server. Mặc định, quy tắc bạn thêm vào firewalld được coi là runtime. Để thêm quy tắc permanent, phải dùng cờ –permanent. Các quy tắc này sẽ áp dụng sau khi restart server.
Cách cài đặt & bật FirewallD trong CentOS?
Trong CentOS 7/8 firewalld được cài mặc định khi cài OS. Nếu bạn gỡ firewalld và muốn cài lại, dùng package manager yum/dnf tiêu chuẩn:
# yum install firewalld -y — trên CentOS 7
# dnf install firewalld -y — trên CentOS 8

Để daemon firewalld tự khởi động, thêm vào startup:
# systemctl enable firewalld
Và khởi động nó:
# systemctl start firewalld
Kiểm tra trạng thái dịch vụ:
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) Docs: man:firewalld(1) Main PID: 13646 (firewalld) CGroup: /system.slice/firewalld.service └─13646 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid systemd[1]: Starting firewalld - dynamic firewall daemon...
Hoặc làm bằng lệnh:
# firewall-cmd --state
Lệnh firewall-cmd là front-end của firewalld cho nftables/iptables.
# firewall-cmd --state
running
Quản lý quy tắc FirewallD
Quy tắc FirewallD mặc định
Trước khi cấu hình quy tắc firewalld, bạn nên kiểm tra zone nào dùng mặc định:
# firewall-cmd --get-default-zone

Vì vừa cài firewalld và chưa cấu hình, zone mặc định là public.
Kiểm tra zone active. Chỉ có một zone giống nhau — public:
# firewall-cmd --get-active-zones
public interfaces: eth0
Như thấy, giao diện eth0 được quản lý bởi zone public.
Bạn có thể hiển thị danh sách giao diện mạng CentOS như sau:
# ip link show
hoặc:
# nmcli device status
Để xem quy tắc zone active, dùng lệnh:
# firewall-cmd --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Trong danh sách này, bạn thấy các hoạt động phổ biến liên quan đến DHCP client và SSH được thêm vào zone.
Các Zone khả dụng
Để xem danh sách tất cả zone, chạy lệnh:
# firewall-cmd --get-zones
Tôi nhận được danh sách sau:
block dmz drop external home internal public trusted work
Để xem quy tắc zone cụ thể, thêm cờ -zone vào lệnh:
# firewall-cmd --zone=home --list-all
home target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Bạn có thể xem quy tắc tất cả zone:
# firewall-cmd --list-all-zones
Cách thay đổi Default Zone?
Mặc định, tất cả giao diện mạng ở zone public, nhưng có thể chuyển sang zone bất kỳ bằng lệnh:
# firewall-cmd --zone=home —change-interface=eth0
Chỉ định zone bạn muốn sau tham số –zone=.
Để thay đổi zone mặc định thành home, chạy lệnh:
# firewall-cmd --set-default-zone=home
Cách thêm quy tắc ứng dụng trong FirewallD?
Để mở cổng cho ứng dụng, bạn có thể thêm dịch vụ như ngoại lệ. Đây là cách hiển thị danh sách dịch vụ có sẵn:
# firewall-cmd --get-services

Đầu ra sẽ chứa nhiều dịch vụ. Thông tin chi tiết về dịch vụ chứa trong file XML của nó. Các file này nằm trong /usr/lib/firewalld/services.
Ví dụ:
# cd /usr/lib/firewalld/services
# cat smtp.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>Mail (SMTP)</short> <description>This option allows incoming SMTP mail delivery. If you need to allow remote hosts to connect directly to your machine to deliver mail, enable this option. You do not need to enable this if you collect your mail from your ISP's server by POP3 or IMAP, or if you use a tool such as fetchmail. Note that an improperly configured SMTP server can allow remote machines to use your server to send spam.</description> <port protocol="tcp" port="25"/> </service>
File XML chứa mô tả dịch vụ, giao thức và số cổng mở trong firewalld.

Khi thêm quy tắc, bạn có thể dùng tham số –add-service để cho phép truy cập tường lửa đến dịch vụ cụ thể:
# firewall-cmd --zone=public --add-service=http
# firewall-cmd --zone=public --add-service=https
Sau khi thêm quy tắc, bạn có thể kiểm tra dịch vụ đã thêm vào zone:
# firewall-cmd --zone=public --list-services
dhcpv6-client http https ssh
Nếu muốn quy tắc vĩnh viễn, dùng tham số –permanent khi thêm.
Để xóa dịch vụ khỏi zone:
# firewall-cmd --permanent --zone=public --remove-service=http
# firewall-cmd --zone=public --permanent --list-services
dhcpv6-client https ssh test
Nếu muốn thêm dịch vụ của bạn vào ngoại lệ, bạn có thể tự tạo file XML và chỉ định dữ liệu. Bạn có thể copy dữ liệu từ dịch vụ bất kỳ và đổi tên, mô tả và số cổng.
Copy smtp.xml vào thư mục dịch vụ user:
# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services
Thay đổi mô tả dịch vụ trong file.

File XML cũng phải đổi tên (tôi đặt dịch vụ test). Sau đó restart firewalld và đảm bảo dịch vụ xuất hiện trong danh sách:
# firewall-cmd --get-services
syslog-tls telnet test tftp
Bây giờ bạn có thể thêm dịch vụ vào bất kỳ zone nào:
# firewall-cmd --zone=public --add-service=test --permanent
# firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http https ssh test
Nếu không tìm thấy dịch vụ trong danh sách, bạn có thể mở cổng muốn trong firewalld bằng lệnh:
# firewall-cmd --zone=public —add-port=77/tcp — mở cổng TCP 77
# firewall-cmd --zone=public —add-port=77/udp — mở cổng UDP 77
# firewall-cmd --zone=public —add-port=77-88/udp — mở dải cổng UDP 77-88
# firewall-cmd --zone=public —list-ports — hiển thị danh sách cổng cho phép
Để chặn/cho phép yêu cầu ICMP:
# firewall-cmd --zone=public --add-icmp-block=echo-reply
# firewall-cmd --zone= public --remove-icmp-block=echo-reply
Để xóa cổng thêm:
# firewall-cmd --zone=public —remove-port=77/udp — xóa quy tắc runtime cho cổng UDP 77
# firewall-cmd --permanent --zone=public —remove-port=77/udp — xóa quy tắc permanent

Cách tạo Zone mới trong FirewallD?
Bạn có thể tạo zone riêng (sẽ gọi our):
# firewall-cmd --permanent --new-zone=our
Sau khi tạo zone mới, như sau khi tạo dịch vụ, bạn cần restart firewalld:
# firewall-cmd --reload
# firewall-cmd --get-zones
block dmz drop external home internal our public trusted work
Zone our có sẵn. Bạn có thể thêm dịch vụ hoặc mở cổng.
Firewalld: Cách chặn địa chỉ IP & tạo ngoại lệ
Bạn có thể thêm địa chỉ IP tin cậy vào ngoại lệ firewalld hoặc chặn IP không mong muốn.
Để thêm địa chỉ IP (ví dụ 8.8.8.8) vào ngoại lệ trên server dùng firewalld, chạy lệnh:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.8.8" accept'
Kiểm tra zone và đảm bảo địa chỉ IP đã thêm vào ngoại lệ trong rich-rules:
# firewall-cmd --zone=public --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept
Để chặn địa chỉ IP, thay accept bằng reject:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.4.4" reject'
# firewall-cmd --zone=public --list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http https ssh test ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="8.8.8.8" accept rule family="ipv4" source address="8.8.4.4" reject
Bạn có thể cho phép dịch vụ chấp nhận yêu cầu từ IP cụ thể:
#firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" service name="https" accept'
Nếu muốn nhanh chóng chặn tất cả yêu cầu đến server, dùng lệnh panic:
# firewall-cmd --panic-on
Bạn có thể tắt panic mode bằng lệnh:
# firewall-cmd --panic-off
Hoặc bằng cách restart server.
Bạn có thể khóa cấu hình firewalld để dịch vụ local với quyền root không thể thay đổi quy tắc bạn tạo:
# firewall-cmd --lockdown-on
Để tắt lockdown mode:
# firewall-cmd --lockdown-off
Cấu hình Port Forwarding với FirewallD
Bạn có thể tạo quy tắc chuyển tiếp cổng trong firewalld. Để forward TCP port 443 sang 9090:
# firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=9090 --permanent
Trong Windows bạn có thể cấu hình port forwarding dùng netsh.
Để xóa quy tắc port forwarding:
# firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=9090