跳至内容
Secret Knock

为什么敲门无法打开门

敲门操作要么从未到达服务器,要么到达时的形式不被守护进程接受,要么为您当前未使用的地址打开了门。请从头开始逐项检查——列表按各原因的常见程度排序。

1. 门为另一个地址打开

防火墙会为服务器看到的源地址打开端口。如果您通过 IPv6 敲门,而 SSH 随后通过 IPv4 连接——或反过来——门会为您未使用的地址打开。移动数据、运营商 NAT 和 VPN 也会改变地址。

将 Secret Knock 在主屏幕上显示的地址(“你从……敲门”)与服务器日志中的地址进行比较;如果二者不同,请为此门固定使用 IPv4 或 IPv6。

2. 数据包未到达服务器

酒店、办公室和移动网络有时会阻止非常用端口,而服务器前方的云防火墙可能会在 knockd 或 fwknopd 看到数据包之前将其丢弃。敲门时,在服务器上监视流量:

# knockd (UseSyslog): every recognised step and the command it ran
sudo journalctl -u knockd -f

# Do the packets reach the server at all? (use your interface and ports)
sudo tcpdump -ni eth0 'tcp port 7311 or tcp port 8822 or udp port 9133'

# fwknopd in the foreground with verbose output
sudo fwknopd -f -v
在服务器上

3. 序列以错误的形式到达

  1. 1重传的 SYN:当 TCP 敲门没有响应时,客户端操作系统会重新发送相同的 SYN。knockd 0.8 会在这种重复发生时重置序列。Secret Knock 将每次 TCP 敲门作为单个 SYN 发送,并立即停止此次尝试;其他客户端可能不会这样做。
  2. 2时序:所有步骤必须按顺序在 seq_timeout 内到达。如果中间路由器会重新排序数据包,请在某一步之前添加短暂延迟。
  3. 3协议:UDP 步骤必须以 UDP 发送,TCP 步骤必须以 TCP 发送——请根据 knockd.conf 检查每个步骤。
  4. 4tcpflags = syn 会让 knockd 忽略不带 SYN 标志的 TCP 数据包。没有它时,连接到同一端口的其他数据包也会被计为命中,并可能破坏序列。

4. fwknop:密钥、时钟和重放

  1. 1两个密钥都必须与 access.conf 一致:Rijndael 密钥和 HMAC 密钥,且使用相同的摘要算法(默认 SHA-256)。
  2. 2fwknopd 会拒绝生成时间距今超过 MAX_SPA_PACKET_AGE 的数据包(默认 120 秒),因此设备时钟严重不准会使每个数据包看起来都已过期。
  3. 3每个 SPA 数据包只能使用一次;fwknopd 会有意丢弃重放的数据包。
  4. 4如果您通过 HTTP 敲门,该端口必须有服务接受 TCP 连接,否则请求不会被发送。

5. 门已打开,但 SSH 仍然失败

  1. 1规则顺序:守护进程添加的规则必须位于丢弃该端口的规则之前——iptables -A 会将规则追加到现有 DROP 规则之后,因此永远不会匹配。
  2. 2时限:cmd_timeout 或 FW_ACCESS_TIMEOUT 在 SSH 连接前关闭了门。请在时限内连接;如果防火墙接受已建立的连接,已建立的会话会继续正常工作。
  3. 3敲门后,Secret Knock 的端口检查会告诉您端口是否有任何响应,这与 SSH 身份验证是分开的。

GitHub 上的所有示例 → 本页面上的每项配置均可直接复制:github.com/mobilcomm/secretknock-examples(公共领域)。

问题

如何查看 App 实际发送了什么?

门的历史记录会显示每次敲门的时间、结果和地址族;编辑器还会将同一次敲门显示为可在电脑上运行的终端命令,便于比较。

适用于您设置的指南