設定 fwknop 伺服器
fwknop 單一封包授權會讓 SSH 維持關閉,直到收到一個經加密及驗證的 UDP 封包為止。以下步驟會在 Debian 或 Ubuntu 伺服器上完成設定;請先從電腦進行測試,再將相同的金鑰加入 Secret Knock。
1. 安裝並產生金鑰
安裝伺服器與用戶端,然後產生金鑰組。請保留輸出內容:相同的兩個金鑰會用於 access.conf 和 Secret Knock。
sudo apt install fwknop-server fwknop-client
fwknop --key-gen # prints KEY_BASE64 and HMAC_KEY_BASE64 2. 允許 SPA 封包使用 SSH
access.conf 定義有效封包可開啟的存取權限,以及開啟持續的時間。
SOURCE ANY
OPEN_PORTS tcp/22
KEY_BASE64 <output of fwknop --key-gen>
HMAC_KEY_BASE64 <output of fwknop --key-gen>
FW_ACCESS_TIMEOUT 30 3. 指定 fwknopd 的監聽位置
fwknopd 會在網路介面上擷取封包;不需要開放連接埠。請設定伺服器使用的網路介面。
# /etc/fwknop/fwknopd.conf
PCAP_INTF eth0;
PCAP_FILTER udp port 62201;
MAX_SPA_PACKET_AGE 120; 4. 預設關閉 SSH
執行這項操作時請保持 SSH 工作階段開啟,並在登出前透過第二個連線進行測試。fwknopd 會在 INPUT 的最上方插入自己的鏈,並針對每個有效封包在該鏈中加入具時限的 ACCEPT 規則。
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP 5. 測試,然後新增門
重新啟動 fwknop-server,從另一部電腦傳送封包並連線:
# from another machine: request SSH for the address the server sees (-R)
fwknop -A tcp/22 -R -D server.example.com \
--key-base64-rijndael "<KEY_BASE64>" --key-base64-hmac "<HMAC_KEY_BASE64>"
ssh [email protected] - 1在 Secret Knock 中:新增門 › 從範本開始 › fwknop,輸入主機,然後使用「貼上來自 fwknop --key-gen 的金鑰」貼上 fwknop --key-gen 的輸出內容。
- 2敲門;當連接埠 22 有回應時,門會顯示「門微開」。
- 3若沒有出現,請在伺服器上執行 fwknopd -f -v;疑難排解指南列出了常見原因。
GitHub 上的所有範例 → 本頁的每項設定皆可直接複製:github.com/mobilcomm/secretknock-examples(公眾領域)。
問題
fwknopd 需要開放連接埠嗎?
不需要。它會從網路介面讀取封包,因此 SPA 連接埠可在防火牆中保持關閉;封包只需要能抵達伺服器即可。