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

如何在 Ubuntu 14.04 上使用 Iptables 实现基本防火墙模板

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

实施防火墙是保护服务器的重要步骤。其中很大一部分是决定强制执行对网络流量的限制的个别规则和策略。像 iptables 这样的防火墙还允许您对应用规则的结构框架发表意见。

在本指南中,我们将构建一个可以作为更复杂规则集基础的防火墙。这个防火墙主要关注于提供合理的默认设置,并建立一个鼓励易于扩展性的框架。我们将在 Ubuntu 14.04 服务器上演示这一点。

先决条件

在开始之前,您应该对您希望实施的防火墙策略有一个基本的了解。您可以按照本指南来更好地了解一些您应该考虑的事项。

为了跟随本指南,您需要访问一个配置了 sudo 权限的非 root 用户的 Ubuntu 14.04 服务器。您可以在我们的 Ubuntu 14.04 初始服务器设置指南中了解如何配置这种类型的用户。

当您完成后,请继续以下步骤。

安装持久防火墙服务

要开始,如果您还没有安装 iptables-persistent 包,您需要安装它。这将允许我们保存我们的规则集,并在启动时自动应用它们:

sudo apt-get update
sudo apt-get install iptables-persistent

在安装过程中,您将被问及是否要保存当前规则。在这里选择 “yes”。我们将稍后编辑生成的规则文件。

本指南中 IPv6 的说明

在开始之前,我们应该简要讨论一下 IPv4 与 IPv6。iptables 命令只处理 IPv4 流量。对于 IPv6 流量,使用一个名为 ip6tables 的单独的伴随工具。规则存储在单独的表和链中。对于 iptables-persistent,IPv4 规则写入和读取自 /etc/iptables/rules.v4,而 IPv6 规则保存在 /etc/iptables/rules.v6

本指南假设您的服务器主动使用 IPv6。如果您的服务不使用 IPv6,最安全的做法是完全阻止访问,正如我们在本文中将要做的那样。

实施基本防火墙策略(快速方式)

为了尽快开始运行,我们将向您展示如何直接编辑规则文件以复制并粘贴完成的防火墙策略。之后,我们将解释一般策略,并向您展示如何使用 iptables 命令来实现这些规则,而不是修改文件。

为了实施我们的防火墙策略和框架,我们将编辑 /etc/iptables/rules.v4/etc/iptables/rules.v6 文件。使用 sudo 权限在文本编辑器中打开 rules.v4 文件:

sudo nano /etc/iptables/rules.v4

在文件中,您将看到类似以下内容的文件:


# Generated by iptables-save v1.4.21 on Tue Jul 28 13:29:56 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Tue Jul 28 13:29:56 2015

将内容替换为:


*filter
# 允许所有出站流量,但默认情况下拒绝入站和转发数据包
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]# 自定义协议链
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]# 可接受的 UDP 流量# 可接受的 TCP 流量
-A TCP -p tcp --dport 22 -j ACCEPT# 可接受的 ICMP 流量# 标准接受策略
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT# 拒绝无效数据包
-A INPUT -m conntrack --ctstate INVALID -j DROP# 将流量传递到特定协议链
## 仅允许新连接(已建立和相关的连接应已处理)
## 对于 TCP,此外,仅允许新的 SYN 数据包,因为这是建立新 TCP 连接的唯一有效方法
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP# 拒绝任何已经到达此点的流量## 尝试使用协议特定的拒绝消息
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable# 提交更改
COMMIT*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

保存并关闭文件。

您可以通过输入以下命令来测试文件的语法错误。在继续之前修复任何此命令显示的语法错误:

sudo iptables-restore -t /etc/iptables/rules.v4

接下来,打开 /etc/iptables/rules.v6 文件以修改 IPv6 规则:

sudo nano /etc/iptables/rules.v6

我们可以通过替换文件的内容为以下配置来阻止所有 IPv6 流量:


