Chống Scan Port và Brute-force Nâng Cao Bằng Port Knocking Kết Hợp NFTables Trên Linux VPS
1. Giới thiệu mối đe dọa từ Scan Port và Brute-force đối với VPS
Đối với bất kỳ quản trị viên hệ thống nào, việc duy trì an ninh cho một máy chủ ảo cá nhân (VPS) chạy Linux đối mặt với Internet là một thách thức không ngừng nghỉ. Mỗi giây trôi qua, hàng nghìn bot tự động quét mạng đang tích cực tìm kiếm các hệ thống có cấu hình bảo mật lỏng lẻo. Quá trình này bắt đầu bằng việc Scan Port nhằm xác định các dịch vụ đang chạy, phổ biến nhất là cổng SSH (mặc định là 22). Sau khi phát hiện cổng mở, chúng sẽ ngay lập tức kích hoạt các chiến dịch tấn công Brute-force hoặc Dictionary Attack để dò tìm thông tin đăng nhập.
Mặc dù việc đổi cổng SSH mặc định hoặc sử dụng khóa SSH (SSH Keys) giúp tăng cường bảo mật đáng kể, dịch vụ của bạn vẫn ở trạng thái "phơi bày". Hacker vẫn biết hệ thống của bạn tồn tại và có thể khai thác lỗ hổng bảo mật dạng Zero-day bất cứ lúc nào. Để giải quyết triệt để vấn đề này, cơ chế Port Knocking (gõ cửa bảo mật) xuất hiện như một giải pháp tối ưu giúp ẩn hoàn toàn các cổng quan trọng khỏi thế giới bên ngoài.
---2. Port Knocking là gì? Tại sao nên chọn NFTables thay vì Iptables/Knockd?
Khái niệm Port Knocking
Port Knocking là một phương pháp bảo mật dựa trên việc ẩn giấu sự tồn tại của một cổng dịch vụ đằng sau một bức tường lửa cấu hình mặc định là đóng (DROP). Để mở cổng này, một máy khách từ xa phải thực hiện một chuỗi nỗ lực kết nối cụ thể (được gọi là các tiếng "gõ cửa") đến một tập hợp các cổng không công khai được chỉ định sẵn theo một thứ tự chuẩn xác và trong một khoảng thời gian giới hạn.
Ví dụ thực tế: Cổng SSH 22 trên VPS của bạn luôn ở trạng thái đóng. Để truy cập, thiết bị của bạn cần gửi tín hiệu TCP hoặc UDP lần lượt tới các cổng ẩn như 7000, 8000, và 9000. Chỉ khi chuỗi kết nối này hoàn toàn chính xác, tường lửa mới tự động cấp quyền truy cập cho địa chỉ IP của bạn trong một thời gian ngắn.
Sức mạnh vượt trội của NFTables so với các giải pháp cũ
Trước đây, việc cấu hình Port Knocking thường đòi hỏi cài đặt thêm một daemon bên thứ ba (như knockd) hoặc viết các quy tắc phức tạp với mô-đun recent trong Iptables. Tuy nhiên, NFTables — công cụ thay thế thế hệ mới cho Iptables trong nhân Linux — đã mang lại một cuộc cách mạng lớn nhờ các ưu điểm vượt trội:
- Xử lý hoàn toàn trong không gian nhân (Kernel Space): NFTables hỗ trợ các tập hợp dữ liệu động (Dynamic Sets) và cơ chế tự động hết hạn (Timeout). Bạn không cần cài đặt thêm bất kỳ phần mềm chạy ngầm (Daemon) nào như knockd, giúp tối ưu hiệu năng và loại bỏ nguy cơ crash dịch vụ.
- Hiệu năng cực cao: Cú pháp của NFTables cho phép gộp các bộ quy tắc giúp giảm thiểu độ trễ xử lý gói tin, ngăn chặn hiệu quả các cuộc tấn công từ chối dịch vụ (DoS) nhắm vào cơ chế gõ cửa.
- Cấu hình tinh gọn và nguyên tử (Atomic): Khả năng cập nhật các tập hợp quy tắc một cách đồng bộ giúp hệ thống hoạt động ổn định và chính xác mà không làm gián đoạn các kết nối hiện tại.
3. Mô hình hoạt động của hệ thống Port Knocking 3 bước
Trong bài viết này, chúng ta sẽ xây dựng một kịch bản Port Knocking nâng cao gồm 3 bước sử dụng các cổng TCP ngẫu nhiên. Quy trình xử lý gói tin của NFTables diễn ra như sau:
- Địa chỉ IP gửi yêu cầu kết nối đến cổng đầu tiên (Ví dụ: TCP 7777). NFTables ghi nhận và đưa IP này vào danh sách tạm thời
knock_stage1với thời gian hết hạn là 10 giây. - Trong vòng 10 giây đó, nếu IP này tiếp tục kết nối chính xác đến cổng thứ hai (Ví dụ: TCP 8888), hệ thống sẽ kiểm tra xem IP có nằm trong danh sách
knock_stage1không. Nếu thỏa mãn, IP sẽ được thăng cấp lên danh sáchknock_stage2(hiệu lực tiếp theo trong 10 giây). - Cuối cùng, nếu IP gửi tín hiệu đến cổng thứ ba (Ví dụ: TCP 9999) trong thời gian quy định, IP đó sẽ được đưa vào danh sách an toàn
allowed_sshvới thời gian mở là 30 giây. Trong khoảng thời gian 30 giây này, người dùng có thể thoải mái thiết lập kết nối SSH vào hệ thống.
Lưu ý: Sau khi kết nối SSH đã thiết lập thành công (trạng thái ESTABLISHED), tường lửa sẽ duy trì kết nối này mãi mãi mà không bị ảnh hưởng bởi bộ đếm thời gian hết hạn.
---4. Hướng dẫn cấu hình chi tiết NFTables trên Linux VPS
Dưới đây là các bước chi tiết để thiết lập hệ thống Port Knocking bảo mật bằng NFTables trên các hệ điều hành Linux hiện đại (như Ubuntu 22.04/24.04, Debian hoặc Rocky Linux).
Bước 1: Sao lưu và dọn dẹp cấu hình tường lửa cũ
Trước khi bắt đầu, hãy đảm bảo bạn cài đặt gói nftables và thiết lập một phiên kết nối SSH dự phòng hoặc chuẩn bị quyền truy cập console từ trang quản trị của nhà cung cấp VPS để tránh rủi ro tự khóa mình ra khỏi hệ thống (Lockout).
sudo apt-get update && sudo apt-get install nftables -y
sudo systemctl enable nftables
Bước 2: Tạo tệp cấu hình NFTables nâng cao
Chỉnh sửa tệp cấu hình chính của NFTables nằm tại đường dẫn /etc/nftables.conf:
sudo nano /etc/nftables.conf
Thêm nội dung cấu hình chuẩn hóa dưới đây vào tệp tin của bạn:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
# Định nghĩa các tập hợp động để theo dõi chuỗi gõ cửa
set knock_stage1 {
type ipv4_addr
flags timeout
timeout 10s
}
set knock_stage2 {
type ipv4_addr
flags timeout
timeout 10s
}
# Tập hợp các IP đã hoàn thành chuỗi gõ cửa thành công và được phép kết nối SSH
set allowed_ssh {
type ipv4_addr
flags timeout
timeout 30s
}
chain input {
type filter hook input priority 0; policy drop;
# 1. Chấp nhận các kết nối hiện tại đã thiết lập hoặc có liên quan
ct state established,related accept
iifname "lo" accept
# 2. Xử lý logic cơ chế Port Knocking
# Bước 1: Gõ cửa cổng TCP 7777 -> Thêm vào danh sách stage1
tcp dport 7777 tcp flags syn add @knock_stage1 { ip saddr } drop
# Bước 2: Gõ cửa cổng TCP 8888 -> Kiểm tra danh sách stage1, nếu có thì thêm vào stage2
tcp dport 8888 tcp flags syn ip saddr @knock_stage1 add @knock_stage2 { ip saddr } drop
# Bước 3: Gõ cửa cổng TCP 9999 -> Kiểm tra danh sách stage2, nếu có thì cho phép truy cập SSH
tcp dport 9999 tcp flags syn ip saddr @knock_stage2 add @allowed_ssh { ip saddr } log prefix "[NFTABLES PORTKNOCK SUCCESS] " drop
# 3. Cho phép truy cập cổng SSH (22) nếu IP nằm trong tập hợp allowed_ssh
tcp dport 22 ip saddr @allowed_ssh accept
# Loại bỏ và ghi nhật ký tất cả lưu lượng truy cập trái phép còn lại
log prefix "[NFTABLES DROPPED] " flags all counter drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
Bước 3: Áp dụng và kiểm tra quy tắc mới
Tiến hành chạy tệp cấu hình để kích hoạt các quy tắc bảo mật trên VPS:
sudo nft -f /etc/nftables.conf
sudo systemctl restart nftables
Để kiểm tra xem các thiết lập đã hoạt động chính xác trong nhân hay chưa, sử dụng lệnh hiển thị danh sách quy tắc hiện tại:
sudo nft list ruleset
---
5. Cách thức kiểm thử (Testing) từ máy khách
Bây giờ, nếu bạn cố gắng kết nối trực tiếp đến cổng SSH bằng lệnh thông thường từ máy tính của mình, kết nối sẽ bị treo và không phản hồi vì cổng đang hoàn toàn ẩn giấu.
Sử dụng lệnh Nmap để thực hiện chuỗi gõ cửa
Từ máy khách (Linux hoặc macOS), bạn có thể sử dụng công cụ mạng nmap để gửi các gói tin TCP SYN theo thứ tự chuẩn xác đến địa chỉ IP của VPS (thay YOUR_VPS_IP bằng IP thực tế của bạn):
nmap -Pn --max-retries 0 -p 7777 YOUR_VPS_IP
nmap -Pn --max-retries 0 -p 8888 YOUR_VPS_IP
nmap -Pn --max-retries 0 -p 9999 YOUR_VPS_IP
Sử dụng tiện ích Nc (Netcat) thay thế
Nếu không cài đặt Nmap, bạn có thể tận dụng lệnh nc có sẵn với tham số thiết lập thời gian chờ ngắn:
nc -z -w 1 YOUR_VPS_IP 7777
nc -z -w 1 YOUR_VPS_IP 8888
nc -z -w 1 YOUR_VPS_IP 9999
Sau khi hoàn thành cú gõ cửa thứ ba, bạn sẽ có đúng 30 giây để bắt đầu khởi tạo kết nối SSH thông thường:
ssh user@YOUR_VPS_IP
Khi phiên SSH đã thiết lập thành công, bạn có thể làm việc thoải mái mà không lo lắng về thời gian hết hạn 30 giây của tập hợp allowed_ssh nhờ quy tắc xử lý trạng thái kết nối ct state established,related accept hàng đầu.
6. Những lưu ý bảo mật quan trọng khi vận hành
Mặc dù Port Knocking kết hợp với NFTables cung cấp một bức tường bảo vệ vô cùng kiên cố, việc áp dụng nó vào môi trường sản xuất thực tế cần đi kèm với các nguyên tắc quản trị an toàn sau:
- Không sử dụng các chuỗi cổng mặc định: Tránh xa các chuỗi cổng dễ đoán đoán như 1111, 2222, 3333 hoặc các chuỗi tăng dần liên tiếp. Việc này ngăn chặn các bộ quét mạng quét từ thấp lên cao vô tình kích hoạt chuỗi gõ cửa của bạn.
- Kết hợp phòng thủ chiều sâu (Defense in Depth): Tuyệt đối không coi Port Knocking là giải pháp thay thế cho các biện pháp bảo mật cốt lõi. Hãy luôn tắt tính năng đăng nhập bằng mật khẩu root (
PasswordAuthentication no) và bắt buộc sử dụng SSH Key mạnh kết hợp xác thực 2 yếu tố (2FA). - Đồng bộ cấu hình IPv6: Các bot hiện nay quét cả không gian địa chỉ IPv6. Hãy đảm bảo bạn cấu hình thêm tập hợp và quy tắc tương ứng cho cấu trúc địa chỉ
type ipv6_addrtrong bảng tường lửa nếu VPS của bạn được cấp cấu hình mạng song song (Dual-stack).
7. Lời kết
Bằng việc tận dụng sức mạnh cấu trúc Dynamic Sets tích hợp sẵn của NFTables, bạn đã xây dựng thành công một hệ thống phòng thủ chủ động vô hình trước các công cụ dò quét tự động. Giải pháp bảo mật tinh gọn này giúp VPS của bạn miễn nhiễm hoàn toàn với các cuộc tấn công quét cổng bừa bãi và Brute-force nguy hiểm từ Internet mà không làm tiêu tốn tài nguyên hệ thống. Hãy triển khai giải pháp này ngay hôm nay để nâng cấp lớp giáp bảo vệ cho hạ tầng máy chủ của doanh nghiệp bạn.
