如何在 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浏览器,可以更换 process.StartInfo.Arguments "http://www.baidu.com"; process.…...
Netty中的Reactor模型实现
Netty版本:4.1.17 Reactor模型是Doug Lea在《Scalable IO in Java》提出的,主要是针对NIO的。 其中的主从Reactor模式在Netty中的配置如下: EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEv…...
dll丢失应该怎么解决,总结5种解决DLL丢失问题的方法
在数字时代,我们与计算机的每一天都密不可分。然而,就像所有技术产品一样,我们的计算设备也时不时地会出现一些问题,让人头疼不已。就在上周,我遭遇了一个令人崩溃的技术挑战——DLL文件丢失。这个看似微不足道的小问题…...
dial tcp 10.96.0.1:443: connect: no route to host
1、创建Pod一直不成功,执行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项目 搭建项目分为一下几个步骤: 1.创建ROS工作空间 创建一个demo的ROS工作空间࿰…...
nodejs从基础到实战学习笔记-nodejs简介
一、Node.js简介 • Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。 • Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。 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 模糊匹配搜索 -- 场景一:搜索出来地址内包含‘李’和‘中国’的 select * from tn_md_cust_link where address like concat (%李%) or address like concat (%中国%) -- 场景二:搜索地址或者名称包含 ‘181’ 的 …...
Python面试十问2
一、如何使用列表创建⼀个DataFrame # 导入pandas库 import pandas as pd# 创建一个列表,其中包含数据 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为聊天模型提供了一个可选的缓存层。这有两个好处: 如果您经常多次请求相同的完成结果,它可以通过减少您对LLM提供程序的API调用次数来帮您节省费用。 它可以通过减少您对LLM提供程序的API调用次数来加快您的应用程序速度。…...
判断一个Java服务是不是GateWay
方法 直接在对应服务的url后变加上后缀/actuator/gateway/routes,看是否会返回Gateway的路由信息。 如果返回了GateWay的路由列表,则该服务为Gateway服务。...
三次插值曲线--插值技术
三次插值曲线 1.1.三次样条曲线 三次样条曲线的基本思想是,在给定的一系列点(称为控制点或数据点)之间,通过一系列三次多项式曲线段来拟合这些点,使得整个曲线既平滑又准确地通过所有控制点。 1.1.1.数学定义 给定…...
python循环结构
1.while 循环 语句: while 循环条件表达式: 代码块 else: 代码块 小练: 设计一百以内的偶数相加 n 0 while n < 100:n 1if n % 2 0 :print(n) 判断是不是闰年(四年一润和百年不润,或者四百年一润&am…...
深入理解Netty的Pipeline机制:原理与实践详解
深入理解Netty的Pipeline机制:原理与实践详解 Netty是一个基于Java的高性能异步事件驱动的网络应用框架,广泛应用于高并发网络编程。(学习netty请参考:深入浅出Netty:高性能网络应用框架的原理与实践)Nett…...
直方图均衡化示例
禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 图3-17...
私域电商新纪元:消费增值模式的创新与成功实践
大家好,我是吴军,很高兴能够与您分享私域电商领域的魅力与机遇。今天,我将为大家呈现一个令人瞩目的成功案例,这个案例充分展现了私域电商的巨大潜力和无限可能。 在短短一个月的时间里,我们的客户成功实现了业绩的飞跃…...
企业网站做电脑营销/文章推广平台
问题 当物体正常展示后,设置为实体展示,却无法显示出立体的效果来,按照给出的MeshLambertMaterial材料设置的例子反复尝试都不成功 实例 var cubeGeometry new THREE.BoxGeometry(15, 15, 15); var meshMaterial new THREE.MeshLamebertM…...
深圳网站制作哪家便宜/手机建站系统
本文实例讲述了python实现连接postgresql数据库的方法。分享给大家供大家参考,具体如下:python可以通过第三方模块连接postgresql. 比较有名的有psycopg2和python3-postgresql(一)psycopg2ubuntu下安装 sudo apt-get install python3-psycopg2创建一个te…...
杭州市网站制作/什么是外链
有时候我们在使用pycharm编写python代码的时候,发现没有代码提示,怎么解决呢,下面来分享一下方法 工具/原料 pycharm 没有代码提示解决方法 方法一:检查是否关闭代码提示 1 第一步在我们的电脑上打开pycharm,输入代…...
一家做运动鞋的网站/百度站长电脑版
Internet Download Manager,全球最佳下载利器。Internet Download Manager (简称IDM) 是一款Windows 平台功能强大的多线程下载工具,国外非常受欢迎。支持断点续传,支持嗅探视频音频,接管所有浏览器,具有站点抓取、批量…...
河间市做网站/徐州百度seo排名
📢前言🌲原题样例:Excel 表列序号🌻C#方法:深度优先搜索🌻Java 方法一:二分查找💬总结🚀往期优质文章分享📢前言 🚀 算法题 🚀 &…...
做app网站公司哪家好/网站域名查询网
1.变量赋值:namelbg 等号前后不能有空格name"Lebron James" 变量值中有空格要用双引号echo ${name} 用${}更保险shopt -s -o nounset 设置“先声明再使用”2.取消变量:unset 释放变量和函数的内存3.位置参数:…...