Tường lửa trên Linux: ufw và firewalld

Nguyên tắc duy nhất cần nhớ: chặn hết, rồi chỉ mở đúng cổng cần thiết. Mọi cổng đang mở mà bạn không biết dùng để làm gì đều là một cánh cửa bỏ ngỏ.

Trước tiên: xem đang mở những gì

sudo ss -tulpn

Cột Local Address cho biết dịch vụ lắng nghe ở đâu. 127.0.0.1:3306 là chỉ nghe nội bộ (an toàn), còn 0.0.0.0:3306 là mở ra toàn Internet.

ufw — Ubuntu, Debian

sudo apt install ufw

sudo ufw default deny incoming      # chặn mọi kết nối vào
sudo ufw default allow outgoing     # cho phép đi ra

sudo ufw allow 22/tcp               # SSH — LÀM TRƯỚC TIÊN
sudo ufw allow 80,443/tcp           # web

sudo ufw enable
sudo ufw status verbose

Mở cổng SSH trước khi bật tường lửa. Quên bước này là mất luôn quyền truy cập máy chủ từ xa.

Giới hạn theo nguồn

# Chỉ cho phép SSH từ dải mạng văn phòng
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp

# Chỉ cho phép một IP truy cập MySQL
sudo ufw allow from 10.0.0.5 to any port 3306 proto tcp

# Chống dò mật khẩu SSH ở mức tường lửa
sudo ufw limit 22/tcp

Xóa quy tắc

sudo ufw status numbered
sudo ufw delete 3

firewalld — RHEL, Rocky, AlmaLinux

sudo systemctl enable --now firewalld

sudo firewall-cmd --state
sudo firewall-cmd --list-all

# Mở dịch vụ (nhớ --permanent để giữ sau reboot)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

Thiếu --permanent thì quy tắc biến mất sau khi khởi động lại; thiếu --reload thì quy tắc vừa thêm chưa có hiệu lực. Cần cả hai.

Giới hạn theo IP với rich rule

sudo firewall-cmd --permanent --add-rich-rule=\
'rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload

Đừng quên tầng phía trên

Tường lửa của nhà cung cấp đám mây (Security Group của AWS, firewall của DigitalOcean) chạy trước khi gói tin tới máy chủ. Nếu mở cổng ở ufw mà vẫn không truy cập được, hãy kiểm tra tầng đó.

Kiểm chứng từ bên ngoài

nmap -Pn may-chu-cua-ban     # chạy từ MỘT MÁY KHÁC

Chỉ quét máy chủ của chính bạn. Kết quả lý tưởng cho một web server: đúng ba cổng 22, 80, 443 — không hơn.

Lên đầu trang