*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT*raw
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT*nat
:PREROUTING DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
COMMIT*security
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT*mangle
:PREROUTING DROP [0:0]
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
COMMIT

保存并关闭文件。

要测试此文件的语法错误,我们可以使用 ip6tables-restore 命令和 -t 选项:

sudo ip6tables-restore -t /etc/iptables/rules.v6

当两个规则文件都报告没有语法错误时,您可以通过输入以下命令来应用其中的规则:

sudo service iptables-persistent reload

这将立即实施文件中概述的策略。您可以通过列出当前使用的 iptables 规则来验证这一点:

sudo iptables -S
sudo ip6tables -S

这些防火墙规则将在每次启动时重新应用。测试以确保您仍然可以登录,并且所有其他访问都被阻止。

我们一般防火墙策略的解释

在上述规则中构建的基本防火墙中,我们创建了一个可轻松调整以添加或删除规则的可扩展框架。对于 IPv4 流量,我们主要关注 filter 表中的 INPUT 链。此链将处理所有发送到我们服务器的数据包。我们还允许所有出站流量,并拒绝所有数据包转发,这只有在此服务器作为其他主机的路由器时才合适。我们在所有其他表中接受数据包,因为我们只想在本指南中过滤数据包。

一般来说,我们的规则建立了一个默认拒绝传入流量的防火墙。然后,我们开始创建例外,以排除我们希望从此策略中排除的服务和流量类型。

在主 INPUT 链中,我们添加了一些通用规则,用于处理我们确信始终以相同方式处理的流量。例如,我们始终希望拒绝被视为“无效”的数据包,并且我们始终希望允许本地回环接口上的流量以及与已建立连接相关的数据。

之后,我们根据流量使用的协议匹配流量,并将其转移到协议特定的链。这些协议特定的链旨在保存匹配并允许特定服务的规则。在此示例中,我们在 TCP 链中仅允许 SSH 服务。如果我们提供另一个服务,比如 HTTP(S) 服务器,我们也可以在这里添加例外。这些链将是大部分自定义的重点。

任何不符合通用规则或协议特定服务规则的流量都由 INPUT 链中的最后几条规则处理。我们将默认策略设置为防火墙的 DROP,这将拒绝通过我们的规则的数据包。但是,INPUT 链末尾的规则会拒绝数据包并向客户端发送一条消息,模拟服务器在该端口上没有运行服务时的响应。

对于 IPv6 流量,我们简单地拒绝所有流量。我们的服务器没有使用此协议,因此最安全的做法是根本不与流量交互。

(可选) 更新域名服务器

阻止所有 IPv6 流量可能会干扰服务器在互联网上解析事物的方式。例如,这可能会影响您使用 APT。

如果您在运行 apt-get update 时遇到以下错误:


Err http://security.ubuntu.com trusty-security InReleaseErr http://security.ubuntu.com trusty-security Release.gpgCould not resolve 'security.ubuntu.com'. . .

您应该按照以下步骤使 APT 再次正常工作。

首先,将您的域名服务器设置为外部域名服务器。以下示例使用了 Google 的域名服务器。打开 /etc/network/interfaces 进行编辑:

sudo nano /etc/network/interfaces

按照以下所示更新 dns-nameservers 行:


. . .
iface eth0 inet6 staticaddress 2604:A880:0800:0010:0000:0000:00B2:0001netmask 64gateway 2604:A880:0800:0010:0000:0000:0000:0001autoconf 0dns-nameservers 8.8.8.8 8.8.4.4

刷新您的网络设置:

sudo ifdown eth0 && sudo ifup eth0

预期输出为:


RTNETLINK answers: No such process
Waiting for DAD... Done

接下来,创建一个新的防火墙规则,以在 IPv4 可用时强制使用 IPv4。创建这个新文件:

sudo nano /etc/apt/apt.conf.d/99force-ipv4

在文件中添加以下一行:


Acquire::ForceIPv4 "true";

保存并关闭文件。现在您应该能够使用 APT 了。

