Port Knocking là kỹ thuật bảo mật thông minh giúp bảo vệ cổng SSH khỏi các cuộc tấn công dò quét bằng cách chỉ mở cổng khi người dùng gửi đúng chuỗi đã định sẵn. Trong hướng dẫn này, mình sẽ hướng dẫn bạn cách cấu hình port knocking trên Ubuntu 22.04 LTS để bảo vệ dịch vụ SSH một cách an toàn.
Những điểm chính
- Định nghĩa Port Knocking: Hiểu rõ Port Knocking là kỹ thuật bảo mật giúp ẩn dịch vụ bằng cách chỉ mở cổng khi nhận được một chuỗi truy cập bí mật.
- Những lợi ích khi sử dụng: Nắm được các lợi ích chính như vô hiệu hóa công cụ dò quét, chặn tấn công brute-force và làm sạch log hệ thống.
- Các bước cài đặt và sử dụng: Thành thạo quy trình 4 bước để cài đặt và cấu hình
knockdtrên server, đồng thời biết cách gửi knock từ máy khách để mở và đóng cổng. - Lưu ý khi sử dụng: Nắm được các rủi ro và hạn chế của Port Knocking, từ nguy cơ mất quyền truy cập, tấn công phát lại đến việc cản trở quy trình tự động hóa.
- Giải đáp thắc mắc (FAQ): Có được câu trả lời cho các vấn đề thực tế như liệu Port Knocking có thay thế được SSH key, có nên dùng chung chuỗi knock và cách xử lý khi bị quét trúng ngẫu nhiên
Port Knocking là gì?
Port Knocking là kỹ thuật bảo mật mạng cho phép bạn ẩn các dịch vụ sau tường lửa và chỉ mở cổng khi client gửi đúng một chuỗi truy cập bí mật tới các cổng đang đóng. Khi firewall phát hiện chính xác chuỗi gõ cổng này, Port Knocking sẽ tạm thời thay đổi rule để mở cổng dịch vụ cho đúng địa chỉ IP đó, giúp giảm nguy cơ bị quét cổng và truy cập trái phép.

Những lợi ích khi sử dụng Port Knocking
Dưới đây là 4 lợi ích chính khi sử dụng kỹ thuật Port Knocking:
- Vô hiệu hóa các công cụ dò quét: Port Knocking sẽ đóng các cổng dịch vụ như SSH port 22, do đó các công cụ rà quét phổ biến như Nmap hay Shodan sẽ không thể phát hiện ra dịch vụ đang chạy.
- Chặn tấn công Brute-force: Vì cổng kết nối bị đóng, kẻ tấn công không thể thiết lập kết nối TCP để bắt đầu thử tài khoản/mật khẩu. Điều này loại bỏ hoàn toàn nguy cơ từ các cuộc tấn công dò mật khẩu tự động.
- Bảo vệ trước lỗ hổng phần mềm: Ngay cả khi dịch vụ SSH hoặc dịch vụ khác có lỗ hổng bảo mật chưa được vá, hacker cũng không thể khai thác lỗ hổng đó vì không thể giao tiếp được với tiến trình daemon.
- Làm sạch Log hệ thống: Do ngăn chặn được các kết nối rác ngay từ tường lửa, file nhật ký xác thực (/var/log/auth.log) sẽ không còn bị spam bởi hàng ngàn dòng thông báo “Failed password” mỗi ngày, giúp quản trị viên dễ dàng theo dõi các truy cập hợp lệ.

Các cài đặt và sử dụng Port Knocking
Bước 1: Cài đặt knockd
Đầu tiên, bạn cần cài đặt gói phần mềm knockd từ kho lưu trữ chính thức của Ubuntu. Bạn thực hiện các lệnh sau để cập nhật hệ thống và cài đặt:
$ sudo apt update
$ sudo apt install knockd
$ knockd --version
Bước 2: Cấu hình knockd
1. Cấu hình file /etc/knockd.conf
Tiếp theo, bạn mở file cấu hình bằng lệnh sau:
$ sudo nano /etc/knockd.confBạn hãy chỉnh sửa nội dung file như bên dưới. Cấu hình này định nghĩa 2 hành động đó là openSSH (mở cổng) và closeSSH (đóng cổng).
[openSSH]
sequence = 10005,10006,10007
seq_timeout = 15
command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 10007,10006,10005
seq_timeout = 15
command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn

Giải thích thông số:
sequence: Chuỗi các cổng bạn cần gõ để kích hoạt. (Ví dụ: Gõ lần lượt 10005 -> 10006 -> 10007 để mở). Bạn nên thay đổi các số này để đảm bảo bí mật.seq_timeout: Thời gian tối đa (giây) để hoàn thành chuỗi gõ.command: Lệnh hệ thống sẽ chạy khi gõ đúng. Ở đây bạn dùngiptablesđể thêm (-I) hoặc xóa (-D) quy tắc cho phép IP của người gõ (%IP%) truy cập port 22.
Lưu ý
2. Cấu hình file /etc/default/knockd
Để knockd hoạt động, bạn cần kích hoạt và chỉ định giao diện mạng sẽ lắng nghe tín hiệu. Đầu tiên bạn mở file cấu hình mặc định:
$ sudo nano /etc/default/knockdSau đó bạn chỉnh sửa các dòng sau, thay <tên_giao_diện_mạng> bằng tên interface của bạn, ví dụ eth0 hoặc ens33. Bạn có thể dùng lệnh ip a để xem tên này:
START_KNOCKD=1
KNOCKD_OPTS="-i <tên_giao_diện_mạng>"
3. Khởi động dịch vụ
Sau khi cấu hình xong, hãy khởi động dịch vụ và kiểm tra trạng thái:
$ sudo systemctl enable knockd
$ sudo systemctl start knockd
$ sudo systemctl status knockd
Nếu kết quả trả về Active: active (running) nghĩa là dịch vụ đã hoạt động tốt.

