网络安全(四)--Linux 主机防火墙

7.1. 介绍

防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668(A)1993-12-15)。

它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统。按照给定的规则,允许或者限制网络报文通过

本次课程重点介绍通过iptables工具添加“规则”, (主机防火墙由用户态iptables工具+内核态netfilter模块实现)

TcpWrapper 也可以达到“允许或是限制网络报文通过”的目标。一般称作轻量级防火墙,应用简单。

7.2. Iptables 主机防火墙

先看几个概念

7.2.1. 4表5链N规则

  • 基本概念

我们先看, 当客户端浏览器访问web服务器时, 一个客户端的数据报文和服务器的交互流程可简单如下图所示:

为了使防火墙达到“防火”(包过滤)的目的, 我们需要在数据报文流经的路径上,设置一下关卡: 所有进出的报文都流经这些关卡, 在“关卡”上设置“条件”, 报文经检查后,符合放行条件的才放行, 符合阻拦条件的报文被阻止。

这些关卡,在iptables中称之为, 这些条件,我们称之为规则, 所谓的配置防火墙,就是在相应的中添加规则

  • 5链

    所谓5链, 就是linux系统设置了5道关卡,分别对应于: “输入”(INPUT)、“输出”(OUTPUT)、“路由前”(PREROUTING)、“转发”(FORWARD)、“路由后”(POSTROUTING)

    一个数据报文的完整场景如下图所示:

    根据实际的场景,数据报文的流向:

    (外网)到本机的报文: PREROUTING -> INPUT

    由本机(路由器)转发的报文: PREROUTING -> FORWARD -> POSTROUTING

    本机进程发出的报文: OUTPUT -> POSTROUTING

  • 链和规则的关系

    我们把“关卡”称之为, 在关卡中我们设置规则, 还可以设置多条规则, 当我们把多条规则串到一起的时候,就形成了

    防火墙的作用呢,就是对经过的报文匹配“规则”, 然后执行对应的操作(放行、阻拦)

  • 4表

    , 为了实现特定的功能,需要在几个不同的关卡中配置相应的规则,这几个不同关卡就合称

    系统内置4个表:

    filer: 数据包过滤, INPUT、FORWARD、OUTPUT

    nat: 网络地址转换(映射),PREROUTING、INPUT、OUTPUT、POSTROUTING

    managle: 报文拆解,修改报文并重新封装:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

    raw:关闭链接追踪机制等:PREROUTING、INPUT、OUTPUT

    (新版内核中增加内置表 security)

  • 4表-5链-规则总结

表、链、 规则之间的关系,见下图

7.2.2. iptables基本用法

添加一条规则的写法

格式: iptables [-t table] COMMAND chain CRETERIA -j TARGET

  • -t table : 4表, 默认filter

    • filter
    • nat
    • ...
  • COMMAND:定义如何对规则进行管理

    • ...
  • chain: 指定

    • PREROUTING
    • INPUT
    • FORWARD
    • OUTPUT
    • POSTROUTING
  • CRETERIA: 指定匹配准则(ip、协议、端口)

    • ...
  • -j TARGET :指定如何进行处理 (DROP or ACCEPT)

    • ACCEPT 允许防火墙接收数据包
    • DROP 防火墙丢弃包

实例:不允许192.168.16.35 访问我的主机

itcast@itcast $iptables -t filter -A INPUT -s 192.168.16.35  -j DROP
7.2.2.1. COMMAND详解
  • 规则查看 -L

    • 基本格式: iptables [-t table] -L
itcast@itcast $ sudo iptables -t filter -L -n  # -n, 以点分10进制显示filter表的IP地址

itcast@itcast $ sudo iptables -t filter -L --line-numbers # --line-numbers, 显示filter表中规则的行号
  • 配置默认策略 -P

    • 基本格式:`iptables [-t table] -P chain (DROP|ACCEPT)`
itcast@itcast $ sudo iptables -t filter -P INPUT DROP  #配置filter表,INPUT链默认规则为DROP
  • 追加规则

    • 基本格式: iptables [-t table] -A chain CRETIRIA -j ACTION

    以禁止访问外网web界面为列

# 添加规则
itcast@itcast $ sudo iptables -t filter -A OUTPUT  -p tcp  --dport 80 -j DROP 
  • 删除规则

    • 基本格式: iptables [-t table] -D chain NUM

# 删除规则
itcast@itcast $ sudo iptables -t filter -L OUTPUT  --line-number #获取num
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       tcp  --  anywhere             anywhere             tcp dpt:http

itcast@itcast $ sudo iptables -t filter -D OUTPUT 1  #删除
itcast@itcast $ sudo iptables -t filter -D OUTPUT  -p tcp --dport 80 -j DROP # 也是删除

itcast@itcast $ sudo iptables -t filter -L OUTPUT --line-number  #查看
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
  • 插入规则
    • 基本格式: iptables [-t table] -R NUM chain CRETIRIA -j ACTION

# 插入规则

itcast@itcast $ sudo iptables -t filter -A OUTPUT -p tcp --dport 81 -j DROP

itcast@itcast $ sudo iptables -t filter -L  OUTPUT  --line-number 
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  anywhere             anywhere             tcp dpt:81

itcast@itcast $ sudo iptables -t filter -I OUTPUT 1 -p tcp --dport 82 -j DROP  #插入
itcast@itcast $ sudo iptables -t filter -L  OUTPUT  --line-number 
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  anywhere             anywhere             tcp dpt:82   # 82在前
2    DROP       tcp  --  anywhere             anywhere             tcp dpt:81

itcast@itcast $ sudo iptables -t filter -A OUTPUT  -p tcp --dport 83 -j DROP  ##追加
itcast@itcast $ sudo iptables -t filter -L  OUTPUT  --line-number 
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  anywhere             anywhere             tcp dpt:82
2    DROP       tcp  --  anywhere             anywhere             tcp dpt:81
3    DROP       tcp  --  anywhere             anywhere             tcp dpt:83  ##83在后
  • 清空规则 -F
    • 基本格式: iptables [-t table] -F chain
 #清空filter表中的OUTPUT链
itcast@itcast $ sudo iptables -t filter -F OUTPUT

 # 清空filter中的所有链
itcast@itcast $ sudo iptables -t filter -F
7.2.2.2. CRETERIA详解

“条件”的匹配模式很多,我们介绍两类,一类是基于IP的匹配条件,一类是基于协议的匹配条件

  • 基于IP的匹配

    基于IP匹配,就是以源地址、目标地址为匹配条件的匹配

    • -s 指定作为源地址匹配

      • IP : 192.168.16.35
      • IP/MASK: 192.168.16.0/24
    • -d 表示匹配目标地址

  • 基于协议匹配

    • -p tcp :TCP协议, 可带三种扩展

      • --dport XX-XX:指定目标端口,
      • --dport 21 指定单个端口,
      • --dport 21-23 (此时表示21,22,23)   --sport:指定源端口
    • -p udpUDP协议, 支持两种扩展

      • --dport
      • --sport
    • -p icmp: icmp数据报文, 支持一种扩展

      • --icmp-type: 指定icmp类型
      • --icmp-type echo-request : 也可以用 --icmp-type 8
  • 基于网络设备接口的匹配

    • -i eth0:从这块网卡流入的数据

      • 流入一般用在INPUT和PREROUTING上
    • -o eth0:从这块网卡流出的数据

      • 流出一般在OUTPUT和POSTROUTING上
  • 综合实例: 只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的SSHD服务
 #定义进来的:
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT

 #定义出去的:
iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
`

7.2.3. 牛刀小试

7.2.3.1. ssh远程登录实战

ssh服务端

 #  允许接受ssh客户请求
itcast@itcast $ sudo iptables -t filter -A INPUT  -p tcp  -dport 22 -j ACCEPT

 # 允许发送本地主机的SSH相应
itcast@itcast $ sudo iptables -t filter -A OUTPUT  -p tcp  -sport 22 -j ACCEPT

 # 禁止接受ssh客户请求
itcast@itcast $ sudo iptables -t filter -A INPUT  -p tcp  -dport 22 -j DROP

ssh客户端 (禁止通过ssh访问某主机, 是防止成为“跳板机”)

 # 允许发送向远程主机的SSH请求
iptables -A OUTPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

 # 禁止发送向远程主机的SSH请求
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j DROP

 # 接收的数据包源端口为22
$ iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

-m state: 启用状态匹配模块(state matching module)

–-state: 状态匹配模块的参数。 当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED

7.2.3.2. Web服务实战

服务端

  # 允许接收远程主机的HTTP请求
$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

  # 允许发送本地主机的HTTP响应
$ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

 # 允许特定IP访问

iptables -A INPUT -s 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT


浏览器端

禁止当前主机访问IP为xxx的web服务

    iptables -A OUTPUT -d 10.01.10.23 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j DROP
7.2.3.3. ping attack防护

ping attack 一般两种类型, 一种是向目标主机发送ping命令测试数据包时,目标主机都需要耗费一定的系统资源进行应答回复(DOS), 还有一种是通过把报文分割成片段,向目标主机发送大于65536字节的ICMP包,而后在目标主机上重组, 最终导致目标主机缓冲区溢出,发生瘫痪故障。

简单而有效的防护措施,在防火墙过滤到ICMP报文。

ping 发送echo-request (ICMP type 8), 如目标主机在线存活, 则接受到echo-replay (icmp type 0)

服务器端

禁止其他主机,ping 当前主机

iptables -A INPUT -p icmp --icmp-type 8 -j DROP

iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP

允许其他主机ping当前主机

        iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
        iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

客户端

禁止ping其他主机

iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP

iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP

小扩展:对于127.0.0.1比较特殊,我们需要明确定义它

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

7.2.4. 拓展知识

7.2.4.1. 规则保存和恢复

我们之前添加的防火墙规则, 当系统重启的时候都会失效。 因此系统重启后,需要有个防火墙规则恢复的操作。

  • 关机前,保存当前防火墙规则
itcast@itcast $ pwd
/home/itcast
itcast@itcast $ sudo iptables-save > ./iptables.rules
  • 开机后,恢复之前保存的防火墙规则
itcast@itcast $ sudo iptables-restore < /home/itcast/iptables.rules
7.2.4.2. 规则的生效顺序

规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

  • 牢记以下三点式理解iptables规则的关键:

    • Rules包括一个条件和一个目标(target)
    • 如果满足条件,就执行目标(target)中的规则或者特定值。
    • 如果不满足条件,就判断下一条Rules。
    • 如果全部Rules都不匹配, 则执行默认Target (系统默认ACCEPT)
  • 将默认策略改成DROP:

 $ iptables -P INPUT DROP
 $ iptables -P OUTPUT DROP
 $ iptables -P FORWARD DROP
7.2.4.3. 帮助
  • Iptables 帮助

    • man iptables
    • man iptables-externsion

7.3. TCP Wrapper: 轻量级的防火墙应用

tcp wrappers为那些链接libwrap.so库的服务,提供了 由xinetd这支superdaemon管理的服务提供了安全性。由xinetd super daemon管理的服务以及支持libwrap模块的服务都可以使用它tcp wrappers进行安全控制。

可以通过使用tcp wrappers结合防火墙(iptables)提供更加安全的系统保护。

7.3.1. tcp wrappers的配置

7.3.1.1. 配置文件

tcp wrappers的配置文件有两个,一个是/etc/hosts.allow,一个是/etc/hosts.deny。

  • /etc/hosts.allow:允许指定的客户端对指定的服务访问。

  • /etc/hosts.deny:拒绝指定的客户端对指定的服务访问。

修改完成之后,不需要重新启动服务,就会立即生效。

配置规则的有效次序

  1. 默认策略是允许 (即没有在hosts.allow和hosts.deny中出现的,允许通过。)
  2. 先查看hosts.allow
  3. 再查看hosts.deny。
7.3.1.2. 文件配置规则

每一个控制文件都可以包含多行,按照定义的顺序处理每一行,找到匹配后就跳出该规则。

以#开始的表示注释,

如果一行写不完可以使用反斜线(\),进行续行,表示上一行的延续。

hosts.allow和hosts.deny定义格式如下:

     daemon_list : client_list [ : shell_command ]
  • daemon_list: 指定由TCP wrappers需要控制的服务名称。比如 sshd, 如果该服务是由xinetd管理的服务,要写启动脚本的名称,如/etc/xinetd.d/telnet。

下述为tftp服务的配置文件:/etc/xinetd.d/tftp

如果要想使用tcp wrappers控制tftp的话,需要在hosts.allow或hosts.deny文件中,写上tftp的启动脚本:/use/sbin/in.tftpd

service tftp
{
       socket_type         = dgram
       protocol               = udp
       wait                    = yes
       user                    = root
       server                  = /usr/sbin/in.tftpd
       server_args             = -s /tftpboot
       disable                 = no
       per_source              = 11
       cps                     = 100 2
       flags                   = IPv4
}
    • client_list:指定tcpwrappers需要控制哪些客户端对哪些服务的访问。

可以用如下方法表示:

  • 单一主机:192.168.0.1,表示的是192.168.0.1这台主机。

  • 指定网段:192.168.0.或者是192.168.0.0/255.255.255.0表示的是192.168.0.0/24整个网段。

  • 指定DNS后缀:.frame.com,所有DNS后缀为.frame.com的主机。

  • 指定FQDN:server.frame.com ,表示的是FQDN为server.frame.com的主机。

  • 所有客户端:ALL

7.3.2. 牛刀小试

一般就是通过"白名单制度", 就是在hosts.deny中禁止所有的client访问,在hosts.allow中,开启允许访问的client

7.3.2.1. ssh防护实战
  • 允许 192.168.16.3访问

$ cat /etc/hosts.allow 

sshd:192.168.16.3

$ cat /etc/hosts.deny 
 ALL: ALL
  • 允许172.16.0.0/16 网段访问sshd服务(放行sshd服务)

$ cat /etc/hosts.allow 

sshd:172.16.0.0/16

$ cat /etc/hosts.deny 
 ALL: ALL


###  确认服务是否支持tcp wrappers ###

> 不是所有的服务,都支持tcp wapper, 只有链接了libwrap.so库的服务,才可以通过tcpwrapper防护。

 确认ssh是否支持tcp warpper

```bash
$ ldd /usr/sbin/sshd | grep "wrap"
    libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007fe251bed000)

上述表明sshd这个服务是支持tcp wrappers的。如果没有libwrap,则表示该服务不支持tcp wrappers。

确认xinet是否支持tcp warpper

[root@test01 ~]# ldd $(which sshd) | grep libwrap
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fa039d12000)

确认inetd是否支持tcp warpper

$ ldd /usr/sbin/tcpd  | grep wrap
    libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f23d5f4b000)
`

7.3.3. 帮助

  • TcpWrappers帮助

    • man hosts_access (or man hosts.allow)
    • man hosts_options
    • man tcpd

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity中Batching优化的动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提&#xff0c;但是如果是材质实例的话&#xff0c;则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader&#xff0c;来测试动态合批1、我们选择模型的 Mesh…

第十一节HarmonyOS 常用容器组件2-List和Grid

一、List列表组件的使用 1、简介 List是很常见的滚动类容器组件&#xff0c;一般和子组件ListItem一起使用&#xff0c;List列表中每一个列表项对应一个ListItem组件。 2、List组件使用ForEeach渲染列表 一个列表往往由多个相似的Item项组成&#xff0c;所以一个List组件中包含…

​Python Flask库:web开发神器

概要&#xff1a; Python是一种广泛应用的编程语言&#xff0c;它在Web开发领域中有着丰富的库和框架。其中&#xff0c;Flask是一款轻量级的Web应用框架&#xff0c;它简单而灵活&#xff0c;适用于从简单的静态网页到复杂的Web应用的开发。本文将详细介绍使用Python Flask库…

SpringBoot 项目 Jar 包加密,防止反编译

1场景 最近项目要求部署到其他公司的服务器上&#xff0c;但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理&#xff0c;防止客户直接通过反编译工具将代码反编译出来。 2方案 第一种方案使用代码混淆 采用proguard-maven-plugin插件 在单模块中此方案还算简…

六要素超声波气象站气象监测小能手

随着科技的发展&#xff0c;人类对天气的掌控越来越强。六要素超声波气象站成为了现代气象预测的重要工具。本文将介绍这种气象站的特点、功能和应用&#xff0c;以及它如何改变我们对天气的预测和应对方式。 一、六要素超声波气象站简介 WX-CSQX6 六要素超声波气象站是一种集…

嵌入式学习---ARM中断控制系统

目录 外部事件与CPU的交互方式查询方式中断方式 什么是中断源S3C2440支持60个中断源FIQ和IRQ 中断处理流程将外设中断通知给CPUSUBSRCPND寄存器INTSUBMSK寄存器SRCPND寄存器INTMSK寄存器INTMOD寄存器INTPND寄存器 硬件中断处理是实时系统设计的最重要、最关键的问题。 外部事件…

PyTorch 基础篇(2):线性回归(Linear Regression)

# 包import torchimport torch.nn as nnimport numpy as npimport matplotlib.pyplot as plt # 超参数设置input_size 1output_size 1num_epochs 60learning_rate 0.001 # Toy dataset # 玩具资料&#xff1a;小数据集x_train np.array([[3.3], [4.4], [5.5], [6.71], [6.…

SpringSecurity6 | 默认用户生成(下)

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

MTU TCP-MSS(转载)

MTU MTU 最大传输单元&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;用来通知对方所能接受数据服务单元的最大尺寸&#xff0c;说明发送方能够接受的有效载荷大小。 是包或帧的最大长度&#xff0c;一般以字节记。如果MTU过大&#xff0c;在碰到路由器时…

kyuubi整合flink yarn application model

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catalogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中&#xff0c;需要注意对应的版本。 注意以上版本 姊妹篇 k…

tgf - 一个开箱即用的golang游戏服务器框架

tgf框架 tgf框架是使用golang开发的一套游戏分布式框架.属于开箱即用的项目框架,目前适用于中小型团队,独立开发者,快速开发使用.框架提供了一整套开发工具,并且定义了模块开发规范.开发者只需要关注业务逻辑即可,无需关心用户并发和节点状态等复杂情况. 使用介绍 创建业务逻辑…

JavaScript面向对象编程的奥秘揭秘:掌握核心概念与设计模式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-面向对象 目录 什么是面向对象&#xff1f; 类与对象的主要区别 创建…

python+pytest接口自动化(9)-cookie绕过登录(保持登录状态)

在编写接口自动化测试用例或其他脚本的过程中&#xff0c;经常会遇到需要绕过用户名/密码或验证码登录&#xff0c;去请求接口的情况&#xff0c;一是因为有时验证码会比较复杂&#xff0c;比如有些图形验证码&#xff0c;难以通过接口的方式去处理&#xff1b;再者&#xff0c…

气膜厂家怎样确保产品质量和售后服务?

气膜厂家作为一家专业生产气膜产品的企业&#xff0c;确保产品质量和提供良好的售后服务是我们的责任和使命。为了确保产品质量和售后服务的可靠性&#xff0c;我们采取了以下措施。 起初&#xff0c;我们严格按照国家标准和相关行业规范进行生产。气膜产品的质量是产品能否长…

编织魔法世界——计算机科学的奇幻之旅

文章目录 每日一句正能量前言为什么当初选择计算机行业计算机对自己人生道路的影响后记 每日一句正能量 人生就像赛跑&#xff0c;不在乎你是否第一个到达尽头&#xff0c;而在乎你有没有跑完全程。 前言 计算机是一个神奇的领域&#xff0c;它可以让人们创造出炫酷的虚拟世界…

Linux常用命令——as命令

在线Linux命令查询工具 as 汇编语言编译器 补充说明 as命令GNU组织推出的一款汇编语言编译器&#xff0c;它支持多种不同类型的处理器。 语法 as(选项)(参数)选项 -ac&#xff1a;忽略失败条件&#xff1b; -ad&#xff1a;忽略调试指令&#xff1b; -ah&#xff1a;包括…

nVisual能为数据中心解决什么问题?

nVisual通过可视化的管理方式&#xff0c;使数据中心管理者能够有效且高效地管理数据中心的资产、线缆、容量、变更&#xff1b;使数据中心管理者能够获得如下问题的答案&#xff0c;以便能够快速做出更好、更明智的决策&#xff1a; 1&#xff0e;资产管理 我们有什么&#x…

VMware Linux(Centos)虚拟机扩容根目录磁盘空间

给VMWare虚拟机根目录扩容&#xff0c;简单有效&#xff01;_迷倒万千少女的Csir的博客-CSDN博客 https://blog.csdn.net/m0_64206944/article/details/131453844?spm1001.2014.3001.5506 上述链接融合参考下面文章 VMware Linux(Centos)虚拟机扩容根目录磁盘空间 centosli…

Redis quicklist源码+listpack源码(6.0+以上版本)

ziplist设计上的问题&#xff0c;每一次增删改都需要计算前面元素的空间和长度&#xff08;prevlen&#xff09;&#xff0c;这种设计缺陷非常明显&#xff0c;一旦其中一个entry发生修改&#xff0c;以这个entry后面开始&#xff0c;全部需要重新计算prevlen&#xff0c;因此诞…

台灯哪个品牌比较好?适合考研党的台灯推荐

眼睛作为人体非常重要的器官之一&#xff0c;它承担着接受和感知光线的功能。然而&#xff0c;长时间暴露在强光下或者不适当的光线环境下可能会对眼睛健康造成一定的影响。许多学生党以及上班族可能深有体会&#xff0c;在日常读写以及长时间面对电子产品中&#xff0c;很容易…