首页 > 系统相关 >linux中的knockd服务--端口敲门

linux中的knockd服务--端口敲门

时间:2024-09-07 22:47:28浏览次数:4  
标签:iptables -- 端口 tcp command knockd linux INPUT

什么是端口碰撞(敲门)

端口碰撞是一种通过在一组预先指定的端口上产生连接请求,从外部打开防火墙上的端口的方法。

一旦收到正确的连接请求序列,防火墙规则就会被动态修改,以允许发送连接请求的主机通过特定端口进行连接。

在Linux中称为 Knockd服务,该服务通过动态的添加iptables规则来隐藏系统开启的端口,使用自定义的一系列端口号来“敲门”,使系统开启需要访问的服务端口,才能对外访问。

不使用时,再使用自定义的端口号来“关门”,将端口关闭,不对外监听。进一步提升了服务和系统的安全性。

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

例子:

在扫描某台服务器的开放端口时,22端口ssh服务是被过滤的,并且无法进行ssh连接。在这台服务器上设置:同一个用户依次对1024,2024,3024端口进行访问,则开启22端口,并允许外部机器进行访问。

安装

apt install knockd

修改配置文件

基础配置

cat /etc/knockd.conf

[options]
	UseSyslog

[openSSH]
    # 定义敲门的端口顺序
	sequence    = 7000,8000,9000
    # 设置超时时间,时间太小可能会出错 这个超时时间指的是敲门端口之间的间隔时长,默认是5秒,可以根据实际情况,调大点
	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

