Port knocking

Port knocking 目前尚未有個正式的中文翻譯名詞,但大陸有人將它翻成 "端口碰撞" 技術。我簡單的說一下它的原理,以往我們要連 22 port (ssh) 時,必須在防火牆上打洞,開放 22 port 讓人連進來。 Port knocking 的原理就是 22 port 平時是關閉的,你必須先敲某一個port,再敲某一個 port 之後,  22 port 才會為你打開。這樣就有效的保護了 22 port 的安全性了。用 port scan 等工具也掃不到 22 port ,因為平時是關閉的。


目前此法只適用 linux 的 iptables
以下內容,紅字部份皆為指令或是您需要修改的內容 ,藍字部份則為設定檔內容。

iptables 防火牆的設定如下

iptables -N door
#新增一個叫做 door 的 chain。
iptables -A door -m recent --name knock1 --remove
#把進來door chain裡的封包,除去標籤名為 knock1 的封包。
iptables -A door -m recent --set --name knock2
#把進來door chain裡的封包,貼上標籤名為 knock2 的封包。
iptables -A INPUT -p tcp --dport 168 -m recent --set --name knock1
#把連線目標埠為168的封包,貼上 knock1 的標籤。
iptables -A INPUT -p tcp --dport 978 -m recent --rcheck --name knock1 -j door
#把連線目標埠為978、同時也要有貼著 knock1標籤的封包,送到 door 處理
#===> 也就是移去knock1標籤、然後被貼上 knock2 標籤。
iptables -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name knock2 -j ACCEPT
#被貼上 knock2 標籤的封包,同時也想連我的 22 port 時,讓它通過。

它的概念是,你在5秒內正確的連168port再接978port的一個連線封包會被依次貼上 knock1再清除,再被貼上 knock2 的標籤,有著 knock2 的標籤後,才能通過22 port 。
註意:不需要再在 iptables 內特別為168 和 978 port 打洞了,所以不要再多加這樣的兩行
iptables -A INPUT -i eth0 -p tcp --dport 168 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 978 -j ACCEPT
↑這樣會使你的 port knocking 設定不會成功的。
至於要怎麼敲 168 port 和 978 port 呢?
telnet 192.168.0.136 168
telnet 192.168.0.136 978
用這樣的指令就能敲port了。


參考資料:
Portknocking 觀念與 iptables 實作技術以保護SSH等公開服務
↑此文 Port knocking 觀念介紹寫的不錯,可惜實作的指令有些錯誤,我看了好久,才看明白,重覆試了好多次並改了指令後才試成功。
Top 20 OpenSSH Server Best Security Practices
↑請看 #18 這一項,可惜它的實作指令也有些語法寫錯,我按它的指令操作,沒試成功。

留言

這個網誌中的熱門文章

vim 的取代置換功能「s」

Wi-Fi Multimedia (WMM)

CoAP基礎