基于Fail2ban及iptables的SSH端口爆破防御方案

news2024/11/13 23:25:45

君衍.

  • 一、本篇介绍
  • 二、Fail2ban
    • 1、简介
    • 2、工作方式
    • 3、优缺点
    • 4、工作原理
    • 5、目录结构
    • 6、功能特点
  • 三、更改默认SSH端口
    • 1、更改配置文件
    • 2、重启服务
  • 四、SSH日志审计
    • 1、连接失败的IP
    • 2、失败IP次数排行
    • 3、连接成功的IP
    • 4、成功IP次数排行
  • 五、Fail2ban
    • 1、安装
    • 2、配置
    • 3、日志查看
    • 4、命令补充
    • 5、与1panel联动配置
  • 六、蜜罐伪造22端口

一、本篇介绍

本文目的: 由于本人测试环境在公网上搭建完成,因此收到了很多关于SSH默认22端口的暴力破解攻击。记录关于SSH默认端口的防御思路及维护,比如:更改SSH默认端口、对SSH产生的日志文件进行审计、使用iptables或者别的防火墙比如ufw对爆破IP进行封禁、安装Fail2ban来实现对SSH端口登录策略防护、甚至更改默认端口后,使用蜜罐来伪造22端口迷惑部分技术不成熟的黑客。


上图可以看到,92.118.39.14对SSH端口进行了持续爆破,所以,在公网环境下,还是有必要对SSH端口进行防御。
登录方式为密码登录,不想使用密钥登录的话,可以采取以下措施进行SSH端口防护,当然依旧存在安全风险;建议是直接使用密钥登录,安全风险更低。

二、Fail2ban

1、简介

Fail2Ban 是一款入侵防御软件,旨在保护计算机系统免受恶意攻击和暴力破解。它通过监视系统日志文件,检测到多次失败的登录尝试、恶意行为或其他不寻常活动,然后采取预先配置的措施来应对这些威胁,比如暂时封禁攻击者的 IP 地址。它是用 Python 编程语言编写的。Fail2Ban 基于auth 日志文件工作,默认情况下它会扫描所有 auth 日志文件,如 /var/log/auth.log等,并禁止带有恶意标志的IP,比如密码失败太多,寻找漏洞等等标志。
通常,Fail2Ban 用于更新防火墙规则,用于在指定的时间内拒绝 IP 地址。 它也会发送邮件通知。Fail2Ban 为各种服务提供了许多过滤器,如ssh、apache、nginx、squid、named、mysql、nagios等。Fail2Ban 能够降低错误认证尝试的速度,但是它不能消除弱认证带来的风险。

2、工作方式

  1. 监视日志文件:Fail2ban 会监视指定的日志文件,例如 SSH、HTTP、FTP 等服务的日志文件。
  2. 匹配规则:Fail2ban 会根据用户定义的规则(也称为“过滤器”)对日志文件进行匹配。规则通常基于正则表达式,以识别恶意行为,例如登录失败尝试、恶意请求等。
  3. 触发响应:当匹配到规则时,Fail2ban 会触发定义的响应操作,例如将攻击者的 IP 地址添加到防火墙规则中以阻止其访问,或向管理员发送电子邮件报警。
  4. 自动解封:Fail2ban 还提供了自动解封功能,可以在一段时间后自动解封被阻止的 IP 地址,以避免误阻止合法用户。

3、优缺点

优点:

  • 自动化阻止恶意行为,减轻管理员的工作负担。
  • 可以根据用户定义的规则进行灵活配置。
  • 支持自动解封功能,避免误阻止合法用户。
  • 可以与其他安全工具(例如防火墙)集成使用,提高安全性。

缺点:

  • 对于一些高级的攻击行为可能无法有效防御。
  • 在某些情况下可能会误阻止合法用户,例如当多个用户共享同一 IP 地址时。
  • 需要一定的配置和管理工作,以保证其有效性和安全性。

4、工作原理