使用 IPTables 命令实现我们的防火墙

现在您了解了我们构建的策略背后的一般思想,我们将介绍如何使用 iptables 命令创建这些规则。我们最终将得到与上面指定的相同规则,但我们将通过逐步添加规则来创建我们的策略。因为 iptables 立即应用每个规则,所以规则排序非常重要(我们将拒绝数据包的规则留到最后)。

重置您的防火墙

我们将首先重置我们的防火墙规则,以便了解如何从命令行构建策略。您可以通过输入以下命令来清除所有规则:

sudo service iptables-persistent flush

您可以通过输入以下命令来验证您的规则是否已重置:

sudo iptables -S

您应该看到 filter 表中的规则已经消失,并且所有链上的默认策略都设置为 ACCEPT

[secondary_label output]
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

创建特定协议的链

我们将首先创建所有特定协议的链。这些链将用于保存我们希望公开的服务的拒绝策略的规则。我们将为 UDP 流量创建一个链,为 TCP 创建一个链,为 ICMP 创建一个链:

sudo iptables -N UDP
sudo iptables -N TCP
sudo iptables -N ICMP

我们可以立即添加 SSH 流量的例外。SSH 使用 TCP,因此我们将添加一个规则,以接受目标端口为 22 的 TCP 流量到 TCP 链:

sudo iptables -A TCP -p tcp --dport 22 -j ACCEPT

如果我们想要添加其他 TCP 服务,现在可以通过替换端口号重复该命令。

创建通用接受和拒绝规则

INPUT 链中,所有传入流量开始过滤,我们需要添加我们的通用规则。这些是一些常识规则,通过接受低风险流量(本地流量和与我们已经检查的连接相关的流量)和拒绝明显无用的流量(无效数据包),为我们的防火墙设置基线。

首先,我们将创建一个例外,以接受所有属于已建立连接或与已建立连接相关的流量:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

此规则使用 conntrack 扩展,提供内部跟踪,以便 iptables 具有评估数据包的上下文,作为较大连接的一部分,而不是作为一系列离散、不相关的数据包流的上下文。TCP 是基于连接的协议,因此已建立的连接相当明确定义。对于 UDP 和其他无连接的协议,已建立的连接指的是已经看到响应的流量(原始数据包的源将是响应数据包的目的地,反之亦然)。相关连接指的是与现有连接相关联的已启动的新连接。这里的经典示例是 FTP 数据传输连接,它将与已建立的 FTP 控制连接相关联。

我们还希望允许所有源自本地回环接口的流量。这是由服务器生成并发送到服务器的流量。它被主机上的服务用于彼此通信:

sudo iptables -A INPUT -i lo -j ACCEPT

最后,我们希望拒绝所有无效数据包。数据包可能因多种原因无效。它们可能指的是不存在的连接,可能被发送到不存在的接口、地址或端口,或者可能只是格式错误。无论如何,我们将丢弃所有无效数据包,因为没有适当的处理方式,它们可能代表恶意活动:

sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

创建跳转规则到特定协议链

到目前为止,我们已经在INPUT链中创建了一些通用规则,并在特定协议链中创建了一些特定可接受服务的规则。然而,现在,流量进入INPUT链后,无法到达我们的特定协议链。

我们需要将INPUT链中的流量定向到适当的特定协议链。我们可以根据协议类型进行匹配,将其发送到正确的链中。我们还将确保数据包代表一个新连接(任何已建立或相关的连接应该已经在之前处理过)。对于TCP数据包,我们将添加额外的要求,即数据包是SYN数据包,这是开始TCP连接的唯一有效类型:

sudo iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
sudo iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

拒绝所有剩余流量

如果传递到特定协议链的数据包没有匹配任何规则,控制将被传回到INPUT链。任何到达这一点的东西都不应该被我们的防火墙允许。

我们将使用REJECT目标拒绝流量,这会向客户端发送一个响应消息。这使我们能够指定出站消息,以便我们可以模仿客户端尝试发送数据包到常规关闭端口时会收到的响应。响应取决于客户端使用的协议。

