跳至内容
Secret Knock

knockd.conf 示例

knockd 读取 /etc/knockd.conf:一个 [options] 段,以及每扇门对应的一个段。每个段都包含一个序列、一个时间限制,以及要针对敲门地址 %IP% 运行的命令。请自行选择端口,切勿重复使用示例中的端口。

将 SSH 打开几秒钟

最常见的设置:一次敲门打开 SSH,knockd 会在 cmd_timeout 后再次将其关闭。如果防火墙接受已建立的连接,您已经打开的会话会继续正常运行。

[options]
    UseSyslog

[openSSH]
    sequence      = 7311:tcp,8822:tcp,9133:udp
    seq_timeout   = 10
    tcpflags      = syn
    start_command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout   = 10
    stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
/etc/knockd.conf

分别用于打开和关闭的序列

不使用计时器时,端口会一直保持开放,直到您敲击关闭序列。虽然方便,但也容易忘记,因此建议使用带计时器的版本。

[options]
    UseSyslog

[openSSH]
    sequence    = 7311:tcp,8822:tcp,9133:udp
    seq_timeout = 10
    tcpflags    = syn
    command     = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

[closeSSH]
    sequence    = 9133:udp,8822:tcp,7311:tcp
    seq_timeout = 10
    tcpflags    = syn
    command     = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
/etc/knockd.conf

一次性序列

除了使用一个固定序列,knockd 还可以读取包含多个序列的文件,并且每个序列只接受一次,因此无法重放已记录的敲门。Secret Knock 会保留同一份列表,并在一次已打开门的敲门后移至下一个序列。

[openSSH]
    one_time_sequences = /etc/knockd/ssh_sequences
    seq_timeout        = 10
    tcpflags           = syn
    start_command      = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout        = 10
    stop_command       = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

# /etc/knockd/ssh_sequences — one sequence per line, each used once
2222:udp,3333:tcp,4444:udp
5555:tcp,6666:udp,7777:tcp
8888:udp,9999:tcp,1111:tcp
/etc/knockd.conf 和序列文件

配合 nftables

在使用 nftables 的系统上,让 knockd 将地址添加到带超时设置的集合中;隐藏 SSH 指南展示了相应的 nftables 表。

[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

编辑后

  1. 1在 Debian 和 Ubuntu 上,请在 /etc/default/knockd 中设置 knockd 监听的接口(KNOCKD_OPTS="-i eth0"),然后重新启动 knockd。
  2. 2敲门时,使用 journalctl -u knockd -f 查看其运行情况。
  3. 3在 Secret Knock 中,+ › 从文件导入 会将每个带有序列的段导入为一扇门;一次性序列列表需要手动输入。

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

问题

我应该使用 TCP 还是 UDP 步骤?

两者都可以。混合使用可让端口扫描更难猜出序列。如果您的设置会检查负载,Secret Knock 中的 UDP 步骤可以携带负载。

适用于您设置的指南