可以通过监控日志文件(例如 /var/log/auth.log)来帮助保护服务器免受暴力攻击。该软件可以检测到多次登录系统的失败尝试,然后在一定时间内自动禁止违规 IP 地址。Fail2ban 可以执行各种操作,包括更新 Iptable 防火墙规则、将 IP 地址添加到 TCP Wrapper 的 hosts.deny表、发送电子邮件通知以及执行任何用户定义的操作。

5、目录结构

/etc/fail2ban/
├── action.d # 各种动作,默认自带很多常用的
│    ├── dummy.conf
│    ├── hostsdeny.conf
│    ├── iptables.conf
│    ├── mail-whois.conf    
│    ├── mail.conf
│    ├── shorewall.conf
│    └── xxxxx.conf
│    .......
├── fail2ban.conf  # 默认缺省配置
├── fail2ban.d # 启动目录
├── filter.d # 各种过滤器,默认自带很多常用的
│    ├── apache-auth.conf
│    ├── apache-noscript.conf
│    ├── couriersmtp.conf
│    ├── postfix.conf
│    ├── proftpd.conf
│    ├── qmail.conf
│    ├── sasl.conf
│    ├── sshd.conf            
│    └── xxxxx.conf
│    .......
├── jail.conf # 默认监视配置
└─  jail.d
     └── defaults-debian.conf           ## SSH 相关配置

6、功能特点

  • 监视日志文件:Fail2Ban 主要通过监视系统的日志文件来检测潜在的安全问题。它可以监视 SSH、FTP、SMTP 等服务的日志文件,并分析其中的登录尝试、错误信息等。
  • 基于规则的匹配:Fail2Ban 使用基于正则表达式的规则来匹配日志文件中的事件。通过配置适当的规则,可以识别恶意行为,如暴力破解密码、拒绝服务攻击等。
  • 自动封禁:一旦 Fail2Ban 检测到恶意行为,例如多次失败的登录尝试,它会自动封禁攻击者的 IP 地址。封禁可以是暂时的,也可以是永久的,具体取决于配置。
  • 灵活的配置:Fail2Ban 的配置非常灵活,可以根据特定的需求和威胁模式进行定制。用户可以配置规则、封禁时长、白名单等参数,以适应不同的环境和安全策略。
  • 日志和报告:Fail2Ban 提供了详细的日志和报告,记录了检测到的事件、封禁的 IP 地址以及采取的措施。这些日志和报告对于审计和调查安全事件非常有用。

三、更改默认SSH端口

1、更改配置文件

需要更改SSH端口,我们需要先找到SSH的配置文件,默认在/etc/ssh/sshd_config

vim /etc/ssh/sshd_config


修改为:

这里将注释符去掉,将端口改为5454,这里我随便写的端口,然后退出保存。

2、重启服务

CentOS重启SSH命令:

systemctl retsart sshd

Ubuntu重启SSH命令:

service ssh restart

重启之后,即可更改成功,可以使用netstat -ntlp查看下。

四、SSH日志审计

SSH的日志在/var/log/auth.log路径下,同时我们需要分析字段,然后构建查询语句来查看访问排行成功与失败的IP地址。