尝试到达关闭的UDP端口将导致ICMP“端口不可达”消息。我们可以通过输入以下内容来模仿这一行为:

sudo iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable

尝试在关闭端口上建立TCP连接会导致TCP RST响应:

sudo iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

对于所有其他数据包,我们可以发送ICMP“协议不可达”消息,以指示服务器不响应该类型的数据包:

sudo iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable

调整默认策略

我们添加的最后三条规则应该处理INPUT链中的所有剩余流量。然而,作为预防措施,我们应该将默认策略设置为DROP。如果此服务器未配置为路由到其他机器,则还应在FORWARD链中设置此策略:

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP

为了匹配我们的IPv6策略,将所有流量丢弃,我们可以使用以下ip6tables命令:

sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo ip6tables -P OUTPUT DROP

这应该相当接近复制我们设置的规则。

保存IPTables规则

此时,您应该测试您的防火墙规则,并确保它们覆盖了您想要阻止的流量,同时不会妨碍您的正常访问。一旦您确信您的规则行为正确,您可以保存它们,这样它们将在系统启动时自动应用。

通过输入以下内容保存您当前的规则(IPv4和IPv6):

sudo service iptables-persistent save

这将覆盖您在命令行上制定的/etc/iptables/rules.v4/etc/iptables/rules.v6文件中的策略。

结论

通过遵循本指南,无论是直接将防火墙规则粘贴到配置文件中,还是通过命令行手动应用和保存它们,您都已经创建了一个良好的起始防火墙配置。您将需要添加单独的规则来允许访问您想要提供的服务。

本指南中建立的框架应该使您能够轻松进行调整,并有助于澄清您现有的策略。查看我们的其他一些指南,了解如何使用一些流行的服务构建防火墙策略:

  • Iptables基础知识:常见防火墙规则和命令
  • 如何设置Iptables防火墙以保护服务器之间的流量
  • 如何通过Iptables在Linux网关上转发端口
  • 如何使用Nmap和Tcpdump测试您的防火墙配置

相关文章:

如何在 Ubuntu 14.04 上使用 Iptables 实现基本防火墙模板

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 实施防火墙是保护服务器的重要步骤。其中很大一部分是决定强制执行对网络流量的限制的个别规则和策略。像 iptables 这样的防火墙…...

jasypt对yml文件进行加密解密

目录 0.背景 1.依赖 2.yml文件 3.加密操作 0.背景 在日常开发中,我们一般会把账号密码以及一些用到的各种第三方服务的Access_Key都放入yml文件中,这时就有必要对yml文件进行加密处理了, jasypt是一款简单的对yml加密的工具 1.依赖 &l…...

vue3-openlayers 使用tianditu,wmts和xyz等source加载天地图切片服务

本篇介绍一下使用vue3-openlayers加载天地图切片,三种方法: 使用tianditu(ol-source-tianditu内部实现其实用的wmts)使用wmts(ol-source-wmts)使用xyz(ol-source-xyz) 1 需求 vue…...

npm、yarn、pnpm 最新国内镜像源设置和常见问题解决

1. npm 设置国内镜像源 1.1 镜像源概述 镜像源是软件包管理工具用来下载和安装软件包的服务器地址。由于网络原因,直接使用官方源可能会导致速度慢或连接失败的问题。国内镜像源可以提供更快的访问速度和更稳定的连接。 1.2 镜像源的选择 国内有许多可用的npm镜…...

Qt Object:智能即时聊天室项目

目录 1.项目介绍 2.设计思路 3.Pro文件配置 4.项目演示 5.项目开源 项目介绍 智能即时聊天室系统(AIChatProject)是一个高效、灵活的即时通讯解决方案。它融合了百度的开源大型语言模型——文心一言,通过API接口实现深度集成。系统专为聊天和…...

php,python aes加密反解

