Port knocking 說明
Port knocking 會讓服務保持不可見,直到有人證明自己知道祕密。本指南介紹其運作方式、兩種常見實作方式 — knockd 和 fwknop — 以及實務上敲門失敗的原因。
Port knocking 的運作方式
防火牆會捨棄所有前往受保護連接埠的連線,因此掃描器看不見任何內容。一個小型常駐程式會監看抵達防火牆的流量。當某個來源位址產生預期模式時,常駐程式會加入一條防火牆規則,允許該位址連線,通常只維持短時間。
這個模式就是敲門。使用 knockd 時,它是在特定時間限制內,依指定順序連往特定連接埠的一系列嘗試。使用 fwknop 時,則是一個加密封包。
knockd:敲門序列
knockd 會在網路介面上監聽,並將連線嘗試與 /etc/knockd.conf 中的序列比對。序列可混合 TCP 和 UDP 連接埠。比對成功後,knockd 會執行指令 — 通常是針對敲門位址(%IP%)的 iptables 或 nftables 規則。
此範例會為敲門位址開啟 SSH,並在 10 秒後再次關閉。如果你的防火牆接受已建立的連線,現有 SSH 工作階段會繼續運作。
[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 請選擇自己的連接埠;切勿重複使用公開範例中的連接埠。tcpflags = syn 使 knockd 只計算帶有 SYN 旗標的封包 — 連線嘗試的第一個封包。
fwknop:Single Packet Authorization
fwknop 以一個使用 AES 加密並以 HMAC 驗證的 UDP 封包取代序列。伺服器 fwknopd 會被動擷取封包、驗證封包、確認不是重播,並為封包內的位址開啟所要求的連接埠。
使用 fwknop --key-gen 產生密鑰,並放入伺服器的 access.conf。Secret Knock 會從你的 .fwknoprc 輸入用戶端部分。
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 由於允許的位址會包含在加密封包內,SPA 可為傳送封包的位址以外的位址開啟連接埠 — 當你以使用流動數據的手機為其他地方的手提電腦敲門時相當實用。
敲門失敗的原因
- IPv4 與 IPv6:敲門透過一種位址類型送出,但 SSH 透過另一種連線。防火牆為你未使用的位址開啟了門。
- 不同的公開位址:使用流動數據、電訊商 NAT 或 VPN 時,伺服器看見的 IP 可能與你的預期不同。請檢查你的敲門來源位址。
- 重傳的 SYN:如果 TCP 敲門未獲回應,用戶端的作業系統會再次傳送相同的 SYN。我們的測試發現,knockd 0.8 會在這類重複 SYN 時重設序列,因此用戶端每次敲門都必須只傳送一次,並快速停止連線嘗試。
- 時機:在 seq_timeout 之外抵達或順序錯誤的敲門,會重新開始序列。
- 中間設備:部分網路會封鎖或改寫前往非慣用連接埠的流量,因此在家可運作的敲門,可能在酒店或辦公室網路上失敗。
安全嗎?
knockd 序列未經加密傳送;能監看你流量的人可重播它。請用它讓掃描器無法發現服務,並在 SSH 密鑰之外多加一層保護 — 不要用來取代密鑰。fwknop SPA 以加密、HMAC 和重播保護補足這個缺口,若你的流量可能遭監看,這是更好的選擇。
從 iPhone、Mac 和 Apple Watch 敲門
Secret Knock 可從 iPhone、iPad 和 Mac 傳送 knockd 序列和 fwknop SPA 封包,檢查連接埠是否回應,並開啟你的 SSH app。Apple Watch 會透過已配對的 iPhone 敲門,因為 watchOS 不允許 app 傳送原始 TCP 或 UDP 封包;遠離 iPhone 時,它可透過 HTTP 向已啟用此功能的伺服器傳送 SPA。