Jul  8 14:39:12 hcss-ecs-3adb sshd[66409]: Invalid user gxf from 92.118.39.14 port 33068
Jul  8 14:39:12 hcss-ecs-3adb sshd[66409]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:12 hcss-ecs-3adb sshd[66409]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:13 hcss-ecs-3adb sshd[66411]: Invalid user mm_pf from 92.118.39.14 port 34842
Jul  8 14:39:13 hcss-ecs-3adb sshd[66415]: Accepted password for root from 111.18.40.254 port 32709 ssh2
Jul  8 14:39:13 hcss-ecs-3adb sshd[66415]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Jul  8 14:39:13 hcss-ecs-3adb systemd-logind[589]: New session 1031 of user root.
Jul  8 14:39:13 hcss-ecs-3adb sshd[66411]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:13 hcss-ecs-3adb sshd[66411]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:13 hcss-ecs-3adb sshd[66413]: Invalid user userzhhp from 92.118.39.14 port 35502
Jul  8 14:39:14 hcss-ecs-3adb sshd[66417]: Invalid user afl from 92.118.39.14 port 35580
Jul  8 14:39:14 hcss-ecs-3adb sshd[66413]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:14 hcss-ecs-3adb sshd[66413]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:14 hcss-ecs-3adb sshd[66417]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:14 hcss-ecs-3adb sshd[66417]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:15 hcss-ecs-3adb sshd[66409]: Failed password for invalid user gxf from 92.118.39.14 port 33068 ssh2
Jul  8 14:39:15 hcss-ecs-3adb sshd[66411]: Failed password for invalid user mm_pf from 92.118.39.14 port 34842 ssh2
Jul  8 14:39:16 hcss-ecs-3adb sshd[66411]: Connection closed by invalid user mm_pf 92.118.39.14 port 34842 [preauth]
Jul  8 14:39:16 hcss-ecs-3adb sshd[66413]: Failed password for invalid user userzhhp from 92.118.39.14 port 35502 ssh2
Jul  8 14:39:16 hcss-ecs-3adb sshd[66417]: Failed password for invalid user afl from 92.118.39.14 port 35580 ssh2

1、连接失败的IP

查询语句:

grep "Failed password for invalid user" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

解释:

  • 1、使用 grep 过滤日志条目:首先,使用 grep 过滤出所有尝试连接 SSH 端口并失败的日志条目。
grep "Failed password for invalid user" /var/log/auth.log
  • 2、提取 IP 地址:然后,从这些日志条目中提取出 IP 地址。
grep "Failed password for invalid user" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

awk '{print $(NF-3)}':这部分命令使用 awk 提取出每条日志中倒数第 4 列,即 IP 地址。
sort | uniq:对提取出的 IP 地址进行排序并去重,以确保每个地址只显示一次。

2、失败IP次数排行

查询语句:

grep "Failed password for invalid user" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr
  • grep "Failed password for invalid user" /var/log/auth.log:筛选出包含 "Failed password for invalid user" 的日志条目,即所有登录尝试失败的记录。
  • awk '{print $(NF-3)}':使用 awk 提取出每行日志中的倒数第 4 列,即 IP 地址。
  • sort | uniq -c:首先使用 sort 对提取出的 IP 地址进行排序,然后使用 uniq -c 统计每个 IP 地址出现的次数。
  • sort -nr:最后一步使用 sort -nr 对统计出的次数进行逆序排序(从高到低),这样输出中出现次数最多的 IP 地址将排在最前面。

3、连接成功的IP

查询语句:

grep "Accepted password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

解释:

  • 1、使用 grep 过滤日志条目:首先,使用 grep 过滤出所有成功连接 SSH 端口的日志条目。
grep "Accepted password" /var/log/auth.log
  • 2、提取 IP 地址:然后,从这些日志条目中提取出 IP 地址。
grep "Accepted password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

awk '{print $(NF-3)}':这部分命令使用 awk 提取出每条日志中倒数第 4 列,即 IP 地址。
sort | uniq:对提取出的 IP 地址进行排序并去重,以确保每个地址只显示一次。

4、成功IP次数排行

查询语句:

grep "Accepted password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr


当然,其他查询语句还需自行结合日志字段进行编辑。

五、Fail2ban

1、安装

CentOS/RedHat安装方式:

  • 1、安装apel源:
yum install -y epel-release

  • 2、安装Fail2ban
yum install -y fail2ban

  • 3、启动Fail2ban服务
systemctl start fail2ban
  • 4、开机自启动
systemctl enable fail2ban
  • 5、查看Fail2ban服务状态
systemctl status fail2ban


Ubuntu/Debian安装方式:

  • 1、安装 Fail2ban
sudo apt-get install fail2ban
  • 2、Debian 12 及以上的版本需要手动安装 rsyslog
sudo apt-get install rsyslog
  • 3、启动 Fail2ban 服务
sudo systemctl start fail2ban
  • 4、开机自启动
sudo systemctl enable fail2ban
  • 5、查看 Fail2ban 服务状态。
