為何敲門無法開啟門
敲門不是從未抵達伺服器,就是以常駐程式不接受的形式抵達,或是為您未使用的位址開啟門。請從上到下逐一檢查——已依各原因出現的頻率排列。
1. 門是為另一個位址開啟
防火牆會為伺服器所見的來源位址開啟連接埠。如果您透過 IPv6 敲門,之後 SSH 卻透過 IPv4 連線——或反過來——門便會為您未使用的位址開啟。行動數據、電信業者 NAT 和 VPN 也會變更位址。
請比較 Secret Knock 在主畫面顯示的位址(「你從 … 敲門」)與伺服器日誌中的位址;若兩者不同,請為該門固定使用 IPv4 或 IPv6。
2. 封包未抵達伺服器
飯店、辦公室及行動網路有時會封鎖不常見的連接埠,而伺服器前方的雲端防火牆可能會在 knockd 或 fwknopd 看見封包前將其捨棄。敲門時,請在伺服器上監看流量:
# knockd (UseSyslog): every recognised step and the command it ran
sudo journalctl -u knockd -f
# Do the packets reach the server at all? (use your interface and ports)
sudo tcpdump -ni eth0 'tcp port 7311 or tcp port 8822 or udp port 9133'
# fwknopd in the foreground with verbose output
sudo fwknopd -f -v 3. 序列抵達時的形式不正確
- 1重傳的 SYN:當 TCP 敲門沒有回應時,用戶端的作業系統會重新傳送相同的 SYN。knockd 0.8 遇到這類重複封包時會重設序列。Secret Knock 會將每次 TCP 敲門傳送為單一 SYN,並立即停止嘗試;其他用戶端可能不會如此。
- 2時序:所有步驟必須依序在 seq_timeout 內抵達。若中間的路由器會重新排序封包,請在某個步驟之前加入短暫延遲。
- 3通訊協定:UDP 步驟必須以 UDP 傳送,TCP 步驟必須以 TCP 傳送——請依照 knockd.conf 檢查每個步驟。
- 4tcpflags = syn 會讓 knockd 忽略沒有 SYN 旗標的 TCP 封包。若未設定此項目,連往相同連接埠之連線的其他封包也會被視為命中,並可能破壞序列。
4. fwknop:金鑰、時鐘與重播
- 1兩把金鑰都必須與 access.conf 相符:Rijndael 金鑰及 HMAC 金鑰,且必須使用相同的摘要演算法(預設為 SHA-256)。
- 2fwknopd 會拒絕超過 MAX_SPA_PACKET_AGE 的封包(預設為 120 秒),因此裝置時鐘若偏差過大,所有封包都會看似過期。
- 3每個 SPA 封包只能使用一次;fwknopd 會刻意捨棄重播的封包。
- 4如果您透過 HTTP 敲門,該連接埠必須有服務可接受 TCP 連線,否則要求根本不會送出。
5. 門已開啟,但 SSH 仍然失敗
- 1規則順序:常駐程式新增的規則必須位於捨棄該連接埠之規則之前——iptables -A 會附加在既有 DROP 規則之後,因此永遠不會相符。
- 2時限:SSH 連線前,cmd_timeout 或 FW_ACCESS_TIMEOUT 已將門關閉。請在時限內連線;若您的防火牆接受已建立的連線,既有工作階段會持續運作。
- 3Secret Knock 在敲門後的連接埠檢查,會告訴您該連接埠是否曾有回應,這與 SSH 驗證是分開判斷的。
GitHub 上的所有範例 → 本頁的每項設定皆可直接複製:github.com/mobilcomm/secretknock-examples(公眾領域)。
問題
如何查看 App 實際傳送了什麼?
門的歷史記錄會顯示每次敲門的時間、結果和位址家族;編輯器也會將同一次敲門顯示為可在電腦執行的終端機指令,供您比對。