Quay lại danh sách
Tin tức công nghệ

Bảo mật hệ thống: Hướng dẫn cấu hình Port Knocking bằng nftables để ẩn hoàn toàn các cổng nhạy cảm trên VPS

3 tháng 6, 2026

Đặt vấn đề: Khi bảo mật mật khẩu và SSH Key là chưa đủ

Trong kỷ nguyên số, các máy chủ ảo riêng (VPS) của doanh nghiệp là mục tiêu tấn công liên tục của các bot quét tự động (scanner) và các cuộc tấn công brute-force. Thông thường, để bảo vệ cổng SSH (mặc định là 22), quản trị viên hệ thống thường chọn giải pháp đổi cổng (change port) hoặc giới hạn IP truy cập. Tuy nhiên, việc đổi cổng chỉ mang tính chất "bảo mật bằng cách che giấu" (security through obscurity) và dễ dàng bị phát hiện bởi các công cụ quét cổng chuyên dụng như Nmap.

Trong khi đó, việc giới hạn IP cố định lại không khả thi đối với các kỹ sư hệ thống thường xuyên phải di chuyển hoặc làm việc từ xa với IP động. Đây chính là lúc kỹ thuật Port Knocking trở thành giải pháp cứu cánh hoàn hảo.

Port Knocking là gì? Cơ chế hoạt động của "Tiếng gõ cửa bí mật"

Port Knocking là một phương pháp bảo mật hệ thống bằng cách đóng toàn bộ các cổng dịch vụ nhạy cảm (như SSH, RDP, Database) bằng tường lửa. Để mở một cổng, người dùng hợp lệ phải gửi một chuỗi các gói tin (TCP/UDP) đến các cổng được chỉ định sẵn theo một thứ tự và quy luật chính xác – giống như việc gõ một nhịp điệu bí mật lên cửa trước khi được cho phép vào nhà.

Khi hệ thống tường lửa nhận diện đúng chuỗi "gõ cửa", nó sẽ tự động kích hoạt một quy tắc (rule) tạm thời để mở cổng dịch vụ cho chính địa chỉ IP vừa gõ cửa trong một khoảng thời gian nhất định. Đối với bất kỳ ai khác hoặc các bot quét mạng thông thường, cổng dịch vụ đó hoàn toàn ở trạng thái Closed hoặc Filtered (không phản hồi), khiến VPS của bạn trở nên vô hình trên không gian mạng.

Tại sao nên chọn nftables thay vì iptables truyền thống?

Mặc dù iptables đã phục vụ cộng đồng Linux hàng thập kỷ, nhưng nftables là sự kế thừa hiện đại và được khuyến nghị trên các bản phân phối Linux mới như Debian 11/12, Ubuntu 22.04/24.04 LTS hay RHEL 9. Những ưu điểm vượt trội của nftables bao gồm:

  • Hiệu năng cao hơn: Giảm thiểu CPU overhead nhờ kiến trúc máy ảo (Virtual Machine) thực thi bytecode tối ưu trong nhân Linux.
  • Cú pháp rõ ràng, nhất quán: Không còn sự phân biệt phức tạp giữa iptables, ip6tables, arptables và ebtables; tất cả được hợp nhất vào một công cụ duy nhất.
  • Hỗ trợ các tập hợp dữ liệu (Sets và Maps) mạnh mẽ: Cho phép quản lý danh sách IP động và thiết lập thời gian tự động hết hạn (timeout) cực kỳ linh hoạt – tính năng cốt lõi để triển khai Port Knocking mà không cần cài đặt thêm các daemon bên thứ ba (như knockd).

Hướng dẫn chi tiết cấu hình Port Knocking bằng nftables

Trong bài viết này, chúng ta sẽ thiết lập một kịch bản Port Knocking cơ bản nhưng cực kỳ an toàn: Ẩn cổng SSH (22). Người dùng cần "gõ" lần lượt vào 3 cổng UDP: 7000, 8000, và 9000. Mỗi cú gõ phải diễn ra trong vòng 10 giây sau cú gõ trước. Khi hoàn tất, cổng SSH sẽ mở ra cho IP đó trong vòng 30 giây để thiết lập kết nối.

Bước 1: Cài đặt và kích hoạt nftables

Trước tiên, hãy đảm bảo hệ thống của bạn đã cài đặt nftables và dừng các dịch vụ tường lửa khác như UFW hoặc Firewalld để tránh xung đột.

# Trên Ubuntu/Debian
sudo apt update && sudo apt install nftables -y

# Dừng và vô hiệu hóa UFW nếu có
sudo systemctl stop ufw
sudo systemctl disable ufw

# Kích hoạt nftables khởi động cùng hệ thống
sudo systemctl enable nftables
sudo systemctl start nftables

Bước 2: Xây dựng bộ quy tắc (Ruleset) cho Port Knocking

Tạo hoặc chỉnh sửa tệp cấu hình chính của nftables tại đường dẫn /etc/nftables.conf. Sử dụng trình soạn thảo văn bản như nano hoặc vim:

sudo nano /etc/nftables.conf

