Port Knocking: Cách ‘giấu’ cổng SSH khiến Server Linux tàng hình trước Botnet

Network tutorial - IT technology blog
Network tutorial - IT technology blog

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:

  1. Độ 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.
  2. 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.
  3. 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.

Share: