使用fwknop使你的服务隐身
使用fwknop使你的服务隐身
起因
我的公网服务器SSH总是有登录失败日志,不论更换几次端口都能被找到。最担心的是哪天被尝试爆破出了密码。

在一次机缘巧合之下,我发现了fwknop
介绍
fwknop(Firewall Knock Operator)实现了单包授权(Single Packet Authorization,SPA),用于隐藏受保护的服务。SPA 通过单个经过加密、可抗重放并由 HMAC 认证的数据包,向运行在默认拒绝(default-drop)防火墙之后的服务发起访问请求。在这种部署下,防火墙会直接丢弃所有到 SSH 等服务的入站连接尝试,使未修补的漏洞(包括 0-day)难以被利用;只要服务端口尚未被授权开放,它也不会出现在 Nmap、Shodan 等扫描结果中。
简单来说,fwknop 可以使得你的某项服务,例如SSHD 的端口默认情况下丢弃一切包,看起来就像是这个端口没有开放一样。其采用被动监听的方式,他会嗅探发来的数据包,并且进行单包授权认证,认证通过后,可以为被认证的IP临时开放指定时间例如30s的端口访问权。
fwknop的具体技术原理,和使用方法可以去其Github仓库查看。
如果你需要一份中文文档,可以看看我使用AI总结的fwknop_spa_docs_v1.0基于Github仓库中的Readme等文件生成的中文文档,或许对你有所帮助
fwknop_spa_docs_v1.0下载地址:蓝奏云
使用
以服务端为Ubuntu,客户端为Windows;Termux(Android)为例
以保护SSHD服务为例,端口为22
一、服务端配置(Ubuntu)
- 安装 fwknop-server
1 | |
- 生成密钥(在客户端机器上执行,具体安装方法见下文客户端配置)
1 | |
输出示例:
1 | |
把这两行保存好,非常重要, 这个密钥是 SPA 体系的敲门密钥,泄露后任何人都能敲门开门 。
- 配置 access.conf(认证与授权)
编辑 /etc/fwknop/access.conf,写入以下内容:
1 | |
各配置项解释:
| 配置项 | 含义 | 为什么这样写 |
|---|---|---|
SOURCE ANY | 接受来自任何源 IP 的敲门包 | 你的客户端 IP 可能变化(手机 4G/5G、家庭宽带动态 IP),写死会敲不开门 |
REQUIRE_SOURCE_ADDRESS Y | 强制客户端在加密包里写明真实 IP | 彻底禁用不安全参数 -s,防止中间人攻击和 IP 欺骗(文档 §5.8) |
OPEN_PORTS tcp/22 | 验证通过后放行 SSH 端口 | 你要保护的就是 SSH |
FW_ACCESS_TIMEOUT 30 | 放行规则 30 秒后自动删除 | 最小化暴露窗口,连上 SSH 后端口重新关闭 |
KEY_BASE64 / HMAC_KEY_BASE64 | Rijndael 加密密钥 + HMAC 认证密钥 | 双密钥独立,符合“先加密后认证”的安全模型 |
- 配置 fwknopd.conf(运行参数)
编辑 /etc/fwknop/fwknopd.conf:
1 | |
| 配置项 | 含义 | 为什么这样写 |
|---|---|---|
PCAP_INTF eth0 | 指定嗅探网卡 | 服务器可能有多个网卡,必须明确告诉 fwknopd 监听哪个 |
ENABLE_DIGEST_PERSISTENCE Y | 持久化已处理包的摘要到硬盘 | 即使 fwknopd 重启,攻击者截获的旧包也无法重放(文档 §6.2) |
MAX_SPA_PACKET_AGE 120 | 拒绝时间戳超过 120 秒的包 | 攻击者偷到你的包,超过 2 分钟再发直接丢弃,不走解密流程(文档 §6.2) |
VERBOSE 1 | 日志级别 | 生产环境用 1 就够了,调试时可临时改 3 |
⚠️ 警告:执行前务必确保你有其他管理通道(VNC/串口),否则可能锁死自己。
- 配置防火墙(最关键的一步)
1 | |
具体防火墙配置方法请结合自身实际
注:其实如果你有管理面板类似于1panel、宝塔 这种直接写22端口禁止任何IP访问即可。
- 启动服务
1 | |
- 验证服务状态
1 | |
二.客户端配置
- 安装客户端
Windows 图形界面(推荐新手):
· 下载:PortGuard.net Client Tools
· 安装后,在 %USERPROFILE%.fwknoprc 创建配置文件
我没用过,所以就不附下载地址了,请自行搜索下载地址
Termux (Android):
1 | |
Windows CMD / WSL / Linux:
1 | |
- 配置 .fwknoprc(告别长命令)
在用户主目录创建 .fwknoprc(Windows 路径为 C:\Users\你的用户名.fwknoprc):
1 | |
各配置项解释:
| 配置项 | 含义 | 为什么这样写 |
|---|---|---|
SPA_SERVER | 目标服务器 IP | 告诉客户端把敲门包发到哪 |
SPA_SERVER_PORT 62201 | 敲门包的目标 UDP 端口 | 服务端默认嗅探 62201 端口 |
ACCESS tcp/22 | 请求开放 SSH | 与服务端 OPEN_PORTS 对应 |
ALLOW_IP resolve | 自动获取公网 IP 并加密进包 | 对应命令行 -R,最安全。解决动态 IP 问题,且 IP 写在密文里防篡改(文档 §5.2) |
USE_HMAC Y | 启用 HMAC 认证 | 服务端先校验 HMAC 再解密,防填充预言机攻击(文档 §3) |
KEY_BASE64 / HMAC_KEY_BASE64 | 加密密钥 + HMAC 密钥 | 必须与服务端完全一致,否则敲门失败 |
FW_TIMEOUT 30 | 告诉服务端超时设 30 秒 | 与服务端 FW_ACCESS_TIMEOUT 30 保持一致 |
- 日常连接流程
Terminal / CMD 中执行:
1 | |
一键版(Linux/Mac/WSL):
1 | |
后记
后期如需更换密钥:重新生成 KEY_BASE64/HMAC_KEY_BASE64 → 更新 access.conf → systemctl restart fwknop-server → 更新所有客户端 .fwknoprc
还有很多功能没有使用,你可以通过查阅官方文档自行探索,当然也可以看看我提供的中文文档fwknop_spa_docs_v1.0
这fwknop_spa_docs_v1.0费了不少劲,希望对你有所帮助