惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
V
Visual Studio Blog
宝玉的分享
宝玉的分享
IT之家
IT之家
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
I
InfoQ
B
Blog RSS Feed
T
Threatpost
博客园_首页
M
MIT News - Artificial intelligence
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Know Your Adversary
Know Your Adversary
U
Unit 42
Engineering at Meta
Engineering at Meta
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
Scott Helme
Scott Helme
T
Tor Project blog
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
S
Schneier on Security
Vercel News
Vercel News
博客园 - Franky
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
L
LangChain Blog
爱范儿
爱范儿
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
Latest news
Latest news
C
CXSECURITY Database RSS Feed - CXSecurity.com
Hugging Face - Blog
Hugging Face - Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
S
Security Affairs
A
About on SuperTechFans
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
大猫的无限游戏
大猫的无限游戏
W
WeLiveSecurity
Cisco Talos Blog
Cisco Talos Blog
罗磊的独立博客

博客园 - 哈喽哈喽111111

RockyLinux SSH 跳板转发 3389(Windows 远程桌面)完整方案 MySQL使用自带的logrotate配置日志轮转 yum方式安装redis7 nacos新加用户操作 网络运营商禁止端口信息 Linux开机启动rc.local不生效的一般解决方案 Nginx流量拷贝ngx_http_mirror_module模块使用方法详解 Adobe 修改 hosts 文件 axios 投毒与好莱坞式骗术 Linux系统在使用systemctl启动服务的失败,报错如下:Error No space left on device git submodule 的增、查、改、删 Rocky Linux 安装 Google Chrome 浏览器 “头号玩家”—— 美国技术霸权下的全球虚拟货币资产收割行动深层解析 你是第几级 AI 编程 MySQL中通过关联update将一张表的一个字段更新到另外一张表中 MySQL解除死锁 jar文件解压缩操作 设置Windows服务器远程桌面能使用多个桌面 20251024- 使用shell脚本分库定时备份MySQL数据 禁用sentinel 在 Linux 中安装和配置 NTP 服务器和 NTP 客户端 springboot配置文件关系及加载顺序 用自带的Nginx为gitlab做白名单 Rocky9和Ubuntu使用pip安装python的库mysqlclient失败解决方式 在Spring Boot Admin中根据Nacos的命名空间来区分和管理不同的环境
Linux 的 Port Knocking 端口碰撞(端口敲门)
哈喽哈喽111111 · 2025-12-20 · via 博客园 - 哈喽哈喽111111

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]
        # 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

在[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]
    UseSyslog
    interface = ens33
[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

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

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

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

小脚本来自动敲门:

#!/bin/bash
HOST=$1
for port in 7000 8000 9000; do
    nc -z $HOST $port
    sleep 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