Triển khai tường lửa và chống DDoS hiệu quả cho VPS

SSH vào VPS và thấy CPU nhảy vọt lên rất cao trong khi số kết nối SYN chưa hoàn tất tăng không kiểm soát là dấu hiệu kinh điển của một đợt tấn công SYN flood. Tường lửa của nhà cung cấp chỉ chặn được phần nào; lớp tự vệ đầu tiên phải nằm ngay trên chính VPS của bạn. Bài này hướng dẫn thiết lập tường lửa và chống DDoS cho VPS Linux với nftables, firewalld, CrowdSec, kèm cách kiểm tra hiệu quả sau khi cấu hình.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 LTS hoặc AlmaLinux 9 với quyền
roothoặc user sudo. - Địa chỉ IP tĩnh của VPS. Nếu dùng VPS Linux tại thueVPS, bạn có 1 IPv4 riêng thuộc dải Việt Nam, thuận tiện cho việc giới hạn truy cập theo IP.
- Hiểu cơ bản về SSH và các dịch vụ đang chạy (nginx, mysql, docker) để tránh khóa chính mình khi siết firewall.
Vì sao cần hai lớp phòng thủ: kernel và ứng dụng
Tấn công DDoS có nhiều dạng. Lớp mạng như SYN flood, UDP flood đánh vào ngăn xếp TCP/IP của kernel, làm cạn bảng kết nối và ngốn CPU. Lớp ứng dụng như HTTP flood gửi hàng nghìn request giả tới nginx hoặc PHP-FPM. Một tường lửa tĩnh chỉ mở/đóng port không thể tự thích ứng với kịch bản này.
Vì vậy chiến lược đúng gồm hai tầng: dùng nftables hoặc firewalld để giới hạn tốc độ kết nối, chặn gói tin bất thường từ kernel; sau đó đặt CrowdSec ở tầng ứng dụng để học hành vi và tự động ban IP tấn công. Cách làm này giúp VPS trụ qua các đợt tấn công quy mô vừa, trước khi cần tới dịch vụ chống DDoS của nhà mạng.
Tóm tắt nhanh những việc sẽ làm:
- Cài đặt và cấu hình
nftablesđể chặn SYN flood và giới hạn kết nối. - Kích hoạt
firewalldnếu dùng AlmaLinux, hoặc dùng thẳng nftables trên Ubuntu. - Cài CrowdSec để tự động phát hiện và ban IP tấn công.
- Kiểm tra bằng lệnh
ss,nft list rulesetvà mô phỏng tấn công nhẹ.
Bước 1 - Cài đặt và kích hoạt nftables trên Ubuntu 24.04
nftables là công cụ thay thế iptables, mặc định có sẵn trong kernel Linux hiện đại và được khuyến nghị dùng thay vì iptables trên các bản phân phối mới. Trên Ubuntu 24.04, cài đặt gói và kích hoạt service:
sudo apt update
sudo apt install -y nftables
sudo systemctl enable --now nftables
sudo systemctl status nftables
Output mong đợi là active (running). Bây giờ tạo file cấu hình chính tại /etc/nftables.conf. Trước tiên, kiểm tra interface mạng chính:
ip -br link show
Thông thường interface là eth0 hoặc ens3. Ghi lại tên này, sẽ dùng trong các quy tắc bên dưới.
Bảo mật SSH trước khi chạy firewall: nếu chưa đổi port SSH, hãy chắc chắn quy tắc cho phép port 22 được đặt trước quy tắc drop. Cách an toàn nhất là thêm quy tắc cho phép trước, sau đó mới drop.
Bước 2 - Viết quy tắc nftables chặn SYN flood và giới hạn kết nối
Mở file cấu hình và thay nội dung bằng các quy tắc sau. Bạn cần đổi eth0 thành interface thực tế của VPS:
sudo nano /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
# Cho phép loopback
iif "lo" accept
# Cho phép SSH, HTTP, HTTPS
tcp dport { 22, 80, 443 } accept
# Cho phép các kết nối đã thiết lập
ct state established,related accept
# Chặn SYN flood: giới hạn 10 gói SYN mỗi giây
tcp flags syn tcp dport 80 limit rate 10/second accept
tcp flags syn tcp dport 443 limit rate 10/second accept
# Giới hạn số kết nối đồng thời từ một IP (80)
tcp dport 80 meter web-meter { ip saddr limit rate 20/second burst 40 packets } accept
# Drop các gói còn lại
drop
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
Giải thích các điểm chính:
policy dropở chain input nghĩa là mọi gói không khớp quy tắc nào đều bị chặn.ct state established,related acceptcho phép các gói thuộc kết nối đã được phép hoạt động, đây là nguyên tắc cơ bản của firewall stateful.limit rate 10/secondgiới hạn số gói SYN mới đến port 80/443, chặn hiệu quả SYN flood ở mức độ vừa.
Áp dụng cấu hình:
sudo nft -f /etc/nftables.conf
Nếu có lỗi cú pháp, nft sẽ báo dòng bị lỗi. Khi thành công, kiểm tra:
sudo nft list ruleset
Bạn sẽ thấy toàn bộ chain và quy tắc vừa đọc. Đừng đóng SSH session này cho tới khi chắc chắn vẫn kết nối được. Mở một terminal khác và thử SSH vào để kiểm tra.
Bước 3 - Cấu hình firewalld trên AlmaLinux 9
Nếu dùng AlmaLinux 9 hoặc Rocky Linux 9, firewalld là lựa chọn mặc định và dễ quản lý hơn. Cài đặt và kích hoạt:
sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --state
Output mong đợi là running. Thêm các dịch vụ cần thiết:
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Để chống SYN flood, tạo một rich rule giới hạn tốc độ:
sudo firewall-cmd --permanent --add-rich-rule='rule service name=http limit value="10/s" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule service name=https limit value="10/s" accept'
sudo firewall-cmd --reload
Kiểm tra danh sách quy tắc đang hoạt động:
sudo firewall-cmd --list-all
firewalld dùng backend nftables nên cũng hiệu quả tương đương, chỉ khác ở cú pháp quản lý. Với các VPS chạy WordPress, bạn có thể mở thêm port cho các plugin cache hoặc FTP nếu cần.
Bước 4 - Cài CrowdSec để tự động chặn IP tấn công
nftables xử lý tốt tấn công ở tầng mạng, nhưng HTTP flood yêu cầu phân tích hành vi. CrowdSec là giải pháp mã nguồn mở, dùng cơ chế tương tự fail2ban nhưng mạnh hơn nhờ chia sẻ danh sách IP tấn công giữa cộng đồng. Cài đặt trên Ubuntu và AlmaLinux bằng script chính thức:
curl -s https://install.crowdsec.net | sudo sh
Sau khi cài đặt, bổ sung các bộ thu thập log cho nginx và ssh:
sudo cscli collections install crowdsecurity/nginx
sudo cscli collections install crowdsecurity/ssh
sudo systemctl restart crowdsec
Kiểm tra trạng thái:
sudo cscli status
Bạn sẽ thấy danh sách các nguồn log đang được theo dõi và số lượng quyết định ban. CrowdSec tự động tạo quy tắc trong nftables để chặn IP vi phạm, thêm một lớp tự vệ quan trọng.
Để xem IP đang bị ban:
sudo cscli decisions list
IP tấn công sẽ xuất hiện với thời gian hết hạn. Mặc định CrowdSec ban trong 4 giờ, sau đó tự gỡ nếu không tái phạm. Cách tiếp cận này khác hẳn việc ban lâu dài, giảm rủi ro chặn nhầm IP dùng chung của người dùng.
Bước 5 - Kiểm tra hiệu quả cấu hình
Sau khi hoàn tất, kiểm tra hệ thống đã ở trạng thái an toàn hay chưa. Xem các kết nối hiện tại:
ss -tlnp
Output sẽ hiện các port đang listen: 22, 80, 443 (và các port khác của ứng dụng). Chỉ những port này lộ ra ngoài, còn lại đã bị chặn bởi policy drop.
Kiểm tra thống kê gói tin bị drop:
sudo nft list ruleset | grep -A2 "policy drop"
Để mô phỏng một đợt tấn công SYN nhẹ từ máy khác, dùng công cụ hping3 (chỉ nên chạy trong môi trường kiểm thử):
sudo hping3 -S -p 443 -i u1000 VPS_IP
Sau vài giây, kiểm tra lại CPU và số kết nối:
top
ss -s
Nếu cấu hình đúng, CPU không nhảy vọt và số kết nối SYN_RECV không tăng đột biến.
Xử lý các lỗi thường gặp
Lỗi 1: Mất kết nối SSH sau khi bật firewall.
Nguyên nhân do chưa cho phép port 22 trước policy drop. Dùng console truy cập từ trình quản lý VPS, sửa file /etc/nftables.conf hoặc gỡ cài đặt firewalld để khôi phục.
Lỗi 2: CrowdSec không đọc được log nginx.
Kiểm tra quyền đọc file log:
sudo tail -f /var/log/crowdsec/crowdsec.log
Thường là do nginx chạy với user www-data và file log ở /var/log/nginx/access.log. CrowdSec cần có quyền đọc, dùng lệnh journalctl để xem chi tiết nếu cần.
Lỗi 3: Quy tắc giới hạn tốc độ quá chặt chặn cả người dùng thật.
Nếu một IP nội bộ công ty (NAT) cùng lúc nhiều người truy cập, giới hạn 10 request/giây có thể quá thấp. Điều chỉnh tăng lên:
limit rate 30/second burst 100 packets
Câu hỏi thường gặp
Chống DDoS VPS bằng tường lửa có đủ không?
Tường lửa và CrowdSec đủ để xử lý các cuộc tấn công quy mô vừa ở tầng mạng và ứng dụng. Với tấn công lớn hàng trăm Gbps làm nghẽn băng thông trước cả khi tới VPS, bạn cần dịch vụ chống DDoS của nhà cung cấp hạ tầng hoặc một giải pháp proxy như Cloudflare.
Nên dùng nftables hay iptables trên Ubuntu 24.04?
Dùng nftables. iptables vẫn hoạt động nhưng là lớp tương thích, nftables là công cụ mặc định và nhận được cập nhật tính năng mới. Các bản phân phối mới như Ubuntu 24.04 và AlmaLinux 9 đều dùng nftables làm backend.
CrowdSec có thay thế hoàn toàn fail2ban không?
Được. CrowdSec xử lý tốt hơn nhờ danh sách IP tấn công được chia sẻ cộng đồng, phát hiện sớm hơn khi IP đã tấn công máy chủ khác. fail2ban vẫn dùng được nhưng thiếu tính năng chia sẻ này.
Giới hạn tốc độ SYN flood nên đặt bao nhiêu là hợp lý?
Với web server thông thường, 10-20 gói SYN mỗi giây cho một IP là hợp lý. Nếu site có nhiều người dùng từ một IP NAT, tăng lên 30-50. Thử nghiệm bằng hping3 và quan sát CPU để tinh chỉnh.
Bài viết liên quan
- 10 cách tăng cường bảo mật VPS Linux chống tấn công 2026
- Cài đặt CrowdSec chống tấn công tự động cho VPS
- Cấu hình fail2ban bảo vệ nhiều dịch vụ trên VPS
- Hướng dẫn cấu hình UFW firewall cơ bản trên Ubuntu VPS


