Chặn IP Quốc gia trên Proxmox VE bằng IPSet: Tối ưu Firewall và Hiệu suất

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Chặn đứng hàng nghìn cuộc tấn công Brute-force chỉ trong 5 phút

Nếu bạn đang mở port SSH hoặc Web cho cụm Proxmox ra Internet, hãy thử kiểm tra log tại /var/log/auth.log. Bạn sẽ thấy hàng tá IP lạ đang liên tục “mò” mật khẩu mỗi phút. Lab cá nhân của mình với 12 VM từng ghi nhận hơn 5.000 nỗ lực đăng nhập thất bại chỉ trong một đêm, chủ yếu đến từ các dải IP mà mình chẳng bao giờ có người dùng ở đó.

Việc tạo thủ công hàng nghìn rule firewall là nhiệm vụ bất khả thi. Đó là lý do bạn cần IPSet. Thay vì ép CPU so khớp gói tin với 1.000 dòng rule riêng biệt, IPSet gom tất cả vào một danh sách duy nhất. Nhờ cơ chế bảng băm (hash table) trong nhân Linux, việc kiểm tra một IP có nằm trong danh sách đen hay không diễn ra gần như tức thì, bất kể danh sách đó lớn đến mức nào.

Quick Start: Kích hoạt Firewall và tạo IPSet cơ bản

Trước khi tự động hóa, chúng ta cần hiểu cấu trúc firewall của Proxmox. Hệ thống này quản lý theo 3 tầng: Datacenter (Tổng), Node (Máy chủ vật lý) và VM/CT (Máy ảo/Container).

Bước 1: Bật Firewall cấp Datacenter

  1. Truy cập Proxmox Web UI.
  2. Chọn Datacenter > Firewall > Options.
  3. Thiết lập Firewall sang Yes.

Cảnh báo: Hãy tạo ngay một rule ACCEPT cho port 8006 và 22 từ IP nội bộ của bạn trước khi nhấn Save. Nếu không, bạn sẽ tự khóa chính mình khỏi server.

Bước 2: Khởi tạo IPSet

Tại mục Datacenter > Firewall > IPSet, nhấn Create. Đặt tên là blacklist_country. Đây sẽ là “thùng chứa” các dải IP mà chúng ta muốn chặn sau này.

Bước 3: Áp dụng Rule chặn

Vào Datacenter > Firewall, chọn Add với thông số:

  • Direction: in
  • Action: DROP
  • Source: +blacklist_country (Dấu cộng là bắt buộc để Proxmox hiểu đây là một danh sách IPSet).
  • Enable: Tích chọn.

Tại sao IPSet lại vượt trội hơn Rule thông thường?

Khi dùng rule iptables truyền thống, hệ thống kiểm tra gói tin theo thứ tự từ trên xuống. Nếu bạn chặn 5.000 dải IP, gói tin hợp lệ thứ 5.001 sẽ phải đi qua 5.000 lần so sánh. Điều này gây lãng phí tài nguyên CPU và tăng độ trễ mạng (latency).

Với IPSet, Proxmox sử dụng độ phức tạp thuật toán O(1). Dù danh sách của bạn có 10 hay 100.000 IP, thời gian xử lý vẫn không đổi. Đây là cách tốt nhất để bảo vệ hệ thống mà vẫn giữ được băng thông tối đa.

Tự động hóa chặn GeoIP bằng Script

Copy-paste hàng nghìn dòng CIDR từ IPDeny vào giao diện web là cực hình. Mình thường dùng script để lấy danh sách IP của một quốc gia (ví dụ: Trung Quốc – CN, hoặc Nga – RU) và đẩy trực tiếp vào Proxmox qua công cụ pvesh.

#!/bin/bash
# Tên IPSet đã tạo trên giao diện
IPSET_NAME="blacklist_cn"
COUNTRY_CODE="cn"

# Tải danh sách dải IP mới nhất
curl -s -o /tmp/${COUNTRY_CODE}.zone http://www.ipdeny.com/ipblocks/data/countries/${COUNTRY_CODE}.zone

# Đọc từng dòng và đẩy vào IPSet của Datacenter
while read -r line; do
    pvesh create /cluster/firewall/ipset/${IPSET_NAME} --cidr "$line" > /dev/null 2>&1
done < /tmp/${COUNTRY_CODE}.zone

echo "Đã cập nhật xong danh sách chặn cho ${COUNTRY_CODE}"

Sau khi chạy, bạn sẽ thấy IPSet blacklist_cn tự động đầy ắp các dải mạng. Chỉ cần một rule DROP duy nhất trỏ vào IPSet này, mọi nỗ lực kết nối từ quốc gia đó sẽ bị từ chối ngay tại cửa ngõ.

Kinh nghiệm thực tế từ quản trị viên

1. Đừng chặn mù quáng

Nhiều người có thói quen chặn sạch các nước lạ. Tuy nhiên, nếu bạn dùng Cloudflare, việc chặn theo quốc gia ở tầng Proxmox có thể vô tình chặn luôn cả IP của Cloudflare. Hãy ưu tiên chặn ở tầng Application Proxy trước, và chỉ dùng IPSet cho các dịch vụ nhạy cảm như SSH.

2. Quy tắc ưu tiên (Priority)

Trong Proxmox, rule thực thi từ trên xuống dưới. Sai lầm chí mạng là đặt rule DROP ở dưới các rule ACCEPT. Hãy luôn ghi nhớ: Chặn trước, cho phép sau. Luôn đặt các rule IPSet ở vị trí Sequence 0 hoặc 1.

3. Sử dụng Security Groups cho nhiều VM

Nếu quản lý hàng chục VM, đừng cấu hình firewall cho từng cái. Hãy tạo một Security Group (ví dụ: Web-Protection), thêm rule IPSet vào đó, rồi gán group này cho toàn bộ VM. Khi cần cập nhật, bạn chỉ cần sửa một nơi duy nhất.

4. Giám sát Log thường xuyên

Đừng chặn rồi bỏ mặc. Hãy bật Log mức độ info trên rule DROP. Kiểm tra tại Firewall > Log giúp bạn biết mình có đang chặn nhầm khách hàng tiềm năng hay không, hoặc nhận diện được các đợt tấn công mới để kịp thời ứng phó.

Lời kết

Sử dụng IPSet là cách chuyên nghiệp để biến Proxmox thành một lá chắn vững chắc. Nó không chỉ bảo mật tốt hơn mà còn tối ưu hiệu suất cho phần cứng. Đừng quên thiết lập Cronjob để chạy script cập nhật định kỳ hàng tuần, vì dải IP của các quốc gia luôn biến động theo thời gian.

Share: