【DevOps】Linux 安全:iptables 组成、命令及应用场景详解

导读:全面掌握 iptables:从基础到实践

在 Linux 系统中,iptables 是一个非常强大的工具,它不仅是系统管理员用来构建和管理网络防火墙的首选工具,而且也是一个功能丰富的网络流量处理系统。无论是进行包过滤、监控网络流量、还是实现复杂的网络地址转换 (NAT),iptables 都能提供灵活的解决方案。本文将带你深入理解 iptables 的组成结构,掌握其常用命令,并通过具体的使用场景展示如何在实际中应用这些知识。

目录

导读:全面掌握 iptables:从基础到实践

一、iptables 的主要组成

表 (Tables)

链 (Chains)

规则 (Rules)

用户定义的链

二、常用 iptables 命令

基本 iptables 命令格式

查看规则

添加规则

删除规则

修改规则

插入规则

设置默认策略

保存和恢复规则

清空规则

端口重定向和 NAT

高级匹配和限速

日志记录

状态检查

时间条件匹配

接口匹配

用户自定义链

保存和加载规则

清空和重置

三、使用场景举例

1. 基本的主机防护

允许特定的服务访问

2. 防止 DDoS 攻击

限制 SSH 连接尝试

3. 端口转发

将 80 端口转发到 8080 端口

4. 网络地址转换 (NAT)

共享互联网访问

5. 日志和审计

记录被拒绝的包

6. 使用时间条件控制访问

在工作时间外允许 SSH 访问

7. 防火墙绕过

临时开放所有访问

8. 防止 ICMP 泛洪攻击

限制 ICMP 回显请求

9. 多网卡策略路由

根据源 IP 使用特定的网络接口

10. 容器和虚拟化环境

允许特定容器访问外部网络


iptables 是 Linux 操作系统中的一个非常强大的防火墙工具,它使用表格来组织防火墙规则,这些表格中的规则用于决定如何处理穿过防火墙的数据包。iptables 基于 Netfilter,Netfilter 是 Linux 内核的一个部分,负责处理通过网络栈的所有数据包。通过使用 iptables,系统管理员可以定义规则,这些规则决定了如何处理进入、穿过和离开网络的数据包。

一、iptables 的主要组成

表 (Tables)

iptables 的规则分布在不同的“表”中,这些表是处理特定类型数据包的集合。每个表包含一个或多个“链”,这些链定义了数据包流经网络栈的不同点在何处应用这些规则。

  • filter 表

    • 用途: 主要用于决定数据包的基本处理,如是否允许数据包通过。
    • 包含的链:
      • INPUT: 处理进入本机的数据包。
      • FORWARD: 处理经过本机路由到其他网络的数据包。
      • OUTPUT: 处理由本机产生的数据包。
  • nat 表

    • 用途: 用于网络地址转换(NAT),包括源地址和目标地址的转换,主要用于路由设备。
    • 包含的链:
      • PREROUTING: 用于目标地址转换(DNAT),处理进入网络接口的数据包。
      • POSTROUTING: 用于源地址转换(SNAT),处理即将离开网络接口的数据包。
      • OUTPUT: 对于生成自本地进程的数据包,处理其目标地址转换。
  • mangle 表

    • 用途: 用于修改数据包的服务类型(TOS)字段或其他 IP 头信息,主要用于特殊的路由标记。
    • 包含的链:
      • PREROUTING: 修改进入网络接口的数据包。
      • INPUT: 修改到达本机的数据包。
      • FORWARD: 修改经过本机的数据包。
      • OUTPUT: 修改本机产生的数据包。
      • POSTROUTING: 修改即将离开本机的数据包。
  • raw 表

    • 用途: 主要用于配置免除连接跟踪的数据包,可以用来提高性能。
    • 包含的链:
      • PREROUTING: 设置进入网络接口前的数据包是否避开状态跟踪。
      • OUTPUT: 设置由本机产生的数据包是否避开状态跟踪。
  • security 表

    • 用途: 用于设置强制访问控制网络规则,通常与 SELinux 安全策略配合使用。
    • 包含的链:
      • INPUT: 设置进入本机的数据包的安全标记。
      • FORWARD: 设置经过本机的数据包的安全标记。
      • OUTPUT: 设置本机产生的数据包的安全标记。
链 (Chains)

