前言
众所周知,在公网上多暴露一个端口,就会多增加一份安全风险,那么如何能降低这类情况的安全风险呢,直接能想到的解决方案就是将端口隐藏起来,这里就将介绍到一种将端口隐藏在公网中的技术,叫端口敲门(Port knocking)。
端口敲门
详解端口敲门技术简单的讲就是从外按预先设定好的顺序,尝试访问服务器上一组闭合的端口。一旦服务器收到了正确的连接尝试序列,就会动态修改防火墙规则,以允许发送连接的主机尝试通过特定端口进行连接。这个特定端口就是我们想要隐藏的真正端口。
这里举一个例子,有一台主机要对服务器进行远程ssh访问,但目标服务器并没有开启22端口,这时主机尝试对服务器的某些特定的端口按一定顺序访问,如访问1001,1002,1004,1003。当服务器接收到特定的端口访问请求后,如果验证通过,则修改防火墙规则,开放出22端口,此时这台主机就能对服务器进行链接了。
端口敲门的优势与劣势
·优势:
直观的来说,这项技术很好的隐藏了端口,降低了端口被直接攻击的风险。就算攻击者知道了目标服务器使用了这项技术隐藏了端口,也要进行大量爆破,爆破条件极其困难。在没有正确的端口访问情况下,被隐藏端口的服务是没有开启的,而运行端口敲门服务的进程不直接提供端口访问,这将会让攻击者十分头疼。
·缺点:
这项技术在2004年就有论文讲述了如何实现,但在如今尚未存在广泛应用,可发现其中也是存在许多不足。首先就是不能确定端口敲门服务程序是否能稳健运行,当服务出现故障时,那么即使尝试链接了正确序列的端口,也无法开放被隐藏服务端口了。这就需要存在一个守护进程,在端口敲门服务进程出现问题时进行重启。其次还有个很严重的问题就是非常依赖网络环境,如果网络环境是高延迟的,那么这项服务则很可能出现问题。
端口敲门服务的实现
前面讲了这么多废话,也要具体讲讲这项技术如何实现,网上有不少教程,我这里整理了一下。
一:实验环境
服务器:kali 192.168.1.6
客户机:Ubuntu 192.168.1.8
用客户机ssh连接服务器:192.168.1.6
二:服务器Kali上安装配置端口敲门服务
1、安装knockd1
2apt-get install update
apt-get install knockd -y
2、配置knockd服务:
vim /etc/knockd.conf
· sequence 设置为自己想要的端口序列。
· 将seq_timeout 设置为30,以免超时时间过小出错。
· command为要添加的防火墙命令,在openSSH下插入一条开启22端口的防火墙规则 -I 为插入到最前面,最先生效,以防止过滤所有端口的情况将此条规则吃掉。closeSSH下为删除(-D)之前插入到开启22的规则,此处的iptables规则可根据需要自行定义,我的设置如下:
3、配置/etc/default/knockd,修改START_KNOCKD=1。
4、启动knockd。
service knockd start
5、添加适当的iptables规则(实际应用的时候,应该更具需要写入iptables规则文件中,可永久保存)
· 确保服务器可通过本地主机接口与自己对话:
1 | iptables -A INPUT -s 127.0.0.0/8 -j ACCEPT |
·本次测试中,阻塞所有进入服务器的通信:1
iptables -A INPUT -j DROP
·查看添加到iptables规则:1
iptables -L -n
此时ssh已经无法连接。
6、使用7777/8888/9999队列号敲门登录:
这里可以使用nmap进行登陆:1
for x in 7777 8888 9999; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x 192.168.1.6;done
可看到kali服务器上的iptables多了一条规则,此时22端口开启。
这样就能ssh重新连接上。
7、使用9999/8888/7777队列号关门1
for x in 9999 8888 7777; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x 192.168.1.6;done
此时看到之前的iptables规则被删除,回到不能访问的状态。
此时ssh已经连接不上。
结语
总而言之,有时增加系统的安全性时,会降低一部分用户友好性,本来可以直接连接的端口现在要经过一个更复杂的过程,这也给己方人员造成不便,但如果考虑到系统的绝密性,也是有用处的。也可以作为一个出题思路,放在CTF比赛中,应该也会很有趣。