当前位置: 首页 > news >正文

Linux 的 Port Knocking 端口碰撞(端口敲门)

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

http://www.jsqmd.com/news/115081/

相关文章:

  • 2025年MBTI人格测试官方入口选择指南:4个基于信效度数据的热门MBTI测试网站评估 - 博客万
  • 北京婚姻律师哪家好?2025-2026最新数据支撑的专业推荐指南 - 老周说教育
  • 掌握Open-AutoGLM三大调优技巧,快速提升语义解析准确率
  • 2025北京西装定制店优质推荐指南:从需求到共鸣的工艺之旅 - 真知灼见33
  • 渗透测试之SSRF漏洞原理危害、产生的原因、探测手法、防御手法、绕过手法、限制的手段
  • 从夯到拉!大模型热门岗位揭秘!传统程序员如何破局,逆袭成为 AI 时代佼佼者
  • 2025/12/20 今天学的day8的lecode的242
  • 进口热门维生素D3十大榜单:2025高口碑维生素D3品牌推荐 - 博客万
  • Open-AutoGLM定位修正黑科技(仅限内部使用的3个参数调整技巧)
  • Open-AutoGLM操作序列优化进阶:如何用动态规划实现生成路径最优解?
  • 这可能是全网最详细的黑客网络钓鱼攻击教程,一文教会你网络钓鱼的各种骚操作!
  • 位运算表
  • 渗透测试之文件上传漏洞目录穿越漏洞教程,网络安全零基础入门到精通教程!
  • Wireshark流量分析例题详解,网络安全零基础入门到精通实战教程!
  • MySQL中通过关联update将一张表的一个字段更新到另外一张表中
  • 成长路线-互联网职级体系(以阿里为例)
  • Web渗透测试之信息收集—高阶手法CDN绕过方法大全,找到你想要的真实IP地址!
  • 在PHP中实现接口多继承有哪些优缺点?
  • 2025年啤酒生产设备生产厂家权威推荐榜单:精酿啤酒设备厂家/啤酒厂设备/大型啤酒厂设备源头厂家精选 - 品牌推荐官
  • 如何做接口测试?
  • 世界上最流行的黑客漏洞扫描工具Nessus保姆级安装教程,网络安全零基础入门到精通实战!
  • ​2025胶原蛋白肽测评榜单:6大品牌真实效果报告,仙次元紧致提亮逆转肌龄 - 博客万
  • 科普一下:黑客盗QQ究竟是怎么回事?真的是用技术手段做到的吗?
  • 如何在PHP中实现接口的多继承?
  • android13避免开机进入安全模式
  • 网络安全新手入门—简单用MSF黑客工具渗透安卓手机(小白的第一次黑客渗透)
  • Spring Boot 机制一: 自动配置原理源码级深度讲解 - 教程
  • 收藏!一文读懂RAG技术核心(附大模型从入门到实战全套学习礼包)
  • 渗透测试之kali自带的SQLmap详解—重点sqlmap--tamper 使用方式详解,搞完你就很nice了
  • 【每天了解一个AI证书】CAIE认证大纲设计解析(2026年)