1. python版本 import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpadclass AESUtilCBC:def __init__(self, key, iv):self.key key.encode(utf-8)self.iv iv.encode(utf-8)self.pad_length AES.block_sizedef encrypt(self, data):try…...

基于Java学生选课管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…...

阅读笔记——《Large Language Model guided Protocol Fuzzing》

【参考文献】Meng R, Mirchev M, Bhme M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium (NDSS). 2024.(CCF A类会议)【注】本文仅为作者个人学习笔记&a…...

C#委托:事件驱动编程的基石

目录 了解委托 委托使用的基本步骤 声明委托(定义一个函数的原型:返回值 参数类型和个数) 根据委托定义的函数原型编写需要的方法 创建委托对象,关联“具体方法” 通过委托调用方法,而不是直接使用方法 委托对象所关联的方…...

Git的下载安装及可视化工具小乌龟

一、 Git 的下载 第1步:下载Git,下载地址:Git for Windows 这个就需要去 Git 官网下载对应系统的软件了,下载地址为 git-scm.com或者gitforwindows.org,或者阿里镜像(感谢评论区的星悸迷航同学&#…...

【面试实战】# 并发编程之线程池配置实战

1.先了解线程池的几个参数含义 corePoolSize (核心线程池大小): 作用: 指定了线程池维护的核心线程数量,即使这些线程处于空闲状态,它们也不会被回收。用途: 核心线程用于处理长期的任务,保持最低的线程数量,以减少线程的创建和…...

Pytest 读取excel文件参数化应用

本文是基于Pytest框架,读取excel中的文件,传入页面表单中,并做相应的断言实现。 1、编辑媒体需求 首先明确一下需求,我们需要对媒体的表单数据进行编辑,步骤如下: 具体表单如下图所示 1、登录 2、点击我…...

qt 一个可以拖拽的矩形

1.概要 2.代码 2.1 mycotrl.h #ifndef MYCOTRL_H #define MYCOTRL_H#include <QWidget> #include <QMouseEvent>class MyCotrl: public QWidget {Q_OBJECT public://MyCotrl();MyCotrl(QWidget *parent nullptr); protected:void paintEvent(QPaintEvent *even…...

C# 启动exe 程序

(1) publicbool Start () System.Diagnostics.Process process new System.Diagnostics.Process(); process.StartInfo.FileName "iexplore.exe"; //IE浏览器&#xff0c;可以更换 process.StartInfo.Arguments "http://www.baidu.com"; process.…...

Netty中的Reactor模型实现

Netty版本&#xff1a;4.1.17 Reactor模型是Doug Lea在《Scalable IO in Java》提出的&#xff0c;主要是针对NIO的。 其中的主从Reactor模式在Netty中的配置如下&#xff1a; EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEv…...

dll丢失应该怎么解决,总结5种解决DLL丢失问题的方法

在数字时代&#xff0c;我们与计算机的每一天都密不可分。然而&#xff0c;就像所有技术产品一样&#xff0c;我们的计算设备也时不时地会出现一些问题&#xff0c;让人头疼不已。就在上周&#xff0c;我遭遇了一个令人崩溃的技术挑战——DLL文件丢失。这个看似微不足道的小问题…...

dial tcp 10.96.0.1:443: connect: no route to host

1、创建Pod一直不成功&#xff0c;执行kubectl describe pod runtime-java-c8b465b98-47m82 查看报错 Warning FailedCreatePodSandBox 2m17s kubelet Failed to create pod sandbox: rpc error: code Unknown desc failed to setup network for…...

VScode创建ROS项目 ROS集成开发环境

ROS使用VScode创建项目步骤 1.创建ROS工作空间2.启动VScode3.VScode编译ROS4.创建ROS功能包C语言开发Python语言开发 本文章介绍了如何在Ubuntu18.04系统下搭建VScode 的ROS项目 搭建项目分为一下几个步骤&#xff1a; 1.创建ROS工作空间 创建一个demo的ROS工作空间&#xff0…...

nodejs从基础到实战学习笔记-nodejs简介

一、Node.js简介 • Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。 • Node采用Google开发的V8引擎运行js代码&#xff0c;使用事件驱动、非阻塞和异步I/O模型等技术来提高性能&#xff0c;可优化应用程序的传输量和规模。 1.1 特性 …...

2024年最新版------二进制安装部署Kubernetes(K8S)集群

Kubernetes二进制集群部署 文章目录 Kubernetes二进制集群部署资源列表基础环境一、环境准备1.1、绑定映射关系1.2、所有主机安装Docker1.3、所有主机设置iptables防火墙 二、生成通信加密证书2.1、master上成功CA证书2.2.1、创建证书存放位置并安装证书生成工具2.2.2、拷贝证书…...

【mysql】关键词搜索实现

关键词搜索实现两种方式 -- 方式1 模糊匹配搜索 -- 场景一&#xff1a;搜索出来地址内包含‘李’和‘中国’的 select * from tn_md_cust_link where address like concat (%李%) or address like concat (%中国%) -- 场景二&#xff1a;搜索地址或者名称包含 ‘181’ 的 …...

Python面试十问2

一、如何使用列表创建⼀个DataFrame # 导入pandas库 import pandas as pd# 创建一个列表&#xff0c;其中包含数据 data [[A, 1], [B, 2], [C, 3]]# 使用pandas的DataFrame()函数将列表转换为DataFrame df pd.DataFrame(data, columns[Letter, Number]) # 列名# 显示创建的…...

C# OpenCvSharp 图像处理函数-颜色通道-cvtColor

使用 OpenCvSharp 中的 cvtColor 函数进行图像颜色转换 在图像处理领域,颜色空间转换是一个非常常见的操作。OpenCvSharp 提供了一个强大的函数 cvtColor 来处理这类转换。本文将详细介绍 cvtColor 函数的使用方法,并通过具体的示例演示如何在实际项目中应用这些知识。 函数…...

总结之LangChain(三)——模型IO缓存

一、聊天模型缓存 LangChain为聊天模型提供了一个可选的缓存层。这有两个好处&#xff1a; 如果您经常多次请求相同的完成结果&#xff0c;它可以通过减少您对LLM提供程序的API调用次数来帮您节省费用。 它可以通过减少您对LLM提供程序的API调用次数来加快您的应用程序速度。…...

判断一个Java服务是不是GateWay

方法 直接在对应服务的url后变加上后缀/actuator/gateway/routes&#xff0c;看是否会返回Gateway的路由信息。 如果返回了GateWay的路由列表&#xff0c;则该服务为Gateway服务。...

三次插值曲线--插值技术

三次插值曲线 1.1.三次样条曲线 三次样条曲线的基本思想是&#xff0c;在给定的一系列点&#xff08;称为控制点或数据点&#xff09;之间&#xff0c;通过一系列三次多项式曲线段来拟合这些点&#xff0c;使得整个曲线既平滑又准确地通过所有控制点。 1.1.1.数学定义 给定…...

python循环结构

1.while 循环 语句&#xff1a; while 循环条件表达式&#xff1a; 代码块 else&#xff1a; 代码块 小练&#xff1a; 设计一百以内的偶数相加 n 0 while n < 100:n 1if n % 2 0 :print(n) 判断是不是闰年&#xff08;四年一润和百年不润&#xff0c;或者四百年一润&am…...

深入理解Netty的Pipeline机制:原理与实践详解

深入理解Netty的Pipeline机制&#xff1a;原理与实践详解 Netty是一个基于Java的高性能异步事件驱动的网络应用框架&#xff0c;广泛应用于高并发网络编程。&#xff08;学习netty请参考&#xff1a;深入浅出Netty&#xff1a;高性能网络应用框架的原理与实践&#xff09;Nett…...

直方图均衡化示例

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 图3-17...

私域电商新纪元:消费增值模式的创新与成功实践

大家好&#xff0c;我是吴军&#xff0c;很高兴能够与您分享私域电商领域的魅力与机遇。今天&#xff0c;我将为大家呈现一个令人瞩目的成功案例&#xff0c;这个案例充分展现了私域电商的巨大潜力和无限可能。 在短短一个月的时间里&#xff0c;我们的客户成功实现了业绩的飞跃…...

Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)

