宁德市网站建设_网站建设公司_会员系统_seo优化
2025/12/20 15:55:12 网站建设 项目流程

1. 什么是Port Knocking 端口碰撞(敲门)

敲门协议本质上是一种通过预定义的端口序列来控制防火墙规则的技术。服务器上的某些端口(比如SSH的22端口)默认是关闭的,只有当客户端按照正确的顺序访问指定端口后,防火墙才会临时开放目标端口。

这种技术最大的好处就是可以让你的服务器在网络扫描中完全隐身。黑客用nmap扫描的时候,会发现你的服务器上没有任何开放的端口,就像一个"幽灵服务器"一样。

端口碰撞是一种通过在一组预先指定的[关闭端口]上产生连接请求,从外部打开防火墙上的端口的方法。一旦收到正确的连接请求序列,防火墙规则就会被动态修改,以允许发送连接请求的主机通过特定端口进行连接。

在Linux中称为 Knockd服务,该服务通过动态的添加iptables规则来隐藏系统开启的端口,使用自定义的一系列序列号来“敲门”,使系统开启需要访问的服务端口,才能对外访问。不使用时,再使用自定义的序列号来“关门”,将端口关闭,不对外监听。进一步提升了服务和系统的安全性。

端口碰撞的主要目的是防止攻击者通过进行端口扫描来扫描系统中潜在的可利用服务,因为除非攻击者发送正确的碰撞序列,否则受保护的端口将显示为关闭。

敲门协议的工作流程其实不复杂,但是实现起来需要一些技巧。当你配置好敲门协议后,服务器会监听网络流量,寻找特定的端口访问模式。比如说,你设置的敲门序列是:先访问1234端口,然后访问5678端口,最后访问9999端口。服务器上运行着一个守护进程,它会记录每个IP地址的端口访问历史。当某个IP按照正确的顺序访问了这三个端口后,守护进程就会修改防火墙规则,临时开放SSH端口(或者其他你想要开放的端口)给这个IP地址。这个过程有点像是在玩密室逃脱游戏,你需要按照正确的顺序触发机关,最后的门才会打开。不过这里有个细节需要注意,敲门的端口访问通常是有时间限制的。如果你敲门的间隔太长,服务器可能会重置计数器,你就需要重新开始敲门序列。

例子:

在扫描某台服务器的开放端口时,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]# UseSyslogLogFile = 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 DROPcommand     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPTtcpflags    = syn[closeSSH]sequence    = 3024,2024,1024seq_timeout = 30command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPTtcpflags    = syn[openHTTPS]sequence    = 12345,54321,24680,13579seq_timeout = 5command     = /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

在[Rocky Linux]release 8.10上安装knockd很简单,需要先启用EPEL仓库:

sudo dnf install epel-release -y 
sudo dnf install knock-server -y

Rocky Linux默认使用firewalld作为防火墙管理工具,但是knockd更适合直接操作iptables。所以我一般会这样配置:

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo dnf install iptables-services -y
sudo systemctl enable iptables
sudo systemctl start iptables

但是配置文件就比较有讲究了。knockd的配置文件在/etc/knockd.conf,我当时的配置大概是这样的:

[root@webtest ~]# cat /etc/knockd.conf[options]UseSysloginterface = ens33
[openSSH]sequence    = 7000,8000,9000seq_timeout = 5command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPTtcpflags    = syn[closeSSH]sequence    = 9000,8000,7000seq_timeout = 5command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPTtcpflags    = syn

这个配置定义了两个敲门序列:一个用来开启SSH访问,一个用来关闭SSH访问。开启的序列是7000-8000-9000,关闭的序列是反过来的9000-8000-7000。

但是实际使用中发现了一个问题:如果你忘记了关闭序列,或者网络中断了,那个临时的防火墙规则就会一直存在。后来我加了一个定时任务,每隔一段时间自动清理这些临时规则。

还有一个坑是关于防火墙的。我们服务器上同时运行着ufw和iptables,结果knockd添加的规则被ufw给覆盖了。折腾了半天才发现这个问题,最后统一使用iptables来管理防火墙规则。

小脚本来自动敲门:

#!/bin/bash
HOST=$1
for port in 7000 8000 9000; donc -z $HOST $portsleep 1
done
ssh $HOST

这个脚本用nc命令快速检测端口,然后直接尝试SSH连接。

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
AI构建项目bash123

关闭端口:

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询