表中的每个链代表数据包处理的一个阶段。预定义的链有:

  • PREROUTING: 用于处理进入网络接口的数据包,主要用于 nat 和 mangle 表。
  • INPUT: 处理到达本机的数据包,用于 filtermangle, 和 security 表。
  • FORWARD: 处理经过本机路由到其他网络的数据包,用于 filtermangle, 和 security 表。
  • OUTPUT: 处理本机产生的数据包,用于 filternatmangleraw, 和 security 表。
  • POSTROUTING: 处理即将离开网络接口的数据包,用于 nat 和 mangle 表。
规则 (Rules)

规则定义了对特定条件下的数据包应该执行的操作。每条规则都关联到一个链,规则包含两个主要部分:

  • 匹配条件: 定义了哪些数据包会被规则匹配。匹配条件可以包括多种属性:

    • 源和目标 IP 地址 (-s-d)
    • 源和目标端口 (--sport--dport)
    • 协议类型 (-p), 如 TCP (tcp), UDP (udp), ICMP (icmp)
    • 网络接口 (-i-o)
    • 更多复杂匹配,如连接状态 (-m state --state), 包大小 (-m length --length), 时间段 (-m time --timestart)
  • 目标 (Targets): 当规则匹配到一个数据包时,定义了应采取的行动。常见的内置目标有:

    • ACCEPT: 允许数据包通过。
    • DROP: 静默丢弃数据包,不给发送方任何响应。
    • REJECT: 拒绝数据包,并向发送方发送一个错误响应。
    • LOG: 记录数据包的信息,然后继续处理该数据包。
    • MASQUERADE: 用于动态 NAT,隐藏数据包的源 IP。
    • REDIRECT: 修改数据包的目标 IP/端口为本机,用于本地端口重定向。
用户定义的链

用户可以定义自己的链来组织复杂的规则集。这允许更灵活的管理,例如创建一个专用链处理特定类型的流量,然后在预定义链中调用这个用户链。

二、常用 iptables 命令

iptables 是一个功能强大的工具,用于在 Linux 上管理网络包过滤和 NAT 规则。以下是详细解释 iptables 的常用命令和参数,帮助你更好地理解如何使用这个工具。

基本 iptables 命令格式
iptables [option] [chain] [matching criteria] [action]
  • [option]: 指定命令的选项,如 -A (添加)、-D (删除)、-L (列出) 等。
  • [chain]: 指定规则应用于哪个链,如 INPUTFORWARDOUTPUT 等。
  • [matching criteria]: 指定匹配数据包的条件,如 -p tcp (匹配 TCP 协议的数据包)。
  • [action]: 指定当匹配到数据包时执行的动作,如 -j ACCEPT (接受数据包)。
查看规则
  • 查看所有规则

    iptables -L -n -v
    
    • -L: 列出所有规则。
    • -v: 显示详细信息,包括通过每条规则的数据包和字节数。
    • -n: 使用数字显示 IP 地址和端口,不进行域名解析,以加快显示速度。
  • 查看特定表的规则

    iptables -t nat -L
    
    • -t nat: 指定要查看的表,这里是 nat 表。
添加规则
  • 允许进入的 SSH 连接

    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    
    • -A INPUT: 在 INPUT 链末尾添加规则。
    • -p tcp: 匹配 TCP 协议的数据包。
    • --dport 22: 匹配目的端口为 22 的数据包。
    • -j ACCEPT: 对匹配的数据包执行 ACCEPT 动作。
  • 允许出去的 HTTP 连接

    iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
    
    • -A OUTPUT: 在 OUTPUT 链末尾添加规则。
    • -p tcp: 匹配 TCP 协议的数据包。
    • --dport 80: 匹配目的端口为 80 的数据包。
删除规则
  • 删除特定的规则

    iptables -D INPUT -p tcp --dport 22 -j ACCEPT
    
    • -D INPUT: 从 INPUT 链删除规则。
    • 其余参数定义了要删除的规则的匹配条件和动作。
  • 按编号删除规则

    首先,使用 -L --line-numbers 查看规则及其编号:

    iptables -L INPUT -n --line-numbers
    

    然后,根据编号删除规则:

    iptables -D INPUT 1
    
    • 删除 INPUT 链中编号为 1 的规则。
修改规则
  • 使用编号修改规则

    iptables -R INPUT 1 -p tcp --dport 22 -j DROP
    
    • -R INPUT 1: 在 INPUT 链中替换编号为 1 的规则。
    • -p tcp --dport 22: 匹配 TCP 协议且目的端口为 22 的数据包。
    • -j DROP: 新的动作是丢弃数据包。
