使用fwknop使你的服务隐身

使用fwknop使你的服务隐身

起因

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

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)

  1. 安装 fwknop-server
1
2
sudo apt update
sudo apt install -y fwknop-server
  1. 生成密钥(在客户端机器上执行,具体安装方法见下文客户端配置)
1
fwknop --key-gen

输出示例:

1
2
KEY_BASE64: HvUtIOrameHLGkImD4ECXOzinaH4h3U8H1WXum7b54Q=
HMAC_KEY_BASE64: DLeLf93a3yBT2vhEpM+dWlirGta5GU+...

把这两行保存好,非常重要, 这个密钥是 SPA 体系的敲门密钥,泄露后任何人都能敲门开门 。

  1. 配置 access.conf(认证与授权)

编辑 /etc/fwknop/access.conf,写入以下内容:

1
2
3
4
5
6
SOURCE ANY
REQUIRE_SOURCE_ADDRESS Y;
OPEN_PORTS tcp/22
FW_ACCESS_TIMEOUT 30
KEY_BASE64 <粘贴上面生成的 KEY_BASE64>
HMAC_KEY_BASE64 <粘贴上面生成的 HMAC_KEY_BASE64>

各配置项解释:

配置项含义为什么这样写
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_BASE64Rijndael 加密密钥 + HMAC 认证密钥双密钥独立,符合“先加密后认证”的安全模型
  1. 配置 fwknopd.conf(运行参数)

编辑 /etc/fwknop/fwknopd.conf:

1
2
3
4
PCAP_INTF eth0
ENABLE_DIGEST_PERSISTENCE Y;
MAX_SPA_PACKET_AGE 120;
VERBOSE 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. 配置防火墙(最关键的一步)
1
2
3
4
5
6
# 在 INPUT 链最前面插入丢弃规则,让 SSH 端口隐身
iptables -I INPUT 1 -i eth0 -p tcp --dport 22 -j DROP

# 保存规则(防止重启丢失)
apt install -y iptables-persistent
netfilter-persistent save

具体防火墙配置方法请结合自身实际

注:其实如果你有管理面板类似于1panel宝塔 这种直接写22端口禁止任何IP访问即可。

  1. 启动服务
1
2
sudo systemctl start fwknop-server
sudo systemctl enable fwknop-server # 设置开机自启
  1. 验证服务状态
1
2
3
sudo systemctl status fwknop-server   # 检查是否 active (running)
sudo journalctl -u fwknop-server -f # 实时查看敲门日志
sudo iptables -L FWKNOP_INPUT -n -v # 查看当前放行了哪些 IP

二.客户端配置

  1. 安装客户端

Windows 图形界面(推荐新手):

· 下载:PortGuard.net Client Tools
· 安装后,在 %USERPROFILE%.fwknoprc 创建配置文件

我没用过,所以就不附下载地址了,请自行搜索下载地址

Termux (Android):

1
pkg update && pkg install fwknop-static

Windows CMD / WSL / Linux:

1
sudo apt install -y fwknop-client   # Ubuntu/Debian
  1. 配置 .fwknoprc(告别长命令)

在用户主目录创建 .fwknoprc(Windows 路径为 C:\Users\你的用户名.fwknoprc):

1
2
3
4
5
6
7
8
9
[default]
SPA_SERVER <你的服务器公网IP>
SPA_SERVER_PORT 62201
ACCESS tcp/22
ALLOW_IP resolve
USE_HMAC Y
KEY_BASE64 <你的KEY_BASE64>
HMAC_KEY_BASE64 <你的HMAC_KEY_BASE64>
FW_TIMEOUT 30

各配置项解释:

配置项含义为什么这样写
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 保持一致
  1. 日常连接流程

Terminal / CMD 中执行:

1
2
3
4
5
# 第一步:发送 SPA 敲门包(-n default 表示使用 default 配置段)
fwknop -n default

# 第二步:30 秒内 SSH 连接
ssh root@<你的服务器公网IP>

一键版(Linux/Mac/WSL):

1
fwknop -n default && ssh root@<服务器IP>

后记

后期如需更换密钥:重新生成 KEY_BASE64/HMAC_KEY_BASE64 → 更新 access.conf → systemctl restart fwknop-server → 更新所有客户端 .fwknoprc

还有很多功能没有使用,你可以通过查阅官方文档自行探索,当然也可以看看我提供的中文文档fwknop_spa_docs_v1.0

fwknop_spa_docs_v1.0费了不少劲,希望对你有所帮助

 

鸣心/Write

使用fwknop使你的服务隐身
https://b.wihi.top/posts/64093bca.html
作者
鸣心
发布于
2026年7月20日
许可协议