使用端口敲门隐藏 SSH
开放的 SSH 端口会收到来自整个互联网的登录尝试。端口敲门会让端口保持关闭,直到您证明自己知道一个秘密——随后仅为您的地址打开几秒钟。
使用 knockd 和 nftables
默认丢弃 SSH 流量,仅接受来自设有超时的集合中地址的流量。knockd 会将敲门地址添加至该集合;超时结束时,nftables 会将其移除,而已建立的 SSH 会话会继续正常工作。
table inet filter {
set knocked4 {
type ipv4_addr
flags timeout
}
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif "lo" accept
tcp dport 22 ip saddr @knocked4 accept
}
} 用于填充该集合的 knockd 配置段:
[openSSH]
sequence = 7311:tcp,8822:tcp,9133:udp
seq_timeout = 10
tcpflags = syn
start_command = /usr/sbin/nft add element inet filter knocked4 { %IP% timeout 30s } 将永久访问权限分开管理
如果还要永久允许某些地址,请将它们放在不设超时的单独集合中。再次添加已在设有超时的集合中的同一地址,不会重置该地址的超时,因此在同一集合中混用这两类条目,可能会在计时器结束时将您锁在门外。
或使用 fwknop
fwknop SPA 比序列更强大:一个经过加密和认证、无法被重放的数据包。请参阅 fwknop 指南。
从您的 iPhone 连接到 SSH
- 1长按黄铜门环。Secret Knock 会检查端口 22 是否响应,并显示它还能保持打开状态多久。
- 2打开 SSH 会通过服务器的 ssh:// 链接打开您的 SSH 应用。
- 3在窗口即将结束前、门仍显示在屏幕上时,“显示此门的页面时保持门打开”会再次敲门。
GitHub 上的所有示例 → 本页面上的每项配置均可直接复制:github.com/mobilcomm/secretknock-examples(公共领域)。
问题
这能替代 SSH 密钥吗?
不能。端口敲门用于隐藏服务;同时请继续使用高强度 SSH 密钥,并禁用密码登录。