Giải thích port knocking
Port knocking giữ một dịch vụ vô hình cho đến khi ai đó chứng minh họ biết bí mật. Hướng dẫn này trình bày cách hoạt động, hai cách triển khai phổ biến — knockd và fwknop — cùng lý do các lần gõ thất bại trong thực tế.
Port knocking hoạt động như thế nào
Tường lửa loại bỏ mọi kết nối đến cổng được bảo vệ, nên trình quét không thấy gì. Một daemon nhỏ theo dõi lưu lượng đến tường lửa. Khi một địa chỉ nguồn tạo ra mẫu mong đợi, daemon sẽ thêm quy tắc tường lửa cho phép địa chỉ đó, thường trong thời gian ngắn.
Mẫu đó là lần gõ. Với knockd, đó là một chuỗi thử kết nối đến các cổng cụ thể theo thứ tự cụ thể và trong giới hạn thời gian. Với fwknop, đó là một gói được mã hóa duy nhất.
knockd: chuỗi gõ
knockd lắng nghe trên một giao diện và đối chiếu các lần thử kết nối với chuỗi trong /etc/knockd.conf. Một chuỗi có thể kết hợp cổng TCP và UDP. Khi khớp, knockd chạy một lệnh — thường là quy tắc iptables hoặc nftables cho địa chỉ đang gõ (%IP%).
Ví dụ này mở SSH cho địa chỉ đang gõ và đóng lại sau 10 giây. Các phiên SSH hiện có vẫn hoạt động nếu tường lửa chấp nhận các kết nối đã thiết lập.
[options]
UseSyslog
[openSSH]
sequence = 7311:tcp,8822:tcp,9133:udp
seq_timeout = 10
tcpflags = syn
start_command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT Chọn cổng riêng của bạn; đừng bao giờ dùng lại các cổng từ ví dụ đã công bố. tcpflags = syn khiến knockd chỉ tính các gói có cờ SYN — gói đầu tiên của một lần thử kết nối.
fwknop: Single Packet Authorization
fwknop thay chuỗi bằng một gói UDP được mã hóa (AES) và xác thực (HMAC). Máy chủ, fwknopd, thu gói một cách thụ động, xác minh gói, kiểm tra không phải gói phát lại và mở cổng được yêu cầu cho địa chỉ trong gói.
Tạo khóa bằng fwknop --key-gen và đặt chúng vào access.conf của máy chủ. Secret Knock nhập phần phía máy khách từ .fwknoprc của bạn.
SOURCE ANY
OPEN_PORTS tcp/22
KEY_BASE64 <output of fwknop --key-gen>
HMAC_KEY_BASE64 <output of fwknop --key-gen>
FW_ACCESS_TIMEOUT 30 Vì địa chỉ được phép nằm trong gói mã hóa, SPA có thể mở cổng cho địa chỉ khác với địa chỉ gửi gói — hữu ích khi bạn gõ từ điện thoại dùng dữ liệu di động cho một máy tính xách tay ở nơi khác.
Vì sao lần gõ thất bại
- IPv4 so với IPv6: lần gõ đi qua một họ địa chỉ nhưng SSH kết nối qua họ còn lại. Tường lửa đã mở cửa cho một địa chỉ bạn không dùng.
- Địa chỉ công khai khác: khi dùng dữ liệu di động, sau NAT của nhà mạng hoặc VPN, máy chủ thấy IP khác với dự kiến. Kiểm tra địa chỉ bạn gõ từ đó.
- SYN được truyền lại: nếu một lần gõ TCP không được phản hồi, hệ điều hành của máy khách sẽ gửi lại cùng SYN. Trong thử nghiệm của chúng tôi, knockd 0.8 đặt lại chuỗi khi gặp SYN lặp lại như vậy, nên máy khách phải gửi mỗi lần gõ một lần và dừng lần thử nhanh chóng.
- Thời gian: các lần gõ đến ngoài seq_timeout hoặc sai thứ tự sẽ bắt đầu lại chuỗi.
- Thiết bị trung gian: một số mạng chặn hoặc sửa đổi lưu lượng đến các cổng bất thường, nên lần gõ hoạt động tại nhà có thể thất bại trên mạng khách sạn hoặc văn phòng.
Có an toàn không?
Chuỗi knockd được gửi không mã hóa; bất kỳ ai theo dõi lưu lượng của bạn đều có thể phát lại. Hãy dùng nó để ẩn dịch vụ khỏi trình quét, tạo thêm một lớp bảo vệ trước bước xác thực bằng khóa SSH — không dùng nó thay cho các khóa này. fwknop SPA khắc phục điểm yếu này bằng mã hóa, HMAC và bảo vệ chống phát lại, đồng thời là lựa chọn tốt hơn khi lưu lượng của bạn có thể bị quan sát.
Gõ từ iPhone, Mac và Apple Watch
Secret Knock gửi chuỗi knockd và gói fwknop SPA từ iPhone, iPad và Mac, kiểm tra cổng có phản hồi và mở ứng dụng SSH của bạn. Apple Watch gõ qua iPhone được ghép đôi vì watchOS không cho phép ứng dụng gửi gói TCP hoặc UDP thô; khi ở xa iPhone, ứng dụng có thể gửi SPA qua HTTP đến máy chủ đã bật tính năng này.
Hướng dẫn cho thiết lập của bạn
Giữ cửa đóng. Mang theo lần gõ.
Secret Knock sắp có trên App Store dành cho iPhone, iPad, Mac và Apple Watch.
Secret Knock →