插入规则
  • 在链的特定位置插入规则

    iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
    
    • -I INPUT 1: 在 INPUT 链的第 1 位置插入规则。
    • -p tcp --dport 80: 匹配 TCP 协议且目的端口为 80 的数据包。
设置默认策略
  • 设置链的默认策略

    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    
    • -P INPUT DROP: 设置 INPUT 链的默认策略为 DROP
    • -P FORWARD DROP: 设置 FORWARD 链的默认策略为 DROP
    • -P OUTPUT ACCEPT: 设置 OUTPUT 链的默认策略为 ACCEPT
保存和恢复规则
  • 保存当前的规则

    iptables-save > /etc/iptables.rules
    
    • iptables-save: 输出当前的 iptables 规则。
    • 重定向到 /etc/iptables.rules 文件中保存。
  • 从文件恢复规则

    iptables-restore < /etc/iptables.rules
    
    • iptables-restore: 从输入读取规则并应用。
    • /etc/iptables.rules: 包含要恢复的规则。
清空规则
  • 清空所有规则

    iptables -F
    
    • -F: 清空(Flush)所有链的所有规则。
  • 清空特定表的规则

    iptables -t nat -F
    
    • -t nat: 指定清空 nat 表的规则。
  • 删除所有非默认链

    iptables -X
    
    • -X: 删除所有用户定义的链。
端口重定向和 NAT
  • 将外部端口 80 重定向到本地的 8080 端口

    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
    
    • -t nat: 在 nat 表操作。
    • -A PREROUTING: 在 PREROUTING 链末尾添加规则。
    • -p tcp --dport 80: 匹配目的端口为 80 的 TCP 数据包。
    • -j REDIRECT --to-port 8080: 重定向这些数据包到本机的 8080 端口。
  • 源 NAT (SNAT): 修改源 IP 地址

    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    
    • -A POSTROUTING: 在 POSTROUTING 链末尾添加规则。
    • -o eth0: 匹配从 eth0 网络接口发出的数据包。
    • -j MASQUERADE: 对这些数据包执行地址伪装,常用于动态 IP 地址。
  • 目标 NAT (DNAT): 修改目标 IP 地址

    iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
    
    • -A PREROUTING: 在 PREROUTING 链末尾添加规则。
    • -p tcp --dport 8080: 匹配目的端口为 8080 的 TCP 数据包。
    • -j DNAT --to-destination 192.168.1.10:80: 修改数据包的目标 IP 和端口。
高级匹配和限速
  • 防止 SSH 爆破攻击

    为了防止 SSH 爆破,我们可以使用 recent 模块来跟踪来自同一 IP 地址的连接尝试。如果在指定时间内超过了特定次数的连接尝试,则暂时拒绝来自该 IP 的连接。

    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
    
    • -m state --state NEW: 只匹配新建连接。
    • -m recent --set: 对匹配的每个新连接,记录其信息。
    • -m recent --update: 更新最近的信息,并检查条件。
    • --seconds 60: 指定时间窗口为 60 秒。
    • --hitcount 10: 如果在 60 秒内同一 IP 尝试新建连接超过 10 次,则匹配此规则。
    • -j DROP: 拒绝这些匹配的数据包。
日志记录

iptables 支持将匹配的数据包信息记录到系统日志中,这对于调试和安全监控非常有用。

  • 记录被拒绝的数据包信息

    iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
    
    • -j LOG: 使用 LOG 目标记录数据包信息。
    • --log-prefix "IPTables-Dropped: ": 指定日志记录的前缀,便于在日志文件中搜索。
    • --log-level 4: 指定日志的级别(4 表示 warning 级别)。
状态检查

利用 state 模块,可以匹配数据包的连接跟踪状态,这是构建复杂防火墙规则的基础。

  • 允许基于状态的数据包传输

    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    • -m state --state ESTABLISHED,RELATED: 匹配状态为 ESTABLISHED 或 RELATED 的数据包。
    • ESTABLISHED: 表示数据包是属于已经建立的连接。
    • RELATED: 表示数据包是与现有的连接相关的(例如,FTP 数据连接)。
时间条件匹配

使用 time 模块可以基于时间条件匹配数据包,这可以用于实现基于时间的访问控制策略。

  • 只在工作时间允许 HTTP 访问

    iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
    
    • -m time: 使用时间模块。
    • --timestart 09:00 --timestop 17:00: 指定允许匹配的开始和结束时间。
    • --weekdays Mon,Tue,Wed,Thu,Fri: 指定允许匹配的星期几。
接口匹配

可以根据数据包使用的网络接口进行匹配。

  • 允许来自特定接口的数据包

    iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
    
    • -i eth0: 只匹配通过 eth0 网络接口进入的数据包。
    • -p tcp --dport 80: 匹配目的端口为 80 的 TCP 数据包。
用户自定义链

用户可以定义自己的链来组织规则,这可以使规则集更加结构化和模块化。

  • 定义和使用自定义链

    iptables -N LOGGING
    iptables -A INPUT -j LOGGING
    iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "Input-Dropped: "
    iptables -A LOGGING -j DROP
    
    • -N LOGGING: 创建一个名为 LOGGING 的新链。
    • -A LOGGING -m limit --limit 2/min -j LOG: 在 LOGGING 链中,使用 limit 模块限制日志记录的速率,防止日志文件快速增长。
    • -j DROP: 在 LOGGING 链的最后,丢弃所有数据包。
保存和加载规则

iptables 规则默认在系统重启后不会保存。你需要手动保存规则,并在系统启动时加载它们。

  • 保存规则到文件

    iptables-save > /etc/iptables.rules
    
    • iptables-save: 输出当前的所有 iptables 规则。
    • >: 重定向输出到文件 /etc/iptables.rules
  • 加载规则从文件

    iptables-restore < /etc/iptables.rules
    
    • iptables-restore: 从给定的输入加载 iptables 规则。
    • < /etc/iptables.rules: 从文件 /etc/iptables.rules 读取规则。
清空和重置

有时你可能需要清空所有规则,重置 iptables 到初始状态。

  • 清空所有规则和自定义链

    iptables -F
    iptables -X
    
    • -F: 清空所有链的所有规则。
    • -X: 删除所有用户定义的链。

三、使用场景举例

使用 iptables 的场景非常多样,覆盖从简单的主机防火墙到复杂的网络路由和 NAT 配置。下面是一些具体的使用场景,展示如何利用 iptables 解决实际问题。

1. 基本的主机防护

在这个场景中,我们利用 iptables 设置基本的网络访问控制,以保护主机不受未授权访问。

允许特定的服务访问

假设你想在一台服务器上开放 SSH (端口 22) 和 HTTP (端口 80) 服务,同时拒绝所有其他未经授权的入站连接。

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT# 允许本地回环接口
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT# 允许已建立的和相关的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许 HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT# Optional: 允许 HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

2. 防止 DDoS 攻击

使用 iptables 限制单个源 IP 的连接频率,以防止简单的 DDoS 攻击或 SSH 爆破。

限制 SSH 连接尝试
# 允许每个 IP 每分钟最多新建 3 个 SSH 连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

这种设置能够有效减少暴力破解 SSH 密码的风险。

3. 端口转发

在某些情况下,你可能需要将到达某个端口的流量重定向到另一个端口上,例如将 80 端口的 HTTP 流量转发到 8080 端口。

将 80 端口转发到 8080 端口
# 在 nat 表的 PREROUTING 链上添加规则
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

这个操作常用于服务器上运行的 Web 应用程序,该程序绑定于非标准端口,而你希望通过标准端口访问。

4. 网络地址转换 (NAT)

在家庭或小型办公室网络中,经常需要设置 NAT 来共享访问互联网的路径。以下是一个简单的源 NAT(SNAT)配置的例子。

共享互联网访问

假设 eth1 是内部网络接口,eth0 是连接到互联网的接口。

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward# 设置 MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE# 允许内部网络访问外部
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT# 允许已建立的连接回流
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

这个配置允许内部网络通过 eth0 接口访问外部网络。

5. 日志和审计

记录某些类型的网络活动对于调试和安全监控都是非常有用的。

记录被拒绝的包
# 记录被拒绝的入站连接尝试
iptables -A INPUT -j LOG --log-prefix "IPTables-Input-Denied: " --log-level 4
# 记录被拒绘的转发连接尝试
iptables -A FORWARD -j LOG --log-prefix "IPTables-Forward-Denied: " --log-level 4

这些规则会将所有被 INPUT 和 FORWARD 链拒绝的尝试记录到系统日志中。

6. 使用时间条件控制访问

在某些环境中,你可能希望基于时间来控制网络访问。

在工作时间外允许 SSH 访问
# 工作时间外允许 SSH
iptables -A INPUT -p tcp --dport 22 -m time --timestart 18:00 --timestop 09:00 -j ACCEPT

这条规则允许在晚上 6:00 到早上 9:00 之间进行 SSH 访问。