Bước 3: Đóng Port SSH 22 trên UFW
Để Port Knocking có tác dụng, cổng SSH (22) mặc định phải ở trạng thái đóng. Nếu cổng này đang mở cho tất cả mọi người, việc cài knockd sẽ trở nên vô nghĩa. Bạn kiểm tra trạng thái các quy tắc tường lửa hiện tại bằng lệnh sau:
$ sudo ufw status numberedLưu ý

Bước 4: Gửi Knock từ máy khách
Trên máy Client (Ubuntu/Linux), bạn cài đặt knockd bằng lệnh sau:
$ sudo apt install knockdNếu dùng Windows/macOS, bạn có thể dùng các phần mềm Port Knocking client tương ứng.

Để mở cổng SSH, gửi chuỗi 10005, 10006, 10007 như đã cấu hình ở phần [openSSH], bạn thực hiện lệnh sau:
$ knock -v <IP_Server> 10005 10006 10007
Ngay sau khi gõ thành công, cổng 22 sẽ mở riêng cho IP của bạn. Sau đó bạn hãy kết nối và đăng nhập SSH:
$ ssh user@<IP_Server>
Sau khi hoàn tất công việc và đăng xuất khỏi Server, bạn nên đóng cổng lại để đảm bảo an toàn bằng cách gửi chuỗi ngược lại:
knock -v <IP_Server> 10007 10006 10005
Bạn có thể kiểm tra lại bằng lệnh ssh, kết nối sẽ bị từ chối hoặc time-out:

Những lưu ý khi sử dụng Port Knocking
Dưới đây là nhưng lưu ý kỹ thuật quan trọng bạn cần quan tâm khi triển khai Port Knocking:
- Nguy cơ mất quyền truy cập: Nếu dịch vụ knockd ngừng hoạt động đột ngột hoặc cấu hình sai, cổng SSH sẽ bị khóa vĩnh viễn. Do đó bạn bắt buộc phải duy trì phương thức truy cập dự phòng Out-of-Band như VNC Console, KVM hoặc IPMI.
- Rủi ro tấn công phát lại: Do tín hiệu gõ cửa thường không được mã hóa, kẻ tấn công trong cùng mạng có thể nghe lén chuỗi bí mật và thực hiện lại để mở cổng trái phép.
- Dễ bị ảnh hưởng với chất lượng mạng: Trong điều kiện mạng có độ trễ cao hoặc mất gói tin, các gói tin trong chuỗi knock có thể đến sai thứ tự quy định, dẫn đến thất bại khi mở cổng.
- Cản trở quy trình tự động hóa: Kỹ thuật Port Knocking tạo ra rào cản lớn cho các công cụ quản trị cấu hình như Ansible, Terraform hoặc các luồng CI/CD yêu cầu kết nối SSH trực tiếp và ổn định.
- Không thể thay thế biện pháp bảo mật cốt lõi: Port Knocking là giải pháp che giấu dịch vụ, không phải là cơ chế xác thực nên bạn không dùng Port Knocking để thay thế cho các biện pháp bảo mật cốt lõi như SSH Key.

Câu hỏi thường gặp
Port Knocking có thay thế hoàn toàn các biện pháp bảo mật khác như SSH key, Fail2ban hoặc VPN không?
Không, Port Knocking chỉ là một lớp ẩn dịch vụ, giúp giảm bề mặt tấn công, chứ không thay thế được xác thực bằng SSH key, giới hạn đăng nhập qua Fail2ban hoặc việc đặt SSH phía sau VPN. Bạn nên dùng Port Knocking kết hợp SSH key và tắt mật khẩu, đặt SSH sau VPN đối với các hệ thống quan trọng.
Có nên dùng cùng một chuỗi Port Knocking cho nhiều server hay môi trường không?
Không nên dùng chung vì nếu chuỗi bị lộ ở một môi trường ít quan trọng, kẻ tấn công có thể tái sử dụng nó để tiếp cận môi trường production. Thay vào đó, bạn hãy dùng chuỗi khác nhau cho từng nhóm server, thay đổi định kỳ nếu nghi ngờ lộ thông tin và lưu trữ chuỗi một cách an toàn.
Nếu kẻ tấn công quét trúng đúng các port trong chuỗi knock một cách ngẫu nhiên thì sao?
Xác suất quét trúng đầy đủ và đúng thứ tự một chuỗi nhiều cổng là rất thấp, đặc biệt nếu bạn chọn port ngẫu nhiên, không trùng với các port dịch vụ phổ biến. Tuy vậy, để an toàn hơn, bạn có thể dùng chuỗi dài hơn, bật one-time sequence hoặc kết hợp thêm kiểm tra khác như IP, thời gian, hoặc xác thực ở lớp ứng dụng.
Trên Ubuntu 22.04, Port Knocking là một lớp bảo mật bổ sung hiệu quả, giúp ẩn dịch vụ SSH khỏi các đợt rà quét tự động. Tuy nhiên, để tối ưu hóa an toàn cho hệ thống, bạn nên kết hợp sử dụng SSH key pair và tắt xác thực bằng mật khẩu. Chúc bạn thao tác lệnh thành công và hẹn gặp lại bạn trong các bài viết tiếp theo.




