来自wiki,关于Port Knocking的介绍:
端口试探(port knocking)是一种通过连接尝试,从外部打开原先关闭端口的方法。一旦收到正确顺序的连接尝试,防火墙就会动态打开一些特定的端口给允许尝试连接的主机。
端口试探的主要目的是防治攻击者通过端口扫描的方式对主机进行攻击。
端口试探类似于一次秘密握手协议,比如一种最基本的方式:发送一定序列的UDP、TCP数据包。当运行在主机上的daemon程序捕捉到数据包以后,如果这个序列正确,则开启相应的端口,或者防火墙允许客户端通过。
我使用的服务器系统是Ubuntu,版本是14.04。要实现的功能:客户端按一定顺序telnet自定义的一系列端口之后,打开SSH的22端口。
例:
客户端执行:
$ telnet your_ubuntu_domain_or_ip 4444
$ telnet your_ubuntu_domain_or_ip 5555
$ telnet your_ubuntu_domain_or_ip 6666
我设置的敲门顺序是4444->5555->6666,按顺序执行上面命令之后会打开Ubuntu的22号端口。
现在,可以通过ssh连接到Ubuntu服务器。
关闭22端口:
$ telnet your_ubuntu_domain_or_ip 6666
$ telnet your_ubuntu_domain_or_ip 5555
$ telnet your_ubuntu_domain_or_ip 4444
注意:一定要记住你设置的端口和顺序。一旦忘了,尤其是服务器不在身边的时候,那可就虾米了。
确保安装有如下软件包
SSH服务(如果你没有安装)
$ sudo apt-get install openssh-server
iptables防火墙(如果你没有安装)
$ sudo apt-get install iptables
$ sudo apt-get install iptables-persistent # 系统重启之后,防火墙规则不丢失
安装knockd,它是端口试探的核心软件:
$ sudo apt-get install knockd
添加防火墙规则
flush已存在的防火墙规则,不阻止对外连接
$ sudo iptables --flush
$ sudo iptables -t nat --flush
$ sudo iptables -t mangle --flush
$ sudo iptables --policy OUTPUT ACCEPT
确保允许建立连接:
$ sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
注意,STABLISHED,RELATED之间没有空格
阻止22端口的连接:
$ sudo iptables -A INPUT -p tcp --destination-port 22 -j DROP
永久保存防火墙规则:
$ sudo iptables-save
配置knockd
knocked的配置文件是/etc/knockd.conf,编辑:
$ sudo vim /etc/knockd.conf
[options]
UseSyslog
[openSSH]
sequence = 4444,5555,6666
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 6666,5555,4444
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
参数说明:
在options块中,UseSyslog很直观,记录敲门日志
openSSH和closeSSH两段,开启ssh和关闭ssh配置
自动把%IP%替换为客户端的ip地址,添加的防火墙规则允许这个ip地址连接22端口
sequence代表敲门顺序,间隔时间是5秒(seq_timeout)。
启用knockd,编辑/etc/default/knockd:
$ sudo vim /etc/default/knockd
把START_KNOCKD的值改为1:
START_KNOCKD=1
启动knockd:
$ sudo service knockd start
测试
如果按以上配置,你现在不能通过SSH直接连接服务器,因为端口被防火墙屏蔽。
使用telnet进行Port Knocking,开启22端口:
$ telnet your_ubuntu_domain_or_ip 4444 # 命令执行的间隔在5秒内
$ telnet your_ubuntu_domain_or_ip 5555
$ telnet your_ubuntu_domain_or_ip 6666
如果是Linux,使用apt安装telnet。如果是windows,安装Telnet组件(在程序和功能里)。
现在可以正常使用ssh连接了。
使用完成之后,关闭SSH连接:
$ telnet your_ubuntu_domain_or_ip 6666
$ telnet your_ubuntu_domain_or_ip 5555
$ telnet your_ubuntu_domain_or_ip 4444
经过配置Port Knocking,基本没有人可以通过ssh hack你的系统了。