7. 防火墙绕过

在某些情况下,你可能需要临时开放或关闭防火墙的某些规则,而不是永久修改配置。

临时开放所有访问

如果需要临时允许所有流量(例如,进行某些特殊操作),可以设置:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT# 清空所有规则
iptables -F

然后,在操作完成后,恢复原来的规则。

8. 防止 ICMP 泛洪攻击

ICMP 泛洪是一种常见的拒绝服务攻击方法。

限制 ICMP 回显请求
# 限制 ICMP echo-request 消息
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

这些规则限制了每秒处理的 ICMP echo 请求(ping 请求)的数量,从而减轻了泛洪的影响。

9. 多网卡策略路由

在拥有多个网络接口的服务器上,你可能需要根据数据包的来源或目的地来选择不同的路由。

根据源 IP 使用特定的网络接口
# 对于从特定源 IP 发出的数据包,使用特定接口
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth1 -j MASQUERADE

这个规则设置了源 NAT,允许从 192.168.100.0/24 网段出来的数据包通过 eth1 接口发送。

10. 容器和虚拟化环境

在使用 Docker 或其他容器技术时,经常需要配置 iptables 来管理和隔离网络流量。

允许特定容器访问外部网络
# 假设容器的虚拟网络接口是 veth1234
iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -o eth0 -j MASQUERADE

这条规则允许 IP 地址为 172.17.0.2 的容器通过 eth0 接口访问外部网络。

通过这些场景,你可以看到 iptables 的多样性和强大功能,它能够满足从简单到复杂的多种网络需求。

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

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

相关文章

ROS 2边学边练(46)-- 给URDF模型添加物理属性和碰撞属性

前言 实际物理世界中的物体需要遵守物理定律&#xff0c;机器人也不例外&#xff0c;在urdf中我们同样可以给机器人添加相关属性以模拟对应真实物理世界中的情况。 动动手 碰撞collision 碰撞属性指的是该物体的最小安全物理空间&#xff0c;站在机器人的角度&#xff0c;这个…

UE5C++ FString做为参数取值时报错error:C4840

问题描述 用来取FString类型的变量时报错&#xff1a; 问题解决 点击错误位置&#xff0c;跳转到代码&#xff1a; void AMyDelegateActor::TwoParamDelegateFunc(int32 param1, FString param2) {UE_LOG(LogTemp, Warning, TEXT("Two Param1:%d Param2:%s"), param…

docker搭建redis6.0(docker rundocker compose演示)

文章讲了&#xff1a;docker下搭建redis6.0.20遇到一些问题&#xff0c;以及解决后的最佳实践方案 文章实现了&#xff1a; docker run搭建redisdocker compose搭建redis 搭建一个redis’的过程中遇到很多问题&#xff0c;先简单说一下搭建的顺序 找一个redis.conf文件&…

spsr 的恢复出错,导致 thumb 指令集的 it 条件运行指令运行异常,清晰的调试思路帮助快速解决问题

记一次调试过程 这是一个在 arm 架构上的 RTOS 上的调试过程。问题现象为使用 thumb 指令集的 libgcc 库的情况下&#xff0c;浮点运算随机出错。经过一番追踪调试&#xff0c;逐步缩小问题范围&#xff0c;最后定位问题&#xff0c;成功解决。 场景 在某款的国产 RTOS 上&a…

RIP动态路由协议详解

目录 一&#xff1a;RIP协议的基本信息 二&#xff1a;RIP协议中的更新方式 三&#xff1a;RIP协议中的计时器 定时更新器&#xff08;UPDATE timer&#xff09; 无效定时器&#xff08;invalid Timer&#xff09; 垃圾收集定时器&#xff08;garbage collection timer&a…

【退役之重学 Java】初步认识 AQS

一、AQS 是什么 Abstract Queued Synchronizer &#xff0c;翻译过来就是“抽象的排好队的同步器”。 AQS 是一个用来构建锁和同步器的框架。是用来构建锁或者其他同步器组件的重量级基础框架及整个JUC体系的基石&#xff0c;通过内置的FIFO队列来完成线程获取资源的排队工作&…

【linux软件基础知识】如何使用 run_list 字段将任务放入就绪队列中

在给定的代码片段中,struct task_struct 表示内核中任务或进程的进程控制块 (PCB)。 run_list 字段的类型为 struct list_head,这表明它是链表实现的一部分。 run_list字段在Linux内核中常用来表示任务在调度队列中的位置,例如就绪队列或各种优先级队列。 init_task是一个…

