内容区域
Port knocking
(发表日期: 2009-9-21 5:09am, 总访问量: 468, 今天访问: 2, 本周访问: 9, 本月访问: 37)

..

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 这一项,可惜它的实作指令也有些语法写错,我按它的指令操作,没试成功。

Multiple-port knocking Netfilter/IPtables only implementation

Port knocking (Wiki)