目录 文件字节输入流&#xff1a;每次读取多个字节 实例演示 注意事项 文件字节输入流&#xff1a;一次读取完全部字节 方式一 方式二 注意事项 文件字节输入流&#xff1a;每次读取多个字节 用到之前介绍过的常用方法&#xff1a; 实例演示 需求&#xff1a;用每次读取…...

服务器SSH 免密码登录

1. 背景 为了服务器的安全着想&#xff0c;设置的服务器密钥非常长。但是这导致每次连接服务器都需要输入一长串的密码&#xff0c;把人折腾的很痛苦&#xff0c;所以我就在想&#xff0c;能不能在终端SSH的时候无需输入密码。 windows 可以使用 xshell 软件&#xff0c;会自…...

Linux安装MySQL以及远程连接

1、Linux安装MySQL 1.1、准备解压包 MySQL5.x解压包 提取码&#xff1a;9y7n 1.2、通过rpm脚本安装 切记安装顺序&#xff1a;common --> libs --> client --> server 因为它们之间存在依赖关系&#xff0c;所以务必按照顺序安装 安装前请确保当前目录/文…...

SQL Server 数据库分页技术详解:选择最佳方法优化查询性能”。

当今数据驱动的应用程序中&#xff0c;数据库分页技术在优化查询性能和提升用户体验中扮演着重要角色。在 SQL Server 环境下&#xff0c;开发者面对大数据集时&#xff0c;常常需要选择合适的分页方法以平衡功能需求和性能优化。本文将详细介绍 SQL Server 中几种主要的分页技…...

