Security

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 root hoặ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 firewalld nế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 ruleset và 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 accept cho 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/second giớ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.

Lưu ý: Nếu khóa mình ngoài, hãy dùng tính năng VNC/console từ trang quản trị VPS của nhà cung cấp để sửa file cấu hình. Dịch vụ thuê VPS Linux tại thueVPS có sẵn console truy cập từ xa để xử lý các trường hợp này.

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

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.