跳至内容
Secret Knock

使用端口敲门隐藏 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
    }
}
/etc/nftables.conf(摘录)

用于填充该集合的 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 }
/etc/knockd.conf

将永久访问权限分开管理

如果还要永久允许某些地址,请将它们放在不设超时的单独集合中。再次添加已在设有超时的集合中的同一地址,不会重置该地址的超时,因此在同一集合中混用这两类条目,可能会在计时器结束时将您锁在门外。

或使用 fwknop

fwknop SPA 比序列更强大:一个经过加密和认证、无法被重放的数据包。请参阅 fwknop 指南。

从您的 iPhone 连接到 SSH

  1. 1长按黄铜门环。Secret Knock 会检查端口 22 是否响应,并显示它还能保持打开状态多久。
  2. 2打开 SSH 会通过服务器的 ssh:// 链接打开您的 SSH 应用。
  3. 3在窗口即将结束前、门仍显示在屏幕上时,“显示此门的页面时保持门打开”会再次敲门。

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

问题

这能替代 SSH 密钥吗?

不能。端口敲门用于隐藏服务;同时请继续使用高强度 SSH 密钥,并禁用密码登录。

适用于您设置的指南