端口22),而后暴力破解。
避免SSH端口被暴力破解个别有以下几种形式
1.批改默认端口22为其它端口
2.禁止明码登陆,只容许密钥登陆或者应用PAM模块开启二次认证
3.应用ipfailban屏蔽暴力登陆的IP
除了以上几种做法,还有一种平安加固的伎俩叫port knocking。如字面意思,相似‘敲门’,只是这里敲的是‘端口’,而且须要依照程序‘敲’端口。如果敲击规定匹配,则能够让防火墙实时更改策略。从而达到开关防火墙的目标。
简略的做法是装置knockd。knockd是一种端口试探服务器工具。它侦听以太网或其余可用接口上的所有流量,期待非凡序列的端口命中(port-hit)。telnet或Putty等客户软件通过向服务器上的端口发送TCP或数据包来启动端口命中。
官网:https://zeroflux.org/projects…
装置
并没有yum源,所以只能本人编译装置
<code class="bash">wget http://www.zeroflux.org/proj/knock/files/knock-0.8.tar.gz yum install libpcap-devel yum install autoconf autoreconf -fi ./configure --prefix=/usr/local make sudo make install cp knockd.conf /etc/ knockd -V
启动服务
<code class="bash">knockd -i ens192 -d -v
配置 knockd 服务
应用默认的配置文件
<code class="bash">cat /etc/knockd.conf [options] UseSyslog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
配置文件里有两个参数:
sequence:依照程序顺次拜访端口,command执行的条件。比方这里是顺次拜访7000, 8000, 9000端口,默认应用TCP拜访。
command:当knockd监测到sequence端口拜访实现,而后执行此处command,这里为通过iptables开启敞开ssh内部拜访。
结构knock sequence
- 间接手工结构
关上 SSH iptables
<code class="bash">telnet <target> 7000 telnet <target> 8000 telnet <target> 9000
敞开 SSH iptables
telnet <target> 9000 telnet <target> 8000 telnet <target> 7000
-
应用knock程序
<code class="bash">开启 knock <target> 7000 8000 9000 敞开 knock <target> 9000 8000 7000
-
NC 或者 Nmap
<code class="bash">Open: nc -z <target> 7000 8000 9000 Close: nc -z <target> 9000 8000 7000 for x in 7000 8000 9000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x <target> ; done
个别状况到这里就完了。但如果只是cv大法的话,就没必要写这篇文章了。
这里有坑
依照默认配置,我认为这样敲门knock -v 10.180.249.61 7000 8000 9000 应该是牵强附会的,后果它给我来了这个
<code class="bash">[root@manager knock-0.8]# knockd -i ens192 -v listening on ens192... 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 2 10.180.205.102: closeSSH: Stage 1 10.180.205.102: closeSSH: Stage 1 10.180.205.102: closeSSH: Stage 1 10.180.205.102: closeSSH: Stage 2 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 1
咦,它把敲门信号当成关门信号了,好吧,我把敲门端口和关门端口全副设置成不同的端口,然而,仍然是莫名微妙的输入,并不是我预料中的Stage 1,Stage 2,Stage 3 ,command这样的执行日志。能收到第一个和第二个信号,然而第三个信号无论如何都收不到。莫非前人欺我?
改成敲门,关门只接管两个信号
<code class="bash">PS C:\Windows> telnet 10.180.249.61 7000 正在连接10.180.249.61...无奈关上到主机的连贯。 在端口 7000: 连贯失败 PS C:\Windows> telnet 10.180.249.61 8000 正在连接10.180.249.61...无奈关上到主机的连贯。 在端口 8000: 连贯失败 [root@manager knock-0.8]# knockd -i ens192 -v listening on ens192... 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 1 10.180.205.102: openSSH: Stage 2 10.180.205.102: openSSH: OPEN SESAME openSSH: running command: /usr/sbin/iptables -A INPUT -s 10.180.205.102 -p tcp --dport 22 -j ACCEPT [root@manager ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.180.205.102 anywhere tcp dpt:ssh Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
也就是说,knock只能接管两个敲门信号,超过两个就会导致敲不开门,关不了门。这是一个bug吗?
概率是因为ip包达到服务器的工夫有可能是乱序的,这会导致敲门失败,如果遇到只看到open/closeSSH: Stage 1或者open/closeSSH: Stage 2,看不到opencloseSSH: Stage 3的状况,能够多试几次,或者手工顺次执行。如果还是不行,倡议查看端口是否被占用。如果最初仍然不行,论断还是属于knockd对tcp信号处理的bug,不倡议配置超出两个的敲门信号。
至于iptables的利用就不再细数了。另外,为了在重启的过程保留和复原iptables设置,咱们能够在knockd命令中减少相应的iptables-save和iptables-restore操作。
看来knock还是有肯定局限性。有没有其它工具呢。knock官网也举荐了代替工具doorman和pasmal。
简略间接不依赖三方工具实现Port-knocking
还有更简略的吗?间接用iptables就能搞定,先在服务器增加两条策略
<code class="bash">iptables \ -i eth0 \ -t raw --append PREROUTING \ -p tcp --dport 8080 --syn \ -m recent --name knocked ! --rcheck --seconds 600 \ -j DROP iptables \ -i eth0 \ -t raw --append PREROUTING \ -p udp --dport 30000 \ -m string --string "OpenSesame" --algo bm \ -m recent --name knocked --set \ -j DROP
而后测试下
<code class="bash">[root@manager ~]# yum install -y socat [root@manager ~]# curl -i --connect-timeout 5 http://146.56.248.195:8080/hello curl: (28) Connection timed out after 5001 milliseconds [root@manager ~]# echo "OpenSesame" | socat - udp4-datagram:146.56.248.195:30000 [root@manager ~]# curl -i --connect-timeout 5 http://146.56.248.195:8080/hello HTTP/1.1 200 OK Date: Tue, 27 Jul 2021 02:38:47 GMT Content-Type: text/plain Content-Length: 21 Connection: keep-alive Expires: Tue, 27 Jul 2021 02:38:46 GMT Cache-Control: no-cache content-type: text/html <h1>Hello World!</h1>[root@manager ~]#
会敲门了,置信关门也会了。
Port-knocking 并不能作为一种独立的平安进攻措施,因为它属于security by obscurity。多种策略组合,能力进步零碎的安全性