sudo systemctl status fail2ban

2、配置

(如果嫌自己配置麻烦,可以往下滑看与1panel进行联动,图形化配置,只需要上面安装成功就可。)
jail.conf 是主配置文件,包含所有可用选项。它包含 HTTP、SSH、FTP、Webmail、WebApplications 等服务的配置文件。
一般不建议直接更改 jail.conf 文件。可以拷贝一个新的 jail.local 文件来管理 SSH 的安全,这样可以轻松跟踪 jail,并最大限度地减少错误配置的机会。
这里简单解读下jail.conf配置文件:

......
[DEFAULT ]
bantime = 10m					## 禁止时长,默认10分钟
findtime = 10m					## 执行操作的窗口时长,默认10分钟
maxretry =5					## 最大尝试次数
backend = auto					## 指定用于获取文件修改的后端
usedns = warn		
logencoding = auto
enabled = false					## jails 默认关闭,在自定义的 .local 中打开需要用到的项
mode = normal					## 过滤器类型
filter = %( name )s [mode=%(mode)s ]		## 定义过滤器
destemail =root@localhost				## 通知将被发送到的电子邮件地址
sender = root@					## 发件人姓名
mta =sendmail					## 邮件传输代理(默认是 sendmail,可以改成 mail)
protocol = tcp
chain = <known/chain>
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = iptables-multiport			## 动作的捷径,用于定义动作参数
banaction_allports = iptables-allports
action_abuseipdb =abuseipdb
......
action = %(action_)s

所以这里我们先创建一个jail.local文件来存储我们自己编写的规则。

touch jail.local

这里可以自定义SSH防护规则,编辑jail.local文件,路径默认在/etc/fail2ban下进行查找:

接着编辑jail.local文件,复制粘贴如下,之后进行解读:

#DEFAULT-START
[DEFAULT]
bantime = 600
findtime = 300
maxretry = 5
banaction = ufw
action = %(action_mwl)s
#DEFAULT-END

[sshd]
ignoreip = 127.0.0.1/8
enabled = true
filter = sshd
port = 22
maxretry = 3
findtime = 300
bantime = 60m
banaction = ufw
action = %(action_mwl)s
logpath = /var/log/auth.log


各个参数介绍:

  • bantime:主机被禁止的秒数。
  • findtime:如果主机在“findtime”期间生成了“maxretry”,则会被禁止。
  • maxretry:主机被禁止之前的失败次数。
  • ignoreip:fail2ban 将忽略的 IP 地址,白名单地址。
  • port:服务名称或端口。
  • logpath:fail2ban 检查的日志文件路径。

更改完之后需要重启服务即可生效,可以使用如下命令操作:

systemctl restart fail2ban.service

最后我们查看jail2ban服务状态:

systemctl status fail2ban.service

3、日志查看

默认日志路径在/var/log/fail2ban.log
这里我展示下别人爆破我所产生的日志:

可以看到这里由于该IP地址疯狂爆破已经被禁了,同时,之后再进行ssh,已经连接不上了。
同时,我们也可以使用命令来查看被封禁的IP地址以及jail详细信息:

fail2ban-client status sshd

4、命令补充

1、解除IP封禁:

fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx

2、查看fail2ban版本号:

fail2ban-server -V


3、清除所有被禁的IP地址:

fail2ban-client unban --all

4、重启配置:

fail2ban-client reload

5、与1panel联动配置

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。(之后我们会详细介绍,同时与其他产品进行联动,发挥其防护效果以及优势)
官方网站: https://1panel.cn/docs/installation/online_installation/
使用这个配置方式只需要安装好fail2ban就行,然后安装1panel运维管理面板:
环境要求:
安装前请确保您的系统符合安装条件:

  • 操作系统:支持主流 Linux 发行版本(基于 Debian / RedHat,包括国产操作系统);
  • 服务器架构:x86_64、aarch64、armv7l、ppc64le、s390x;
  • 内存要求:建议可用内存在 1GB 以上;
  • 浏览器要求:请使用 Chrome、FireFox、IE10+、Edge等现代浏览器;
  • 可访问互联网。
