Vấn đề: Khi Fail2Ban vẫn để lộ dấu vết Server
Chỉ cần đưa một VPS lên Cloud khoảng 24 giờ, bạn sẽ thấy log SSH (/var/log/auth.log) tràn ngập hàng nghìn nỗ lực đăng nhập trái phép. Các botnet quét port 24/7 và dù bạn có đổi port 22 sang 2222, các công cụ như Nmap vẫn dễ dàng phát hiện ra dịch vụ đang chạy sau vài giây.
Sau 6 tháng vận hành các cụm server production, mình nhận thấy Port Knocking là lớp bảo mật bổ sung cực kỳ thực dụng. Thay vì chặn sau khi bị tấn công như Fail2Ban, Port Knocking khiến port SSH luôn ở trạng thái Closed. Server của bạn sẽ như một bức tường gạch không cửa sổ. Chỉ khi bạn gửi một chuỗi gói tin (gõ cửa) đúng thứ tự bí mật, cánh cửa SSH mới tạm mở ra cho riêng IP của bạn.
Cơ chế hoạt động của Port Knocking
Dịch vụ knockd chạy ngầm để theo dõi log mạng. Khi bạn gửi gói tin đến các cổng định sẵn (ví dụ: 7001, 8005, 9002), nó sẽ kích hoạt một script iptables. Lệnh này thêm IP của bạn vào danh sách trắng (whitelist) để truy cập port 22 trong một khoảng thời gian nhất định.
Thú vị ở chỗ: các cổng dùng để “gõ” không cần mở trên firewall. knockd bắt gói tin trực tiếp từ interface mạng (libpcap) trước khi firewall từ chối chúng. Nhìn từ bên ngoài, server trông như một “hố đen” không có bất kỳ dịch vụ nào đang hoạt động.
Cài đặt và cấu hình knockd trên Ubuntu/Debian
Bước 1: Cài đặt package
Cài đặt knockd rất nhanh gọn bằng lệnh:
sudo apt update && sudo apt install knockd -y
Bước 2: Thiết lập chuỗi mật mã gõ cổng
Mọi cấu hình quan trọng nằm ở file /etc/knockd.conf. Hãy thay đổi các cổng mặc định để tránh bị đoán biết.
sudo nano /etc/knockd.conf
Sửa nội dung file theo mẫu thực tế dưới đây:
[options]
UseSyslog
[openSSH]
sequence = 7542,8231,9145
seq_timeout = 5
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9145,8231,7542
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
Lưu ý kỹ thuật:
- sequence: Chọn 3-4 cổng ngẫu nhiên trong dải 1024-65535.
- seq_timeout: Bạn phải hoàn thành việc “gõ” trong vòng 5 giây.
- command: Sử dụng tham số
-I(Insert) để đưa rule lên đầu bảng iptables, giúp nó có độ ưu tiên cao nhất.
Bước 3: Kích hoạt Daemon
Mở file /etc/default/knockd để cho phép dịch vụ chạy tự động:
sudo nano /etc/default/knockd
Chỉnh START_KNOCKD=1. Kiểm tra interface mạng bằng lệnh ip link show (thường là eth0 hoặc ens3) và cập nhật:
KNOCKD_OPTS="-i eth0"
Sau đó khởi động lại dịch vụ:
sudo systemctl enable --now knockd
Bước 4: Thiết lập Firewall chặn SSH mặc định
Đây là lúc chúng ta “đóng cửa” server. Cảnh báo: Đừng ngắt kết nối SSH hiện tại cho đến khi bạn thử nghiệm thành công cú gõ đầu tiên.
# Cho phép các kết nối đang hoạt động (để không bị văng ra ngoài ngay lập tức)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Chặn toàn bộ kết nối mới vào port 22
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
Nếu bạn cần tính toán dải IP để giới hạn truy cập cho một subnet văn phòng cụ thể, công cụ IP Subnet Calculator sẽ giúp bạn lấy dải CIDR chuẩn xác chỉ trong vài giây.
Cách mở cổng từ máy cá nhân
Khi cổng 22 đã bị chặn, bạn cần thực hiện chuỗi gõ trước khi thực hiện lệnh SSH thông thường.
Sử dụng lệnh knock
Nếu dùng Linux/macOS, bạn cài đặt client knockd và chạy:
knock your-server-ip 7542 8231 9145
Sử dụng Netcat (nc)
Nếu không muốn cài thêm tool, một vòng lặp bash đơn giản cũng đủ để kích hoạt:
for x in 7542 8231 9145; do nc -z your-server-ip $x; done
Sau khi gõ xong, bạn có thể ssh user@server như bình thường. Khi làm việc xong, hãy gõ chuỗi ngược lại để đóng cổng.
Kinh nghiệm thực tế để tránh “tự nhốt mình”
Triển khai Port Knocking rất hay nhưng cần lưu ý 3 điểm sống còn:
- Độ trễ mạng: Nếu mạng lag, các gói tin có thể đến sai thứ tự. Hãy thử gõ lại 2-3 lần nếu không vào được.
- Khởi động lại server: Các rule iptables thủ công sẽ mất khi reboot. Bạn nên dùng
iptables-persistentđể lưu rule hoặc thêm script khởi động. - Luôn có phương án dự phòng: Hãy luôn giữ quyền truy cập vào Web Console (VNC) của nhà cung cấp VPS để xử lý nếu lỡ cấu hình sai firewall.
Lời kết
Port Knocking không thay thế SSH Key nhưng nó loại bỏ hoàn toàn tiếng ồn từ các cuộc tấn công tự động. Khi kẻ tấn công không thấy port 22 mở, chúng sẽ bỏ qua server của bạn để tìm mục tiêu dễ dàng hơn. Đây là cách bảo mật “ẩn mình” cực kỳ hiệu quả mà mọi quản trị viên Linux nên cân nhắc áp dụng.

