[5] 一篇文章教会你如何实现端口敲门

1. 描述

端口敲门技术(Prot Knocking)技术,用于通过一系列预定的端口来动态地打开防火墙或访问特定服务甚至执行一小段任务,用于增强系统地安全性,防止未授权访问。

2. 基本原理

  1. 隐藏服务: 通过关闭服务的默认端口(如 SSH 的 22 端口),并通过敲门技术来隐藏服务,使其不易被发现。
  2. 敲门序列: 用户需要按照特定的顺序向服务器发送连接请求(“敲门”),每个请求对应一个特定的端口。只有在成功发送了正确的敲门序列后,服务器才会打开目标服务的端口。
  3. 防火墙规则:防火墙通过监控端口访问请求来识别敲门序列,一旦检测到正确的序列,防火墙规则会暂时修改,允许来自该用户的连接请求访问特定端口。

3. 优点

  • 安全性: 通过隐藏服务和动态打开端口,增加了未授权访问的难度。
  • 灵活性: 可以根据需要设置敲门序列,提高安全策略的灵活性

4. 缺点

  • 如果攻击者能够监控网络流量,可能会捕捉到敲门序列,从而伪装成合法用户。
  • 每次访问都需要经过敲门过程,可能会导致连接延迟

5. 实现过程

#安全knock服务
yum install -y knock-server
# 检验是否启动成功
systemctl status knockd

安装成功执行systemctl status knockd应该显示这个内容。

image.png

# 设置开启自启动
systemctl enable knockd
# 启动
systemctl start knockd

接下来开始编辑/etc/knockd.conf配置文件,下面这个是默认的配置文件内容

[options]
        UseSyslog

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

介绍一下默认配置:

  • UseSyslog: 启用系统日志功能,用于记录端口敲门时间和相关信息。
  • sequence: sequence = 2222:udp,3333:tcp,4444:udp, 这是敲门序列,定义客户端需要发送请求的端口和协议顺序,只有成功才会开放对应端口。
    • 第一个请求必须发送到UDP的2222端口
    • 第二个请求必须发送到 TCP 的 3333 端口。
    • 第三个请求必须发送到 UDP 的 4444 端口。
  • seq_timeout: 定义敲门序列的超时时间, 指定在什么时间内完成敲门序列的发送。
  • tcpflags:指示哪些 TCP 数据包将被视为有效的敲门请求。
  • start_command: 客户端发送完成的敲门序列之后执行的命令
  • cmd_timeout: start_command和stop_command执行的超时时间
  • stop_command:这个命令会在一定时间后(通常是为防止未授权访问)执行,以防止之前开放的访问权限.

下面这个是修改之后的敲门服务配置,配置了敲门关闭ssh服务端口的序列和开启ssh服务端口的配置。

[options]
        #UseSyslog
        LogFile = /var/log/knockd.log # 日志文件位置
        interface= eth0 # 网络接口

[openSSH]
        sequence      = 9999,10012,10015
        seq_timeout   = 30
        tcpflags      = syn 
        start_command = firewall-cmd --add-service=ssh --permanent;/usr/bin/firewall-cmd --reload
        cmd_timeout   = 10
        stop_command  = firewall-cmd --remove-service=ssh --permanent; /usr/bin/firewall-cmd --reload
[closeSSH]
        sequence      = 10015:tcp,10012:tcp,9999:tcp
        seq_timeout   = 30
        tcpflags      = syn 
        start_command =  firewall-cmd --remove-service=ssh --permanent; /usr/bin/firewall-cmd --reload
        cmd_timeout   = 10

你可以查看通过ip -a查看你电脑和外界通信的ip地址来进行设置文件中的interface的值。

如果你使用的是云服务器的话,别忘记在对应的云控制台,开放你指定端口序列中包含的端口哦,不然就会失败。如下图

image.png

下面这是按照的我配置进行的演示,实际过程中请使用你自己的设置和序列和ip以及端口。在测试过程中,你可以查看你设置的对应日志文件,查看过程。

# 关闭ssh端口 -c 指定次数 -p指定端口
sudo hping3 -S -p 10015 -c 1 ip; ; sudo hping3 -S -p 10012 -c 1 ip ;sudo hping3 -S -p 9999 -c 1 ip
# 开启ssh端口
sudo hping3 -S -p 9999 -c 1 ip ; sudo hping3 -S -p 10012 -c 1 ip ; sudo hping3 -S -p 10015 -c 1 ip

使用hping3 -S 代表只发送SYN包给目的主机对应端口。

6. firewall-cmd命令介绍

firewall-cmd 是用于管理 Linux 防火墙(Firewalld)的命令行工具。Firewalld 是一种动态防火墙管理工具,允许用户在运行时修改防火墙规则,而无需重启服务。firewall-cmd 提供了一种简洁的方式来添加、删除和管理防火墙规则

# 启动 
sudo systemctl start firewalld
# 关闭
sudo systemctl stop firewalld

# 查看状态
firewall-cmd --state
# 列出当前规则
firewall-cmd --list-all
#添加服务 --permanent 代表永久
sudo firewall-cmd --add-service=ssh --permanent
# 移除服务 --permanent 代表永久
sudo firewall-cmd --remove-service=ssh --permanent
## 重新加载配置,更新完规则之后调用
sudo firewall-cmd --reload

# 临时添加端口 只在当前会话中生效
sudo firewall-cmd --add-port=2222/tcp --permanent
# 添加端口
sudo firewall-cmd --add-port=2222/tcp --permanent
# 移除端口
sudo firewall-cmd --remove-port=2222/tcp --permanent

注意事项:

  • 使用 --permanent 参数使更改持久化,即在重启后依然有效。
  • 没有 --permanent 的更改是临时的,只在当前会话中有效。
  • 使用 firewall-cmd 需要相应的权限,通常需要使用 sudo

7. 写到最后

本文主要演示的主要使用端口敲门进行ssh端口的掩藏和开放,其实在start_command你可以设置为任何可用命令,比如设置其它端口80,隐藏和开放,执行每个任务等等。有无限多个利用方式,等你去进行探索。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无限码力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值