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 使用不同序列來開啟與關閉
不使用計時器時,連接埠會保持開啟,直到您敲擊關閉序列為止。雖然方便,但很容易忘記關閉,建議使用有時間限制的版本。
[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 一次性序列
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 搭配 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 } 編輯後
- 1在 Debian 與 Ubuntu 上,請在 /etc/default/knockd 中設定 knockd 要監聽的介面(KNOCKD_OPTS="-i eth0"),然後重新啟動 knockd。
- 2敲門時使用 journalctl -u knockd -f 監看運作情況。
- 3在 Secret Knock 中,+ › 從檔案輸入會將每個含有序列的區段轉為一扇門;一次性序列清單請手動輸入。
GitHub 上的所有範例 → 本頁的每項設定皆可直接複製:github.com/mobilcomm/secretknock-examples(公眾領域)。
問題
我應使用 TCP 還是 UDP 步驟?
兩者皆可。混用兩者會讓人更難從連接埠掃描猜出序列。若您的設定會檢查承載資料,UDP 步驟可在 Secret Knock 中攜帶承載資料。