# 一键安装命令:
# CentOS:
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sh quick_start.sh
# Ubuntu:
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

使用这个工具需要用到容器,从容器中拉去镜像,不过容器使用以上命令没有安装也会自行安装。

安装好之后,使用IP加端口加安全入口的形式访问,安全入口之后可以改变。

访问之后,界面类似上图

这里如果安装了fail2ban会检测到,然后直接在界面中图形化配置,尝试登录次数以及封禁时间等信息,比较方便。
同时,我们也可以通过日志审计模块,登录日志看到所有成功失败登录的可视化日志:

这里简单扩展下,该1panel的管理Web界面我们同时也需要对其进行防护,我这里使用雷池WAF对管理的端口进行了反代,使流量先过雷池WAF检测,然后到1panel管理界面,防止有恶意攻击入侵。

六、蜜罐伪造22端口

当然,这里也可以伪造22端口蜜罐,从而造成22端口为SSH端口的假象,迷惑一些技术不成熟的黑客,或者一些脚本探测,从而观察其攻击方式以及payload。从我在公网环境下测试可以看到,SSH蜜罐还是挺受欢迎的。
该蜜罐为HFish开源社区型蜜罐,官网手册: https://hfish.net/#/README
感兴趣的可以自行安装测试,做好资产梳理,端口规划,同时对硬件配置与WAF,1panel联动可能需要一定的硬件配置。


以上是个人对于SSH端口的防御方案,希望可以帮助到各位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)

跑 jekins任务的服务器不能连接外网下载依赖包&#xff0c;就将本地下载的 node_modules直接上传到服务器上&#xff0c;但是运行时node-sass模块报错了ERROR in Missing binding /root/component/node_modules/node-sass/vendor/linux-x64-48/binding.node >> 报错信息类…

matlab PID tuner整定工具箱的用法

从主页的APP中搜索到它&#xff1a; 按照下图IMPORT导入被控对象的传递函数 在下图的Inspect按钮中可以看到导入的被控对象的传函。 在下图的Type中选择控制器类型&#xff1a; 在下图的Form中选择PID的形式&#xff1a;有两种可选&#xff1a;平行式Parallel和标准式Standard …

0基础学会在亚马逊云科技AWS上利用SageMaker、PEFT和LoRA高效微调AI大语言模型(含具体教程和代码)

项目简介&#xff1a; 小李哥今天将继续介绍亚马逊云科技AWS云计算平台上的前沿前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS上的AI软甲开发最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon SageMaker上…

深度学习概览

引言 深度学习的定义与背景 深度学习是机器学习的一个子领域&#xff0c;涉及使用多层神经网络分析和学习复杂的数据模式。深度学习的基础可以追溯到20世纪80年代&#xff0c;但真正的发展和广泛应用是在21世纪初。计算能力的提升和大数据的可用性使得深度学习在许多领域取得…

ARM功耗管理标准接口之SCMI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface 下图示例说明了实现…

【算法笔记自学】第 10 章 提高篇(4)——图算法专题

10.1图的定义和相关术语 #include <cstdio>const int MAXN 100; int degree[MAXN] {0};int main() {int n, m, u, v;scanf("%d%d", &n, &m);for (int j 0; j < m; j) {scanf("%d%d", &u, &v);degree[u];degree[v];}for (int i…

怎么减少pdf的MB,怎么减少pdf的大小

在数字化时代&#xff0c;pdf文件因其格式稳定、跨平台兼容性强等特点而广受欢迎。然而&#xff0c;随着内容的丰富&#xff0c;pdf文件的大小也日益增大&#xff0c;给文件传输和存储带来了不少困扰。本文将为你介绍多种减小pdf文件大小的方法&#xff0c;帮助你轻松应对这一问…

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…

Hadoop3:HDFS-存储优化之纠删码