electron录制-镜头缩放、移动

要求 1、当录屏过程中&#xff0c;鼠标点击&#xff0c;镜头应该往点击处拉近&#xff0c;等一段时间还原 2、录屏过程中&#xff0c;可能会发生多次点击&#xff0c;但是点击位置偏差大&#xff0c;可能会导致缩放之后&#xff0c;画面没出来&#xff0c;因此需要移动镜头帧 …...

红队内网攻防渗透:内网渗透之内网对抗:信息收集篇自动项目本机导出外部打点域内通讯PillagerBloodHound

红队内网攻防渗透 1. 内网自动化信息收集1.1 本机凭据收集类1.1.1、HackBrowserData 快速获取浏览器的账户密码1.1.2、Searchall 快速搜索服务器中的有关敏感信息还有浏览器的账户密码1.1.3、Pillager 适用于后渗透期间的信息收集工具,可以收集目标机器上敏感信息1.2 对外打点…...

2024最新IDEA插件开发+发布全流程 SelectCamelWords[选中驼峰单词](idea源代码)

2024最新IDEA插件开发&#xff08;发布&#xff09;-SelectCamelWords[选中驼峰单词]&#xff08;idea源代码&#xff09; 参考文档 Jetbrains Idea插件开发文档: https://plugins.jetbrains.com/docs/intellij/welcome.html代码地址&#xff1a;https://github.com/yangfeng…...

【网络安全】网络安全基础精讲 - 网络安全入门第一篇

目录 一、网络安全基础 1.1网络安全定义 1.2网络系统安全 1.3网络信息安全 1.4网络安全的威胁 1.5网络安全的特征 二、入侵方式 2.1黑客 2.1.1黑客入侵方式 2.1.2系统的威胁 2.2 IP欺骗 2.2.1 TCP等IP欺骗 2.2.2 IP欺骗可行的原因 2.3 Sniffer探测 2.4端口扫描技术…...

初识 GPT-4 和 ChatGPT

