Nếu quản lý VPS dùng DirectAdmin, hẳn bạn đã quen với ConfigServer Security & Firewall (CSF) — công cụ firewall miễn phí giúp chặn brute-force, lọc port và ghi log tấn công. Nhưng có một tính năng mạnh mẽ mà nhiều người bỏ sót: chặn truy cập theo quốc gia. Khi phát hiện phần lớn bot quét port, spam comment hay tấn công SSH đến từ một vài quốc gia nhất định, việc chặn gọn cả dải IP của quốc gia đó sẽ giảm tải đáng kể cho server và giúp log “sạch” hơn hẳn.
Bài viết này Hoidapwp sẽ hướng dẫn bạn chặn quốc gia trên DirectAdmin bằng CSF, dùng database GeoIP miễn phí của DB-IP, kèm script tự động cập nhật hàng tháng qua cronjob để không phải làm thủ công.
CSF chặn theo quốc gia hoạt động như thế nào?
CSF cần biết “IP này thuộc quốc gia nào” — thông tin đó nằm trong một GeoIP database. CSF mặc định dùng MaxMind, nhưng DB-IP có bản Country Lite miễn phí, cập nhật hàng tháng, hoàn toàn đủ dùng. CSF sẽ nạp database vào ipset (cơ chế lọc IP siêu nhanh của Linux), tạo các chain như cc_cn, cc_ru… tương ứng từng quốc gia bạn muốn chặn, rồi áp luật từ chối kết nối ngay ở tầng firewall.
Bước 1 – Chuẩn bị GeoIP database từ DB-IP
DB-IP Country Lite là gì?
DB-IP Country Lite là cơ sở dữ liệu IP → quốc gia được DB-IP phát hành miễn phí mỗi tháng. File ở định dạng CSV nén .csv.gz, đặt tên theo năm-tháng:
https://download.db-ip.com/free/dbip-country-lite-YYYY-MM.csv.gz
Ví dụ, file của tháng 01/2026 là dbip-country-lite-2026-01.csv.gz. Mỗi dòng trong file có dạng ip_start,ip_end,country_code — dải IP bắt đầu, dải IP kết thúc và mã quốc gia ISO 2 chữ cái.
Thư mục chứa database trên CSF
CSF lưu database GeoIP tại /var/lib/csf/Geo/. Script ở bước sau sẽ tự tải file DB-IP mới nhất của tháng hiện tại về đúng thư mục này.

