Hệ điều hành (OS), Linux

Hướng dẫn cơ bản về Firewalld trong Linux CentOS 9

Bài viết này sẽ giúp bạn biết được cơ bản về cách cài đặt, cấu hình, và quản lý NAT với firewalld trên CentOS 9, cùng với các giải thích cho mỗi một dòng lệnh để giúp các bạn dễ hiểu nhất có thể.

Lưu ý: Hãy thay đổi IP của Linux Server theo hệ thống mạng của bạn, và hãy tắt SELinux trong Linux server do SELinux có thể chặn forwarding .

#firewalld #CentOS9 #LinuxSecurity #sysadmin #NAT #ZoneBasedFirewall


1. Firewalld là gì?

  • Frontend cho nftables (hoặc iptables)

  • Quản lý tường lửa theo zones, services, rich rules

  • Cho phép thay đổi runtime mà không cần restart dịch vụ


️ 2. Cài đặt & khởi động Firewalld

Trong hệ điều hành Centos 9 hoặc Redhat 9, firewalld đã được setup sẵn theo mặc định. Trong trường hợp nếu server chưa được setup, bạn hãy sử dụng lệnh sau để cài đặt firewalld:

sudo dnf install firewalld -y

Giải thích: Cài gói firewalld sử dụng lệnh DNF (trình quản lý gói mặc định trong CentOS 9).

sudo systemctl enable --now firewalld

Giải thích: Kích hoạt (enable) và khởi động (--now) dịch vụ ngay lập tức.

sudo firewall-cmd --state

Giải thích: Kiểm tra trạng thái — nếu trả về kết quả làrunning, tường lửa của bạn đã sẵn sàng để sử dụng.


3. Các khái niệm Zone, Service, Port

  • Zone: Nhóm quy tắc (rule) cho interface hay card mạng (public, internal, external…)

  • Service: Tên dịch vụ đã định nghĩa sẵn cổng/protocol (ssh, http, https…)

  • Port: Sử dụng khi không có service, format port/protocol (80/tcp, 53/udp)

Xem zone đang active:

sudo firewall-cmd --get-active-zones

Giải thích: Liệt kê zone + card mạng đang được tường lửa quản lý.

Xem danh sách các services được firewallD hỗ trợ:

firewall-cmd --get-services

Giải thích: Giúp gợi ý tên dịch vụ mà bạn có thể dùng cho việc cấu hình mở đóng các dịch vụ.


4. Mở/Đóng các dịch vụ & cổng trên server

4.1 Mở dịch vụ (service name) để cho phép các máy clients từ bên ngoài truy cập vào dịch vụ của server:

sudo firewall-cmd --permanent --add-service=ssh

Giải thích: Add thêm quy tắc mở SSH (port 22/tcp) vào cấu hình vĩnh viễn.

sudo firewall-cmd --permanent --add-service=http

Giải thích: Mở HTTP (port 80/tcp).

4.2 Mở port khi bạn không nhớ service name

sudo firewall-cmd --permanent --add-port=8080/tcp

Giải thích: Mở port 8080 qua giao thức TCP.

4.3 Reload để áp dụng thay đổi

sudo firewall-cmd --reload

Giải thích: Nạp lại toàn bộ cấu hình permanent vào runtime.

4.4 Kiểm tra lại cấu hình tường lửa, chạy lần lượt các lệnh sau:

firewall-cmd --list-services
firewall-cmd --list-ports

Giải thích: Xem danh sách các services và ports hiện đang mở trong tường lửa.


️ 5. Rich Rules – Quy tắc nâng cao cho firewalld

Xóa quyền truy cập SSH hiện tại (mở toàn bộ) nếu :

sudo firewall-cmd --permanent --remove-service=ssh

Chỉ cho phép một máy client có địa chỉ IP 192.168.146.11 được phép truy cập vào dịch vụ SSH của server, còn lại tất cả các máy clients khác với địa chỉ IP khác bị chặn/cấm truy cập vào dịch vụ SSH của server:

sudo firewall-cmd --permanent \
  --add-rich-rule='rule family="ipv4" \
      source address="192.168.146.11" \
service name="ssh" accept'

Giải thích:source address lọc theo IP, service name="ssh"  dịch vụ SSH, acceptcho phép từ bên ngoài truy cập vào server qua dịch vụ ssh.

Reload lại dịch vụ để áp dụng thay đổi cấu hình:

sudo firewall-cmd --reload

6. Cấu hình NAT (Masquerade)

️ Giả định cấu hình mạng cho server:

  • Card mạng 1 (ra Internet): ens160 – IP: 192.168.146.11
  • Card mạng 2 (nội bộ): ens224 – IP: 172.16.10.1

    Sơ đồ hệ thống mạng:

6.1 Gán zone cho interface (card mạng):

sudo firewall-cmd --permanent \
--zone=external --add-interface=ens160

Giải thích: Gán card mạng external ra Internet vào zone external :

sudo firewall-cmd --permanent \
--zone=internal --add-interface=ens224

Giải thích: Gán card mạng LAN vào zone internal.

6.2 Bật Masquerade (SNAT) trên zone external:

sudo firewall-cmd --permanent \
  --zone=external --add-masquerade