一、集群环境 集群一共5个节点&#xff0c;102/103/104/105/106 二、纠删码原理 1、简介 HDFS默认情况下&#xff0c;一个文件有3个副本&#xff0c;这样提高了数据的可靠性&#xff0c;但也带来了2倍的冗余开销。Hadoop3.x引入了纠删码&#xff0c;采用计算的方式&#x…

Python爬虫速成之路(3):下载图片

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

[GXYCTF2019]BabySQli

原题目描述&#xff1a;刚学完sqli&#xff0c;我才知道万能口令这么危险&#xff0c;还好我进行了防护&#xff0c;还用md5哈希了密码&#xff01; 我看到是个黑盒先想着搞一份源码 我dirsearch明明扫到了.git&#xff0c;算了直接注入试试看 随便输入了两个东西&#xff0c…

pico+unity3d项目配置

重点&#xff1a;unity编辑器版本要和pico的sdk要求一致、比如&#xff1a; 对于 Unity 2022.1.14 及以上版本&#xff0c;若同时在项目中使用 URP、Linear 色彩空间、四倍抗锯齿和OpenGL&#xff0c;会出现崩溃。该问题待 Unity 引擎解决。对于 Unity 2022&#xff0c;若同时…

植物神经紊乱?别怕!这些维生素来帮你!

最近收到好多小伙伴的私信&#xff0c;说自己有植物神经紊乱的困扰&#xff0c;不知道该肿么办&#xff1f;别急别急&#xff0c;我给你们来一波大福利&#x1f381;&#xff01;今天就来聊聊植物神经紊乱患者应该补充哪些维生素&#xff0c;让你的身体重回最佳状态&#xff01…

SC.Pandas 03 | 如何使用Pandas分析时间序列数据?

Introduction 前两期我们对Pandas的数据结构和常用的计算方法进行了介绍&#xff0c;在地球科学领域时间序列分析是很重要的一种数据处理方式。 通过理解数据的时间变化特征&#xff0c;我们可以更深入地理解研究对象的演化规律与物理机制。 因此&#xff0c;本期我们就从Pa…

安装cnpm失败

20240714 安装cnpm失败&#xff0c;报错如下&#xff1a; 失败原因&#xff1a; 请求 https://registry.npm.taobao.org 失败&#xff0c;原因&#xff1a;证书已过期 使用以下命令&#xff1a; npm install -g cnpm --registryhttps://registry.npmmirror.com另外&#xff0…

1.33、激活可视化卷积神经网络(matalb)

1、激活可视化卷积神经网络原理及流程 激活可视化&#xff08;Activation Visualization&#xff09;指的是通过可视化神经网络中激活函数的输出&#xff0c;来理解神经网络是如何学习并提取特征的过程。在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;我们可以通过…

【ROS2】中级:RViz-构建自定义 RViz 显示

背景 在 RViz 中有许多类型的数据已经有现有的可视化。然而&#xff0c;如果有一种消息类型尚未有插件来显示它&#xff0c;那么有两种选择可以在 RViz 中查看它。 将消息转换为另一种类型&#xff0c;例如 visualization_msgs/Marker 。编写自定义 RViz 显示。 使用第一个选项…

成为CMake砖家(5): VSCode CMake Tools 插件基本使用

大家好&#xff0c;我是白鱼。 之前提到过&#xff0c;白鱼的主力 编辑器/IDE 是 VSCode&#xff0c; 也提到过使用 CMake Language Support 搭配 dotnet 执行 CMakeLists.txt 语法高亮。 对于阅读 CMakeLists.txt 脚本&#xff0c; 这足够了。 而在 C/C 开发过程中&#xff…

数据结构(单链表(2))

单链表的实现 SList.h 由于代码中已有大量注释&#xff0c;所以该文章主要起到补充说明作用。 &#xfeff;#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>//定义链表&#xff08;结点&#xff09;的结构typedef int SLTDataType…

MySQL in 太多过慢的 3 种解决方案

文章目录 解决方案一&#xff1a;使用 JOIN 替代 IN示例&#xff1a; 解决方案二&#xff1a;分批处理 IN 子句示例&#xff1a; 解决方案三&#xff1a;使用临时表示例&#xff1a; 总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)…