[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外部访问。

注意:

  1. 默认配置上是没有配置端口的,但是端口是有默认值的,是 eth0,但是我们都知道, 只有早些时候的系统才会是 eth0 命名,例如 centOS6 甚至跟早的版本的系统,之后的版本的端口都基本不是这么命名的,所以,当用默认端口启动时,一定会无法启动服务,因为会报 eth0 端口无法找到,所以首先需要添加的就是端口选项
  2. 默认配置中的command是使用的 /sbin/iptables -A XXXXX,我们都知道 -A 是追加规则的选项,而规则的匹配时从上往下匹配,所以,用追加的方式添加的规则,很可能会无法生效,所以,这里需要改成 -I,用插入的方式添加,会添加到最前面。
  3. 这里的command是当敲门顺序成功后,执行的,所以这里是使用的 ACCEPT,是放通或者允许的意思,那么,我们就需要先把防火墙的默认规则设置成拒绝或者丢弃,或者在最下面添加一条默认的拒绝规则,这也是为什么我说插入规则比追加规则好的原因。

所以,这里我们需要先把防火墙的配置修改成拒绝或者丢弃

iptables -P INPUT DROP
# 或者
iptables -A INPUT -j DROP

然后,修改配置

我这里对外的网卡名称是 enp0s3

那么我的配置文件就应该是

[options]
	UseSyslog
    interface=enp0s3

[openSSH]
	sequence    = 7000,8000,9000
	seq_timeout = 30
	command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
	tcpflags    = syn

[closeSSH]
	sequence    = 9000,8000,7000
	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

启动服务

systemctl enable knockd
systemctl restart knockd

查看是否启动成功

systemctl status knockd.service

那如何敲门呢

使用knock命令

安装了 knockd 就会有这个命令

如上面的配置配置,那么我的打开22端口的命令就是

$ knock 10.1.0.200 7000 8000 9000 -v
hitting tcp 10.1.0.200:7000
hitting tcp 10.1.0.200:8000
hitting tcp 10.1.0.200:9000

而 关闭22端口的方法就是

$ knock 10.1.0.200 9000 8000 7000 -v
hitting tcp 10.1.0.200:9000
hitting tcp 10.1.0.200:8000
hitting tcp 10.1.0.200:7000

其他方法

都说nmap、telnet 、nc也可以,但是经测试,只有nc能成功,但是nc并不是每次都成功

nc的方式

nc -z 10.1.0.200 7000 8000 9000 -w 1
nc -z 10.1.0.200 9000 8000 7000 -w 1

这里使用 -w,设置超时时长为1秒,主要是为了能快速的结束,因为这几个端口其实通常都不是开放的,所以,当测试端口的时候,会一直等到超时,那很可能会超过 knockd 设置的 seq_timeout,就无法触发规则。

所以最好还是使用 knock 来敲门

其他配置示例

通过单个单元配置开启和关闭

[options]
     logfile = /var/log/knockd.log

[opencloseSSH]
     sequence      = 2222:udp,3333:tcp,4444:udp
     seq_timeout   = 15
     tcpflags      = syn,ack
     start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --syn -j ACCEPT
     cmd_timeout   = 5
     stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --syn -j ACCEPT

此示例是使用单个敲门来控制对端口22(SSH)的访问。
在收到成功的敲门后,守护进程将运行 start_command,等待 cmd_timeout 中指定的时间,然后执行 stop_command
这对于自动关闭门环后面的门很有用。敲门序列同时使用UDP和TCP端口。

通过迷惑方式来敲门

[options]
     logfile = /var/log/knockd.log

[opencloseSMTP]
     one_time_sequences = /etc/knockd/smtp_sequences
     seq_timeout        = 15
     tcpflags           = fin,!ack
     start_command      = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 25 -j ACCEPT
     cmd_timeout        = 5
     stop_command       = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 25 -j ACCEPT

此示例不使用单个固定的敲门序列来触发事件,而是使用从序列文件中提取的一组序列(一次性序列),由one_time_sequences指令指定。
每次成功爆震后,使用的序列将无效,序列文件中的下一个序列必须用于成功敲门。
这可以防止攻击者在发现序列后(例如,在嗅探网络时)进行重放攻击。

同时支持IPv6和IPv4

[options]
     logfile = /var/log/knockd.log

[opencloseSMTP]
     one_time_sequences = /etc/knockd/smtp_sequences
     seq_timeout        = 15
     tcpflags           = fin,!ack
     start_command      = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 25 -j ACCEPT
     start_command_6    = /usr/sbin/ip6tables -A INPUT -s %IP% -p tcp --dport 25 -j ACCEPT
     cmd_timeout        = 5
     stop_command       = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 25 -j ACCEPT
     stop_command_6     = /usr/sbin/ip6tables -D INPUT -s %IP% -p tcp --dport 25 -j ACCEPT

支持IPv4和IPv6的示例。可以为这两种协议中的每一种提供专用命令。

全局其他配置

  • UseSyslog 通过syslog()记录操作消息。这将在/var/log/messages或等效文件中插入日志条目。
  • LogFile = /path/to/file 将操作直接记录到文件中,通常是/var/Log/kockd.Log。
  • PidFile = /path/to/file 在守护进程模式下使用的Pidfile,默认值:/var/run/kockd.pid。
  • Interface = <interface_name> 要监听的网络接口。只需要给出它的名称,而不需要给出设备的路径(例如,“eth0”而不是“/dev/eth0”)。默认值:eth0。

标签:iptables,--,端口,tcp,command,knockd,linux,INPUT
From: https://www.cnblogs.com/guangdelw/p/18402272

相关文章

  • Qt 使用发布工具 windeployqt 来release
    https://blog.csdn.net/castlooo/article/details/140473263 windeployqt--release untitled3.exe  本文记录使用qt进行release文件目录1.windeployqt常用选项2.创建release文件夹,并将exe文件拷贝进来3.使用命令1.windeployqt常用选项选项 意义--release--n......
  • 优爱酷酷采系统软件支持批量链接采集可指定深度、资源嗅探支持10大类资源,批量下载短视
    图文详情如何批量嗅探资源采集网页链接?图像音频视频JsCssHtmlJson文档字体压缩其它自动下载链接转换仿站批量格式转换.webP,.avif格式图片下载,优爱酷酷采系统-想采就采把握精彩留住美好下载:UiCool.cn 【优爱酷酷采系统】✅链接:https://www.alipan.com/s/LxDVE3pjN......
  • 谈谈 Qt 程序安装包的大小,以及简要打包指南
    https://www.jianshu.com/p/0dd884a43de6 本文是水木社区KDE与Qt编程技术版版主的文章,我觉得写的很好,就转载过来了,原文地址:http://hgoldfish.com/blogs/article/103/)经常看到网上有些论调说Qt程序无比庞大,甚至拿.NET程序来比,说Qt程序打包以后跟.NET安装包差不多大。......
  • main() 方法
    根据Java语言规范,main()方法必须被申明为public。在Java1.4及之后的版本中,Java解释器强制要求main()方法必须是public。Java语言规范(JavaLanguageandVirtualMachineSpecifications)public:被JVM调用,访问权限足够大。static:被JVM调用,不用创建对象,直接类名访......
  • C语言程序与设计第四版课后习题 - 1~8章大合集
    前言本文章是一个大合集,按照课后习题的命名方式命名,方便寻找,只需要在目录上点相对应的题号即可在这里插入图片描述第一章课后习题1.1编写一个C程序题目概述:请参照本章例题,编写一个C程序,输出一下信息:*****************************Verygood!*************......
  • AtCoder Beginner Contest 370
    A-RaiseBothHands(abc370A)题目大意给出Snuke举的左右手情况,如果只举左手,输出Yes,如果只举右手,输出No,否则输出Invalid。解题思路逐一判断即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with......
  • C语言操作符详解2(含结构体、整型提升、算术转换)
    文章目录一、逗号表达式二、下标访问操作符[]、函数调用操作符()1.下标访问操作符[]2.函数调用操作符三、结构成员访问操作符1.结构体2.结构的声明3.结构体变量的定义和初始化(1)结构体变量的定义(2)结构体变量的初始化4.结构成员访问符(1)结构成员的直接访问(2)结构成员的间接......
  • Designing Data-Intensive Applications
    《DesigningData-IntensiveApplications》是一本深入探讨数据密集型应用设计的书籍,由MartinKleppmann撰写。以下是对这本书的详细概述:书籍简介:作者信息:MartinKleppmann是一位在分布式系统领域的研究员,曾在LinkedIn和Rapportive等互联网公司工作,参与大规模数据基础设......
  • 【Effective Java】多构造器参数使用构建器 (快速上手)
    Java系列文章目录补充内容Windows通过SSH连接Linux第一章Linux基本命令的学习与Linux历史文章目录Java系列文章目录一、前言二、学习内容:2.1为什么引入构建器2.2建造者模式2.2.1书中的例子2.2.2例子加上有效性检查三、问题描述四、解决方案:4.1类层次结构4.2......
  • 寄存器映射及地址计算(STM32F407)
    上篇文章介绍了存储器映射(存储器映射(STM32F407)-CSDN博客),本文介绍寄存器映射的基本概念。1、寄存器映射简介寄存器是一类特殊的存储器,它的每个位都有特定的功能,可以实现对外设/功能的控制,给寄存器的地址命名的过程就叫寄存器映射。举个简单的例子,大家家里面的纸张就好比通用......