设置 fwknop 服务器
fwknop 单数据包授权会让 SSH 保持关闭状态,直到收到一个经过加密和认证的 UDP 数据包。这些步骤适用于 Debian 或 Ubuntu 服务器;请先从电脑进行测试,然后将相同的密钥添加到 Secret Knock。
1. 安装并生成密钥
安装服务器端和客户端,然后生成密钥对。请保留输出内容:相同的两个密钥将用于 access.conf 和 Secret Knock。
sudo apt install fwknop-server fwknop-client
fwknop --key-gen # prints KEY_BASE64 and HMAC_KEY_BASE64 2. 允许 SPA 数据包访问 SSH
access.conf 用于指定有效数据包可以打开什么,以及打开多长时间。
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 3. 指定 fwknopd 的监听位置
fwknopd 会在网络接口上捕获数据包;它不需要开放端口。请设置服务器所使用的接口。
# /etc/fwknop/fwknopd.conf
PCAP_INTF eth0;
PCAP_FILTER udp port 62201;
MAX_SPA_PACKET_AGE 120; 4. 默认关闭 SSH
执行此操作时请保持一个 SSH 会话处于打开状态,并在退出前通过第二个连接进行测试。fwknopd 会在 INPUT 顶部插入自己的链,并为每个有效数据包在该链中添加一个有时限的 ACCEPT 规则。
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP 5. 测试,然后添加门
重启 fwknop-server,从另一台设备发送数据包并连接:
# from another machine: request SSH for the address the server sees (-R)
fwknop -A tcp/22 -R -D server.example.com \
--key-base64-rijndael "<KEY_BASE64>" --key-base64-hmac "<HMAC_KEY_BASE64>"
ssh [email protected] - 1在 Secret Knock 中:新建门 › 从模板开始 › fwknop,输入主机地址,然后使用“粘贴密钥”粘贴 fwknop --key-gen 的输出内容。
- 2敲门;当端口 22 有响应时,门会显示“门微开”。
- 3如果没有,请在服务器上运行 fwknopd -f -v;故障排除指南列出了常见原因。
GitHub 上的所有示例 → 本页面上的每项配置均可直接复制:github.com/mobilcomm/secretknock-examples(公共领域)。
问题
fwknopd 是否需要开放端口?
不需要。它从网络接口读取数据包,因此 SPA 端口可以在防火墙中保持关闭;数据包只需能够到达服务器即可。