文章目录 LLM 概述理解 Transformer 架构及其在 LLM 中的作用解密 GPT 模型的标记化和预测步骤 想象这样⼀个世界&#xff1a;在这个世界里&#xff0c;你可以像和朋友聊天⼀样快速地与计算机交互。那会是怎样的体验&#xff1f;你可以创造出什么样的应用程序&#xff1f;这正是…...

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1&#xff1a;访问负索引示例2&#xff1a;访问超出上限的索引示例3&#xff1a;循环边界…...

【C++】一个极简但完整的C++程序

一、一个极简但完整的C程序 我们编写程序是为了解决问题和任务的。 1、任务&#xff1a; 某个书店将每本售出的图书的书名和出版社&#xff0c;输入到一个文件中&#xff0c;这些信息以书售出的时间顺序输入&#xff0c;每两周店主会手工计算每本书的销售量、以及每个出版社的…...

Lua迭代器详解(附加红点功能实例)

Lua迭代器详解与用法 1. 什么是迭代器2. 为什么需要理解迭代器的原理3. 迭代器的实现0. 闭包1. 有状态迭代器2. 无状态迭代器 4. 红点树系统基础 1. 什么是迭代器 迭代器是一种能让我们遍历一个集合中的所有元素的代码结构。比如常用ipairs()和pairs()。 2. 为什么需要理解迭代…...

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品

锂磷硫&#xff08;LPS&#xff09;属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫&#xff08;LPS&#xff09;&#xff0c;为非晶态材料&#xff0c;是硫化物固态电解质代表性产品之一&#xff0c;具有热稳定性好、成本较低等优点&#xff0c;在固态电解质中离子电导率较…...

PointCloudLib 点云边缘点提取 C++版本

0.实现效果 1.算法原理 PCL(Point Cloud Library)中获取点云边界的算法主要基于点云数据的几何特征和法向量信息。以下是对该算法的详细解释,按照清晰的格式进行归纳: 算法概述 PCL中的点云边界提取算法主要用于从3D点云数据中识别并提取出位于物体边界上的点。这些边界…...

【Qt】QList<QVariantMap>中数据修改

1. 问题 QList<QVariantMap> 类型中&#xff0c;修改QVariantMap中的值。 2. 代码 //有效代码1QVariantMap itemMap itemList.at(0);itemMap.insert("title", "test");itemList.replace(0, itemMap);//有效代码 2itemList.operator [](0).insert(…...

如何避免vue的url中使用hash符号?

目录 1. 安装 Vue Router 2. 配置 Vue Router 使用 history 模式 3. 更新 main.js 4. 配置服务器以支持 history 模式&#xff08;此处需要仔细测试&#xff09; a. Nginx 配置 b. Apache 配置 5. 部署并测试 总结 在 Vue.js 项目中&#xff0c;避免 URL 中出现 # 符号的…...

Java学习 - MySQL存储过程、函数和触发器练习实例

存储过程 存储过程是什么 存储过程是一组已经编译好的SQL语句存储过程优点有什么 安全 性能高 提高代码复用性创建存储过程的语法 DELIMITER $ # 不能加分号CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型) BEGIN存储过程语句块 END;$DELIMITER ;创建一个无参的存储…...

【深度神经网络 (DNN)】

深度神经网络 (DNN) 深度神经网络 (DNN) 是机器学习领域中一种强大的工具&#xff0c;它由多层神经元组成&#xff0c;能够学习复杂的数据模式&#xff0c;解决各种任务&#xff0c;如图像识别、语音识别、自然语言处理等。 DNN 的构成&#xff1a; 神经元: DNN 的基本单元&…...

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…...

解决Visual Studio Code在Ubuntu上崩溃的问题

解决Visual Studio Code在Ubuntu上崩溃的问题 我正在使用Ubuntu系统&#xff0c;每次打开Visual Studio Code时&#xff0c;只能短暂打开一秒钟&#xff0c;然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时&#xff0c;出现以下错误信息&#xff1a;…...