Giải thích: Bật NAT, “ngụy trang” IP LAN thành IP 192.168.146.11 khi đi ra bên ngoài.

Cho phép Forward tất cả các gói tin từ Internal (mạng Lan) sang external để đi ra ngoài:

sudo firewall-cmd --permanent --zone=internal --set-target=ACCEPT

6.3 Kích hoạt IP forwarding

Tạm thời:

sudo sysctl -w net.ipv4.ip_forward=1

Bật chuyển tiếp gói tin IPv4 ngay lập tức.

Vĩnh viễn:

echo "net.ipv4.ip_forward=1" \
  | sudo tee /etc/sysctl.d/99-ipforward.conf
sudo sysctl --system

Giải thích: Lưu cấu hình, tự động áp dụng sau reboot.

6.4 Reload cấu hình

sudo firewall-cmd --reload

Giải thích: Áp dụng toàn bộ thay đổi đã được cấu hình của tường lửa.

6.5 Kiểm tra NAT

firewall-cmd --zone=external --query-masquerade

Giải thích: Xác nhận trả về kết quả là masquerade: yes  có nghĩa là masquerade đang hoạt động.

sudo iptables -t nat -L POSTROUTING

Giải thích: Nếu backend là iptables, xem rule MASQUERADE.

Kiểm tra NAT của FirewallD đã được cấu hình thành công hay chưa từ một máy client trong mạng nội bộ LAN:

ping 8.8.8.8 # Từ 1 máy trong mạng 172.16.10.0/24

Nếu ping được thành công ra bên ngoài internet → NAT hoạt động đúng.

Firewalld không chỉ là tường lửa đơn giản, mà hoàn toàn có thể dùng như một tường lửa mạng LAN chuyên nghiệp, tương tự như:

  • Router chia sẻ truy cập internet cho hệ thống mạng LAN

  • Firewall kiểm soát phân vùng truy cập

  • Hệ thống kiểm soát NAT và truy cập dịch vụ

Đặt lại Firewalld về trạng thái mặc định (Reset Firewalld)

Nếu bạn đã test thử nhiều cấu hình, thêm nhiều rule, port, zone… và muốn xóa sạch tất cả cấu hình của firewalld, hãy sử dụng lần lượt các lệnh sau:

 sudo firewall-cmd --permanent --reload
 sudo rm -rf /etc/firewalld
 sudo dnf reinstall firewalld -y
 sudo systemctl restart firewalld

Giải thích:

  • rm -rf /etc/firewalld: Xóa toàn bộ cấu hình zones, services, policies, rich rules…

  • dnf reinstall firewalld: Cài lại gói và khôi phục thư mục /etc/firewalld mặc định

  • restart firewalld: Khởi động lại tường lửa với cấu hình mặc định


✅ Kiểm tra lại sau khi reset firewalld về mặc định

sudo firewall-cmd --get-default-zone
sudo firewall-cmd --list-all

Kết quả mong muốn:

  • Zone mặc định làpublic

  • Chỉ có ssh được mở, không còn cổng nào khác, không còn rich-rule hay masquerade.


✅ Xóa masquerade, port, rich-rules thủ công (nếu cần)

# Xóa port
sudo firewall-cmd --permanent --remove-port=8080/tcp
# Xóa service
sudo firewall-cmd --permanent --remove-service=http
# Xóa rich-rule
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" service name="ssh" drop'
# Reload để áp dụng
sudo firewall-cmd --reload

Kết luận

  • Khi cấu hình firewall bị rối, hãy reset sạch sẽ rồi cấu hình lại từ đầu.

  • Việc hiểu rõ cách Firewalld hoạt động theo zone, service, rich-rule, masquerade sẽ giúp bạn xử lý dễ dàng các tình huống thực tế cho server của bạn.


✅ 7. Tổng kết lệnh thường dùng

Chức năng Lệnh (tùy chọn)
Cài & khởi động dnf install firewalld → systemctl enable --now
Kiểm tra trạng thái firewall-cmd --state / get-active-zones
Mở service --add-service=<name>
Mở port `–add-port=<port>/tcp
Thêm rich rule --add-rich-rule='rule …'
Bật NAT (Masquerade) --add-masquerade
Gán zone cho interface --zone=<zone> --add-interface=<if>
Bật IP Forward sysctl -w net.ipv4.ip_forward=1 + sysctl.d file
Reload config firewall-cmd --reload
Xem config zone --list-all / --list-services / --list-ports / --list-rich-rules

❓ Lưu ý & Best practices

  • Luôn dùng --permanent + --reload khi muốn lưu rule.

  • Ưu tiên service trước, chỉ dùng port khi cần.

  • Kiểm tra kỹ zone gán chính xác interface.

  • Cẩn thận với rich rules phức tạp, dễ nhầm lẫn thứ tự xử lý.

  • Khi debug, dùng firewall-cmd --complete-reload hoặc reset zone nếu cần.


Với bài hướng dẫn này, bạn đã có toàn bộ công thức để triển khai tường lửa cơ bản và NAT trong CentOS 9, cùng với các giải thích cho mỗi lệnh một cách dễ hiểu. Chúc bạn thành công!

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