Sao chép và dán toàn bộ nội dung cấu hình dưới đây vào tệp:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    # Định nghĩa các tập hợp (sets) để lưu trạng thái gõ cửa kèm thời gian hết hạn (timeout)
    set knock_stage1 {
        type ipv4_addr
        flags timeout
    }
    set knock_stage2 {
        type ipv4_addr
        flags timeout
    }
    set knock_secure_ssh {
        type ipv4_addr
        flags timeout
    }

    chain input {
        type filter hook input priority filter; policy drop;

        # 1. Cho phép các kết nối đã được thiết lập hoặc liên quan
        ct state established,related accept

        # 2. Cho phép giao tiếp loopback nội bộ
        iifname "lo" accept

        # 3. Cho phép Ping (ICMP) - Tùy chọn, có thể loại bỏ nếu muốn ẩn hoàn toàn
        icmp type echo-request accept

        # 4. Xử lý logic Port Knocking
        # Bước gõ 1: Gõ vào cổng UDP 7000 -> Ghi nhận IP vào knock_stage1 (hết hạn sau 10 giây)
        udp dport 7000 add @knock_stage1 { ip saddr timeout 10s } reject

        # Bước gõ 2: Nếu IP đã ở stage1 và gõ tiếp vào UDP 8000 -> Chuyển sang knock_stage2
        udp dport 8000 ip saddr @knock_stage1 add @knock_stage2 { ip saddr timeout 10s } reject

        # Bước gõ 3: Nếu IP đã ở stage2 và gõ tiếp vào UDP 9000 -> Cấp quyền truy cập SSH trong 30 giây
        udp dport 9000 ip saddr @knock_stage2 add @knock_secure_ssh { ip saddr timeout 30s } reject

        # 5. Kiểm tra quyền truy cập SSH
        # Nếu IP nằm trong danh sách knock_secure_ssh, cho phép truy cập vào cổng TCP 22
        tcp dport 22 ip saddr @knock_secure_ssh accept
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}
Lưu ý quan trọng: Cuối mỗi dòng lệnh xử lý cổng gõ (7000, 8000, 9000), chúng ta sử dụng hành động reject thay vì drop. Điều này giúp gói tin bị từ chối ngay lập tức, ngăn kẻ quét cổng nhận biết rằng hệ thống đang ghi nhận thông tin, đồng thời tối ưu hóa thời gian phản hồi cho Client hợp lệ.

Bước 3: Áp dụng và kiểm tra cấu hình

Sau khi lưu tệp cấu hình, tiến hành kiểm tra cú pháp để đảm bảo không có lỗi xảy ra trước khi áp dụng thực tế:

sudo nft -c -f /etc/nftables.conf

Nếu lệnh trên không trả về lỗi, hãy áp dụng cấu hình mới bằng cách khởi động lại dịch vụ nftables:

sudo systemctl restart nftables

Tại thời điểm này, nếu bạn mở một terminal mới và cố gắng kết nối SSH thẳng vào VPS mà không gõ cửa, kết nối sẽ bị từ chối hoàn toàn.

Kiểm tra thực tế: Cách "gõ cửa" từ máy trạm (Client)

Để thực hiện chuỗi gõ cửa từ máy tính cá nhân của bạn (Linux hoặc macOS), bạn có thể sử dụng công cụ chuẩn nc (netcat). Hãy chạy chuỗi lệnh sau theo đúng thứ tự một cách nhanh chóng:

nc -u -z -w1 [IP_CỦA_VPS] 7000
nc -u -z -w1 [IP_CỦA_VPS] 8000
nc -u -z -w1 [IP_CỦA_VPS] 9000

Giải thích tham số: -u chỉ định giao thức UDP, -z cấu hình netcat chỉ gửi gói tin mà không đợi dữ liệu phản hồi, và -w1 giới hạn thời gian timeout là 1 giây.

Ngay sau khi thực hiện xong loạt lệnh trên, bạn có 30 giây để thiết lập kết nối SSH chính thức:

ssh user@[IP_CỦA_VPS]

Một khi kết nối SSH đã được thiết lập thành công, nhờ vào quy tắc ct state established,related accept ở đầu cấu hình nftables, phiên làm việc của bạn sẽ được duy trì liên tục và ổn định ngay cả khi thời gian 30 giây mở cửa ban đầu kết thúc.

Lời kết và những lưu ý về an toàn hệ thống

Port Knocking bằng nftables là một giải pháp bảo mật chi phí thấp nhưng mang lại hiệu quả cực kỳ cao, giúp biến máy chủ của bạn thành một "pháo đài vô hình". Tuy nhiên, doanh nghiệp cần lưu ý một số điểm sau khi triển khai thực tế:

  • Không thay thế cho các biện pháp bảo mật cốt lõi: Port Knocking chỉ là lớp bảo vệ vòng ngoài (Defense in Depth). Bạn vẫn phải bắt buộc sử dụng SSH Key có mật khẩu bảo vệ mạnh và vô hiệu hóa tính năng đăng nhập bằng mật khẩu root truyền thống (Password Authentication).
  • Rủi ro do nghẽn mạng: Nếu đường truyền internet từ máy trạm đến VPS bị mất gói tin (packet loss) cao, thứ tự các cú gõ cửa có thể bị đảo lộn hoặc thất lạc, khiến tường lửa không mở cổng. Hãy chuẩn bị sẵn phương án truy cập dự phòng thông qua bảng điều khiển (VNC/Console) do nhà cung cấp VPS cung cấp để xử lý sự cố khi cần thiết.
Bảo mật hệ thống: Hướng dẫn cấu hình Port Knocking bằng nftables để ẩn hoàn toàn các cổng nhạy cảm trên VPS | DPTCloud