1. 什么是Port Knocking 端口碰撞(敲门)
端口碰撞是一种通过在一组预先指定的关闭端口上产生连接请求,从外部打开防火墙上的端口的方法。一旦收到正确的连接请求序列,防火墙规则就会被动态修改,以允许发送连接请求的主机通过特定端口进行连接。
在Linux中称为 Knockd服务,该服务通过动态的添加iptables规则来隐藏系统开启的端口,使用自定义的一系列序列号来“敲门”,使系统开启需要访问的服务端口,才能对外访问。不使用时,再使用自定义的序列号来“关门”,将端口关闭,不对外监听。进一步提升了服务和系统的安全性。
端口碰撞的主要目的是防止攻击者通过进行端口扫描来扫描系统中潜在的可利用服务,因为除非攻击者发送正确的碰撞序列,否则受保护的端口将显示为关闭。
例子:
在扫描某台服务器的开放端口时,22端口ssh服务是被过滤的,并且无法进行ssh连接。在这台服务器上设置:同一个用户依次对1024,2024,3024端口进行访问,则开启22端口,并允许外部机器进行访问。
2. 如何进行端口碰撞
2.1 knock命令
安装knockd服务:sudo apt install knockd
启动knockd服务:systemctl start knockd
配置knockd服务:
$ vim /etc/knockd.conf
[options]
# UseSyslog
LogFile = var/knock/knock.log
[openSSH]
# 定义敲门暗号顺序
sequence = 1024,2024,3024
# 设置超时时间,时间太小可能会出错
seq_timeout = 30
# 设置敲门成功后所执行的命令
# 在ubuntu系统iptables规则默认是禁止所有的规则,如果直接添加规则默认是在drop all规则之后,因此需要先删除drop all的规则再添加所要设置的规则,最后重新添加drop all的规则。
# command = /sbin/iptables -D INPUT -p tcp --dport 22 -j DROP && /sbin/iptables -A INPUT -s [允许远程的IP] -p tcp --dport 22 -j ACCEPT && /sbin/iptables -A INPUT -p tcp --dport 22 -j DROP
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 3024,2024,1024
seq_timeout = 30
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[openHTTPS]
sequence = 12345,54321,24680,13579
seq_timeout = 5
command = /usr/local/sbin/knock_add -i -c INPUT -p tcp -d 443 -f %IP%
tcpflags = syn
配置文件的一些说明:
- openssh是开启端口的设置,closessh是关闭端口的设置。
- sequence 按照顺序依次访问端口,command执行的条件。比如这里是依次访问7000, 8000, 9000端口,默认使用TCP访问。
- command 当knockd监测到sequence端口访问完成,然后执行此处command,这里为通过iptables开启关闭ssh外部访问。
使用:knock <IP> <PORT1> <PORT2> <PORT3> <PORT4> -v
上面的例子中,开启22端口则执行:knock 192.168.22.14 1024 2024 3024 -v
上面的例子中,关闭22端口则执行:knock 192.168.22.14 3024 2024 1024 -v
2.2 nmap命令
开启端口,使用nmap依次指定端口进行扫描:
nmap 192.168.22.14 -p 1024
nmap 192.168.22.14 -p 2024
nmap 192.168.22.14 -p 3024
关闭端口:
nmap 192.168.22.14 -p 3024
nmap 192.168.22.14 -p 2024
nmap 192.168.22.14 -p 1024
2.3 telnet命令
开启端口,使用telnet依次访问端口:
telnet 192.168.22.14 1024
telnet 192.168.22.14 2024
telnet 192.168.22.14 3024
关闭端口:
telnet 192.168.22.14 3024
telnet 192.168.22.14 2024
telnet 192.168.22.14 1024
2.4 nc命令
开启端口,使用nc依次访问端口:nc -z 192.168.22.14 1024 2024 3024
关闭端口:nc -z 192.168.22.14 3024 2024 1024