如何在 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、拷贝证书…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