第100+7步 ChatGPT文献复现:ARIMA-GRNN预测出血热

基于WIN10的64位系统演示 一、写在前面 这一次&#xff0c;我们来解读ARIMA-GRNN组合模型文章&#xff0c;也是老文章了&#xff1a; 《PLoS One》杂志的2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal…

树莓派、ubuntu低版本python3安装库

如果遇到树莓派中自带低版本python3&#xff0c;又不想额外去安装python3时&#xff0c;可能会遇到版本过低&#xff0c;无法安装库的情况&#xff0c;以下用我实际情况举例解决方案。 本次遇到的问题是树莓派低版本中&#xff0c;python3为3.7.3&#xff0c;需要安装numpy&am…

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机进行双向串口通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机进行双向串口通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能寄存器…

数据结构与算法===递归

文章目录 定义适用场景爬楼梯代码实现 小结 定义 递归(Recursion)是指函数的自身调用。 这个算法演变为了程序员之间的梗&#xff0c;所表达的意思近似于“套娃”&#xff0c;表示不断重复引用别人的话从而产生循环。 适用场景 这个应该很多的&#xff0c;像一些树的遍历&am…

Java | Leetcode Java题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution {public int largestRectangleArea(int[] heights) {int n heights.length;int[] left new int[n];int[] right new int[n];Arrays.fill(right, n);Deque<Integer> mono_stack new ArrayDeque<Integer>();f…

数据结构与算法学习笔记三---队列的顺序表示和实现(C语言)

目录 前言 1.顺序队列的描述 2.队列的顺序表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.空队列 6.队列长度 7.获取队头 8.入队 9.出队 10.遍历队列 11.完整代码 前言 本篇博客介绍栈和队列的表示和实现。 1.顺序队列的描述 图1.顺序队列的描述 2.队列的顺序表示…

如何根据招聘信息打造完美简历

如何根据招聘信息打造完美简历 招聘信息分析简历调整策略个性化与关键词结语 在求职过程中&#xff0c;简历是第一块敲门砖。它不仅展示了你的专业技能和工作经验&#xff0c;还体现了你对所申请职位的理解和热情。然而&#xff0c;如何从招聘信息中提炼关键点&#xff0c;打造…

苹果电脑MAC清理系统空间工具CleanMyMacX4.15.3中文版下载

苹果电脑以其出色的性能、优雅的设计和高效的操作系统而受到许多用户的喜爱。然而&#xff0c;随着时间的推移和使用量的增加&#xff0c;你可能会发现你的Mac开始变得缓慢和响应迟缓。这通常是因为硬盘空间被大量占用&#xff0c;影响了系统的整体性能。幸运的是&#xff0c;有…

mysql管理

数据库服务管理 安装完成后,启动mysql服务器systemctl start mysqld然后查看mysql状态systemctl status mysqld 发现报错&#xff0c;因为centos不再支持MySQL数据库&#xff0c;安装mariadb代替 yum install –y mariadb-server 会在 /var/log/mysqld.log文件中会自动生成…

Android 13 系统自定义安全水印

效果 源码实现 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public final void showSafeModeOverlay() {View v LayoutInflater.from(mContext).inflate(com.android.internal.R.layout.safe_mode, null);WindowManager.Layout…

CSS滑动门

CSS滑动门使各种特殊形状的背景能够自动拉伸滑动&#xff0c;以适应元素内部的文本内容&#xff0c;其原理是&#xff1a;利用CSS精灵和盒子撑开宽度适应不同字数的导航栏。 特点&#xff1a; 1.可以根据导航字数自动调节宽度&#xff1b; 2.可以以简单的背景图实现炫彩的导航条…

NSS题目练习2

[LitCTF 2023]我Flag呢&#xff1f; 打开题目后查看源码即可发现flag [第五空间 2021]WebFTP 看到提示&#xff0c;首先想到用dirsearch扫描链接&#xff0c;看是否存在git泄露 发现存在git泄露&#xff0c;用githack解决 克隆提示目录为空&#xff0c;说明不正确&#xff0c…

前端工程化,前端监控,工作流,部署,性能

开发规范 创建项目的时候&#xff0c;配置下 ESlint&#xff0c;stylelint&#xff0c; prettier&#xff0c; commitlint 等; ESLint 主要功能&#xff1a; ESLint 是一个静态代码检查工具&#xff0c;用于在 JavaScript 代码中识别和报告模式。它的目标是提供一个插件化的 …