Bước 2 – Tạo script tự động tải và cập nhật DB-IP
DB-IP phát hành file mới mỗi tháng nên bạn cần cập nhật định kỳ. Tạo script sau tại /usr/local/bin/update-csf-geoip.sh:
#!/bin/bash
# update-csf-geoip.sh
# Script tai DB-IP Country Lite CSV hang thang va cap nhat cho CSF
YEAR=$(date +%Y)
MONTH=$(date +%m)
URL="https://download.db-ip.com/free/dbip-country-lite-${YEAR}-${MONTH}.csv.gz"
DEST="/var/lib/csf/Geo/dbip-country-lite.csv.gz"
# Tai file DB-IP
wget -O "$DEST" "$URL"
# Giai nen thanh CSV
gunzip -f "$DEST"
# Reload CSF de ap dung du lieu moi
csf -r
Script tự lấy năm-tháng hiện tại nên mỗi lần chạy đều tải đúng file mới nhất. Cấp quyền thực thi:
chmod +x /usr/local/bin/update-csf-geoip.sh
Tiếp theo, đặt cronjob để script chạy tự động lúc 3 giờ sáng ngày mùng 1 hàng tháng. Mở crontab:
crontab -e
Thêm dòng sau rồi lưu:
0 3 1 * * /usr/local/bin/update-csf-geoip.sh > /dev/null 2>&1
Bước 3 – Cấu hình trong csf.conf
Mở file cấu hình chính của CSF:
nano /etc/csf/csf.conf
Tìm và chỉnh các tham số sau:
# Bat ipset de dung GeoIP LF_IPSET = "1" # Thu muc chua GeoIP database GEOIP_DB = "/var/lib/csf/Geo/" # Chan quoc gia (ma ISO 2 chu cai) CC_DENY = "CN,RU,IR" # Cho phep quoc gia (neu muon whitelist) # CC_ALLOW = "VN,US" # Chan quoc gia theo port (tuy chon) # CC_DENY_PORTS = "CN:22,25" # Cho phep quoc gia theo port (tuy chon) # CC_ALLOW_PORTS = "US:22,80,443" # Tat che do test TESTING = "0"
Giải thích các tham số quan trọng
LF_IPSET
Bật dùng ipset — bắt buộc nếu muốn xài tính năng GeoIP của CSF, vì danh sách IP theo quốc gia rất lớn, iptables thường không xử lý nổi.
CC_DENY / CC_ALLOW
CC_DENY là danh sách quốc gia bị chặn hoàn toàn, nhập mã ISO 2 chữ cái cách nhau bằng dấu phẩy (ví dụ CN,RU,IR). CC_ALLOW là whitelist — khi bật, chỉ các quốc gia trong danh sách mới được phép kết nối.
CC_DENY_PORTS / CC_ALLOW_PORTS
Biến thể “nhẹ” hơn: chỉ chặn/cho phép quốc gia trên những port nhất định, ví dụ CN:22,25 là chặn Trung Quốc truy cập SSH (22) và SMTP (25), các dịch vụ khác vẫn mở bình thường.

Bước 4 – Reload CSF và kiểm tra hoạt động
Sau khi lưu cấu hình, reload CSF để áp dụng:
csf -r
Kiểm tra xem ipset đã có dữ liệu quốc gia chưa:
ipset list
Nếu thành công, bạn sẽ thấy các chain cc_cn, cc_ru… với hàng nghìn entries (dải IP theo quốc gia). Đồng thời, mở log của CSF để xác nhận GeoIP đã load:
tail -f /var/log/lfd.log
Một số lưu ý quan trọng
File CSV cần convert sang CIDR
DB-IP CSV có dạng ip_start,ip_end,country_code, còn CSF cần định dạng CIDR. CSF có sẵn công cụ /usr/local/csf/bin/csfgeoip để chuyển đổi. Nếu các chain quốc gia vẫn trống sau khi reload, hãy chạy thủ công:
/usr/local/csf/bin/csfgeoip
Chặn toàn quốc gia là con dao hai lưỡi
Chặn gọn cả quốc gia có thể vô tình loại bỏ cả người dùng hợp pháp (khách hàng, đối tác). Nếu server phục vụ khách Việt Nam, hãy cân nhắc dùng CC_DENY_PORTS để chỉ chặn các port nhạy cảm (SSH, mail…) thay vì chặn toàn bộ.
Theo dõi định kỳ
Đừng quên kiểm tra cronjob tháng đầu tiên xem file DB-IP có được tải về và CSF có reload thành công không — chỉ cần một lần chạy lỗi là database sẽ cũ dần.
Tóm lại, chỉ với vài bước: chuẩn bị database DB-IP, tạo script cronjob tự động cập nhật, cấu hình csf.conf rồi reload — VPS DirectAdmin của bạn đã có thêm một lớp bảo vệ hiệu quả trước lưu lượng xấu từ các quốc gia không mong muốn.
👉 Cần VPS để thực hành? Đăng ký VPS BNIX tại đây: https://my.bnix.one/aff.php?aff=82
🏢 Chuyên thiết kế web cho doanh nghiệp và cá nhân
🤖 Giải pháp tự động hóa cho Doanh nghiệp và cá nhân
📞 0925045760 → https://zalo.me/0925045760
🌐 thietkewebdian.com → https://thietkewebdian.com
