跳至內容
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 步驟?

兩者皆可。混用兩者會讓人更難從連接埠掃描猜出序列。若您的設定會檢查承載資料,UDP 步驟可在 Secret Knock 中攜帶承載資料。

適用於您設定的指南