iptables教程

iptables

netfilter/iptables(简称iptables)是与2.4.x和2.6.x系列版本Linux内核集成的IP信息包过滤系统。

Iptables Tutorial

1、表和链

1.1、表

iptables会根据不同的数据包处理功能使用不同的规则表。它包括如下五个表:filternatmangle,raw,security

  • filter

    filter是默认的表(如果命令中没有使用-t 指定表,就会使用filter),包含真正的防火墙过滤规则。

​ 内建的规则链包括:INPUT(处理进入的数据包)、OUTPUT(处理本地生成的数据包)和FORWARD(处理转发的数据包)。

​ 在filter表中只允许对数据包进行DROP或ACCEPT操作,而无法对数据包进行更改。

  • nat

    nat表主要用于进行网络地址转换(Network Address Translation, NAT)。包含源地址、目的地址及端口转换使用的规则,当遇到创建新连接的数据包时,会查阅此表。

​ 内建的规则链包括PERROUTINGOUTPUTPOSTROUTING

PREROUTING链的作用是在包刚刚到达防火墙时改变它的目的地址(如果需要的话)。

OUTPUT链改变本地产生的包的目的地址。

POSTROUTING链在包就要离开防火墙之前改变其源地址,此表仅用于NAT,也就是转换包的源或目标地址。实际的操作分为以下几类:

​ (1)DNAT:主要用在这样一种情况,即假设你有一个合法的IP地址,要把对防火墙的访问重定向到其他的机器上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。

​ (2)SNAT:SNAT改变包的源地址,这在极大程度上可以隐藏本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。

  • mangle

    mangle表主要用来定义数据包的操作方式。我们可以改变不同的包及包头的内容,比如TTL、TOS或MARK。这些标志随后被filter表中的规则检查。

    内建的规则链包括:PREROUTINGINPUTFORWARDPOSTROUTINGOUTPUT

raw表设置raw一般是为了不再让iptables做数据包的连接跟踪处理提高新能。内建的规则链包括:PREROUTINGOUTPUT

security表用于强制访问控制 (MAC) 网络规则,例如由 SECMARKCONNSECMARK 目标启用的规则。 强制访问控制由 Linux Security Mod‐ 实现诸如SELinux之类的Ules。

1.2、链

链是数据包传播的路径,一条链就是规则的一个检查清单,每一条链中可以有一条或多条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,查看该数据包是否满足规则所定义的条件,决定是否按预定义的方法处理该数据包,如果包头不符合链中的规则,iptables就会根据该链的默认策略来处理数据包。

表对应的相关规则链的功能如下:

❑ INPUT链:当一个数据包由内核中的路由计算确定为本地的Linux系统后,它会通过INPUT链的检查。

❑ OUTPUT链:保留给系统自身生成的数据包。

❑ FORWARD链:经过Linux系统路由的数据包(即当iptables防火墙用于连接两个网络时,两个网络之间的数据包必须流经该防火墙)。

❑ PREROUTING链:用于修改目的地址(DNAT)。

❑ POSTROUTING链:用于修改源地址(SNAT)。

1.3、iptables五条链的相互关系。

在这里插入图片描述

1.4 iptables传输数据包的过程

数据包流经iptables防火墙的路径是经过严格定义的一个处理过程,下图描述了数据包流经iptables防火墙时的传输过程。

在这里插入图片描述

(1)流入本机的数据包穿过iptables防火墙的传输过程

官方文档位置

过程1:数据包从网络传入,并由网卡接收。

过程2:随后转入mangle表的PREROUTING链。

过程3:再转入nat表的PRETOUTING链,这个链主要用来做DNAT,即目的地址转发。

过程4:内核对数据包进行路由选择。

过程5:因为数据包是传入本机的,因此转入mangle表的INPUT链。

过程6:然后转入filter表的INPUT链。

过程7:最终到达接收数据包的应用程序。

(2)流出本机的数据包穿过iptables防火墙的传输过程

官方文档位置

过程1:应用程序生成数据包,根据源地址、目的地址、外出接口等信息进行路由判断。

过程2:随后转入mangle表的OUTPUT链。

过程3:再转入nat表的OUTPUT链,这个链可以用来做DNAT。

过程4:进入filter表的OUTPUT链,对该数据包进行选择性过滤。

过程5:然后进入mangle表的POSTROUTING链。

过程6:进入nat表的POSTROUTING链,该链可以做SNAT,即源地址转发,最终进入网络。

(3)流经本机转发的数据包的传输过程

官方文档位置

过程1:数据包从网络传入,并由网卡接收。

过程2:随后转入mangle表的PREROUTING链。

过程3:再转入nat表的PRETOUTING链,这个链主要用来做DNAT,即目的地址转发。

过程4:内核对数据包进行路由选择。该包的目的地址是另一台主机,所以转入mangle表的FORWARD链。

过程5:再转入filter表的FORWARD链,针对这类包的所有过滤操作都在该链进行。

过程6:过滤后转入mangle表的POSTROUTING链。

过程7:最后通过nat表的POSTROUTING链进行SNAT,最终进入网络。

(1)用户可以在各个链定义规则。当数据包到达上图的任意一个链时,iptables就会根据链中定义的规则来处理这个数据包。iptables将数据包的头信息与它所传递到链中的每条规则进行比较,看它是否与某条规则完全匹配。如果数据包与某条规则匹配,iptables就对该数据包执行由该规则指定的操作。如果某条链中的规则决定要丢弃(DROP)数据包,数据包就会在该链中丢弃;如果链中规则接收(ACCEPT)数据包,数据包就可以继续前进。但是,如果数据包和某条规则不匹配,那么它将与链中的下一条规则进行比较。如果该数据包不符合该链中的任意一条规则,那么iptables将根据该链预先定义的默认策略来决定如何处理该数据包。

(2)PREROUTINGPOSTROUTING链只对请求连接的数据包进行操作,对属于该连接的后续数据包,不予比对规则,只按已确定的规则自动进行操作。因此建议不要在此链上作过滤操作;否则将漏掉对后续数据包的过滤。

2、iptables命令格式

iptables命令的基本格式如下:<>括起来的为必设项,[]括起来的为可选项。iptables命令要求严格区分大小写。

iptables [-t table] <COMMAND>  [chains] [rule-matcher] [ -j target ]

各选项说明:

  • 表选项(table)

    netfilter的表操作是以-t或–table

    来指定的,未指定时默认为filter表。table选项的参数.

    在这里插入图片描述

  • 常用操作命令选项(COMMAND)

    在这里插入图片描述

  • 链选项(chains)

    在这里插入图片描述

    ➢filter表有INPUT、OUTPUT、FORWARD和自定义4种链形式。

    ➢nat表有OUTPUT、PREROUTING和POSTROUTING三种链形式。

    ➢mangle表有INPUT、OUTPUT、FORWARD、PREROUTING和POSTROUTING五种链形式。

  • 常用匹配规则选项(rule-matcher)

    匹配规则选项指定数据包与规则匹配所应具备的特征,包括源地址、目的地址、传输协议(如TCP、UDP、ICMP等)和端口号等。

    在这里插入图片描述

    “! ”为逻辑非;接口名后跟“+”表示所有以此接口名开头的接口都会被匹配。下图为匹配条件扩展。

    在这里插入图片描述

  • 目标动作选项(target)

    当规则匹配一个包时,要执行的目标动作以-j参数标识

    • filter表的目标动作

      在这里插入图片描述

    • nat表的目标动作

      在这里插入图片描述


      REDIRECT目标用于将分组和流重定向到计算机本身。这意味着,例如,我们可以将所有发送到HTTP端口的数据包重定向到我们自己主机上的HTTP代理,如squid。本地生成的数据包映射到127.0.0.1地址。换句话说,这将为转发的数据包或类似内容重写到我们自己的主机的目标地址。重定向目标非常适合在我们需要的时候使用,例如,透明代理,局域网主机根本不知道代理。

      DNAT参数--to-destination

      例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

      –to-ports 选项指定要使用的目标端口或端口范围。如果没有 --to-ports 选项,则永远不会更改目标端口。上面的命令就是将tcp端口号为80的数据包重定向到8080端口。

    • mangle表的目标动作

      在这里插入图片描述

    • 扩展的目标动作

      在这里插入图片描述

      要使用扩展的目标动作,必须在内核中激活相应选项或装载相应内核模块。

3、 iptables的状态state

iptables防火墙的状态(state):

❑ NEW:如果你的主机向远程机器发出一个连接请求,这个数据包的状态是NEW。

❑ ESTABLISHED:在连接建立之后(完成TCP的三次握手后),远程主机和你的主机通信数据的状态为ESTABLISHED。

❑ RELATED:和现有联机相关的新联机封包。像FTP这样的服务,用21端口传送命令,而用20端口(port模式)或其他端口(PASV模式)传送数据。在已有的21端口上建立好连接后发送命令,用20或其他端口传送的数据(FTP-DATA),其状态是RELATED。

❑ INVALID:无效的数据包,不能被识别属于哪个连接或没有任何状态,通常这种状态的数据包会被丢弃。

如规则iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT表示接受ESTABLISHED,RELATED状态的数据包。

如规则 iptables -A INPUT -m state --state NEW -j DROP这个规则是将所有发送到你机器上的数据包(状态是NEW的包)丢弃,也就是不允许其他的机器主动发起对你的机器的连接,但是你却可以主动连接其他的机器。

4、 iptables的使用

  • 规则 iptables -P INPUT DROP会将进入主机的所有数据全部丢掉。如果你是通过远程shell执行这个命令,那么执行后shell将会断开。

比如我的主机当前的规则,所有的都是策略都是ACCEPT

在这里插入图片描述

当执行iptables -P INPUT DROP后,远程shell就会断开,这时通过主机内的shell再次查看当前的规则,就能看到INPUT变成了DROP

在这里插入图片描述

再次执行iptables -P INPUT ACCEPTipables恢复。

  • 规则 iptables -A INPUT -m state --state NEW -j DROP

    这个规则是将所有发送到你机器上的数据包(状态是NEW的包)丢弃,也就是不允许其他的机器主动发起对你的机器的连接,但是你却可以主动连接其他的机器,不过仅仅是连接而已,连接之后的数据是ESTABLISHED状态的。

    执行上面的规则后,在查看当前的规则,就能看到下面DROP的一条。

在这里插入图片描述

这时,如果你本地再新建一条远程shell去连接主机,就会发现无法连接。而之前已经连接的远程shell是可以正常使用的。

在这里插入图片描述

5、保存iptables规则

iptables-save > /opt/iptables_save 将当前的iptables配置保存到 /opt/iptables_save中

iptables-restore < /opt/iptables_save 从/opt/iptables_save中恢复iptables的配置

6、一些常用的命令

注意这里没有使用-t参数指定表名,默认显示的就是filter表,如果要显示其他的表,需要使用-t后加表名。如-t nat

  • 查看iptables规则

    iptables -L
    

    -L参数可以后跟--line-numbers 参数打印出行号。

    iptables -L --line-numbers 。后面命令中指定插入行号,替换行号等等都可以参照--line-numbers输出的行号

  • 将IP地址和端口号以数字格式显示列出所有链的规则。

    iptables -nL
    
  • 详细列出所有链的规则

    iptables -vL
    #不能使用 iptables -Lv
    
  • 列出INPUT链的规则

    iptables -L INPUT
    
  • 列出INPUT链的1号规则

    iptables -L INPUT 1
    
  • 显示所有链的规则

    iptables -S
    
  • 详细显示所有链的规则

    iptables -vS
    #不能使用iptables -Sv
    
  • 显示INPUT链的规则

    iptables -S INPUT
    
  • 显示INPUT链的1号规则

    iptables -S INPUT 1
    

    清除指定链和表中的所有规则

  • 清除所有链的规则(默认为filter表)

    iptables -F
    
  • 清楚INPUT链的所有规则

    iptables -F INPUT
    
  • 将所有链中的规则的包字节计数器清零。

    iptables -Z
    
  • 将INPUT链中的规则的包字节计数器清零

    iptables -Z INPUT
    
  • 在INPUT、OUTPUT和FORWARD链上设置默认规则策略为DROP(拒绝所有数据包)

    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    
  • 在INPUT链上添加规则,协议为tcp,目标端口号是21

    iptables -A INPUT -p tcp --dport 21
    

    这里没有指定动作,所以就按照INPUT的默认动作进行处理。

    执行完上面的命令再次查看,就会看到INPUT中多了一个对应的条目

    在这里插入图片描述

  • 在INPUT链上插入规则,协议为tcp,目标端口号是22

iptables -I INPUT 1 -p tcp --dport 23

​ 从下图也能看到多了一条dpt:telnet的条目,原来的dpt:ftp的行号已经变成了2

在这里插入图片描述

  • 在INPUT链上替换规则号1的iptables规则,将目标端口号更改为24

     iptables -R INPUT 1 -p tcp --dport 24
    

在这里插入图片描述

  • 删除规则

    首先找到规则对应的行号。使用-L --line-numbers参数。

    比如要删除上面INPUT中的tcp端口是24的规则。通过iptables -L --line-numbers看到对应行号是1。

    执行iptables -D INPUT 1就可以删除。

  • 创建用户自定义链

    iptables -N WWW   #创建用户自定义链WWW
    

    在这里插入图片描述

  • 指定协议

    iptables -A INPUT -p tcp -j ACCEPT
    iptables -A INPUT -p udp -j ACCEPT
    
  • 指定ICMP类型

    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
    
  • 指定IP地址

    iptables -A INPUT -s 192.168.0.5   -j ACCEPT
    iptables -A INPUT -s 192.168.1.0/24   -j ACCEPT  #允许192.168.1.0这个子网的所有主机访问
    
  • 指定接口

    iptables -A INPUT -i eth0 -j ACCEPT
    iptables -A FORWARD -o eth0 -j ACCEPT
    iptables -A FORWARD -o ppp+ -j ACCEPT
    
  • 指定端口号

    iptables -A INPUT -p tcp --sport www -j ACCEPT
    iptables -A INPUT -p tcp --sport 80-j ACCEPT
    iptables -A INPUT -p tcp --dport 53-j ACCEPT
    iptables -A INPUT -p tcp --sport 22:80-j ACCEPT
    

7、NAT案例:

使用NAT功能,首先需要将文件“/proc/sys/net/ipv4/ip_forward”设置为1(默认是0),才能打开内核的路由功能。

具体命令如下:

echo "1">/proc/sys/net/ipv4/ip_forward

在这里插入图片描述

上面有A、B、C三个服务。它们都在同一局域网内。A服务器有公网 ip 10.x.x.x。B、C都没有公网ip。B、C两个服务器连接公网都需要通过A服务器进行转发。外部网路无法直接访问B、C服务器。A服务器也就是充当了路由器。

现在B服务器部署了一个nginx服务,想让公网上的用户访问需要怎么做呢。

  1. 外部公网服务器访问nginx服务器

因为公网只能访问到A服务器,所以我们可以在A服务器上进行DNAT处理,将访问A服务器80端口的请求全部转发到B服务器。由于DNAT只会修改目标ip,不会修改源ip。所以在B 服务器处理完请求,还会把响应继续发送到A服务器,A服务器这时会对B服务器返回的响应继续执行unDNAT操作,将响应返回对应的公网服务器。

具体的命令如下:

#这个命令需要在A服务器上执行,将访问自己公网ip:80的请求转发到B服务器80端口
iptables -t nat -A PREROUTING --dst 10.x.x.x  -p tcp --dport 80 -j DNAT --to-destination 192.168.1.102:80

在这里插入图片描述

如上图,我们在A服务器上面标注1的地方将目标ip修改成了B服务器的ip 192.168.1.102,在标注2的地方路由选择的时候,发现目的ip不是本机,就直接进行转发。

进行路线就是图上红色箭头标注的路线,可以看到数据包压根就不会流转到INPUT mangleOUTPUT filter这一段。

这样设置之后公网服务器是可以正常访问,没有任何问题。

  1. 局域网内部访问nginx服务器

C服务器通过请求10.x.x.x:80去访问的时候,发现无法访问。

具体的原因是由于B服务器处理完请求写回的时候发现ip是192.168.1.101,不需要经过A服务器就能直接访问。因此B直接将响应发送回C服务器。但是由于C服务器只是给A服务器10.x.x.x发送了请求,并没有给B服务器192.168.1.102发送请求,所以收到B服务器192.168.1.102的响应后,就直接丢弃了。

所以我们还需要B服务器处理完请求后,依旧能返回到A服务器,由A服务器将请求再转发回C服务器。当前B服务器将响应发送回C,没有发送回A的原因是发送给B的请求的源ip是C的ip。所以我只需要把B服务器收到的请求中的源ip修改成A服务器的ip,那B服务器处理完后,就会将响应发送回A服务器。A服务器收到响应后,就会继续向回转发。

具体命令如下:

# 在A服务器上执行,将发送给B服务器80端口的消息,将源ip修改成自己的ip地址
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.68.102 --dport 80 -j SNAT --to-source 10.x.x.x

在这里插入图片描述

如上图,我们在标注3的地方修改了源ip地址,改成了A服务器的地址,这样B服务器处理完请求返回响应的时候回根据源ip地址,将请求发送到A服务器。A服务器收到请求后回原路返回。

  1. A服务器访问nginx服务器

    A服务器自己请求10.x.x.x:80去访问,还是无法访问。

    对照着图其实也是很好理解的,我们将请求转发到B服务器是在PREOUTING nat执行的,如果的本机的话,压根就不会流转到PREOUTING nat,也就是在PREOUTING nat进行的设置对本机发出的请求都是无效的。

    这时,我们就可以在OUTPUT nat这个阶段进行处理,将本机发出的请求目的ip地址是10.x.x.x:80的,将它的目的ip地址修改成B服务器的ip地址。这样本机也就可以正常访问了。

    具体命令如下:

    #还是在A服务器执行,将A服务器发出的请求目的ip修改成192.168.1.102
    iptables -t nat -A OUTPUT --dst 10.x.x.x -p tcp --dport 80 -j DNAT --to-destination 192.168.1.102:80
    

在这里插入图片描述

如上图,本机发出的请求,起点位置在应用程序这里,所以PREROUTING nat不会生效,OUTPUT natPOSTROUTING nat这两个地方的设置才会生效。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

table,设置 数据相同时, 合并列

<el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%" show-summary><el-table-column type"index" label"序号" width"100" /><el-table-column prop"dat…

C语言练习题解析:挑战与突破,开启编程新篇章!(2)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

加密的PDF文件,如何解密?

PDF文件带有打开密码、限制编辑&#xff0c;这两种密码设置了之后如何解密&#xff1f; 不管是打开密码或者是限制编辑&#xff0c;在知道密码的情况下&#xff0c;解密PDF密码&#xff0c;我们只需要在PDF编辑器中打开文件 – 属性 – 安全&#xff0c;将权限状态修改为无保护…

100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

【SQL】关系模型与查询和更新数据

一、关系模型 1.1 主键 主键是关系表中记录的唯一标识。主键的选取非常重要&#xff1a;主键不要带有业务含义&#xff0c;而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。 可以使用多个列作为联合主键&#xff0c;但联合主键并不常用。 1.2 外键 FOREIGN KEY …

剪绳子c、c++实现

给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长的 m 段&#xff08; m 、 n 都是整数&#xff0c; n > 1 并且 m > 1 &#xff0c; m < n &#xff09;&#xff0c;每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少&#x…

函数(个人学习笔记黑马学习)

1、函数定义 #include <iostream> using namespace std;int add(int num1, int num2) {int sum num1 num2;return sum; }int main() {system("pause");return 0; } 2、函数的调用 #include <iostream> using namespace std;int add(int num1, int num2…

【DRONECAN】(三)WSL2 及 ubuntu20.04 CAN 驱动安装

【DRONECAN】&#xff08;三&#xff09;WSL2 及 ubuntu20.04 CAN 驱动安装 前言 这一篇文章主要介绍一下 WSL2 及 ubuntu20.04 CAN 驱动的安装&#xff0c;首先说一下介绍本文的目的。 大家肯定都接触过 ubuntu 系统&#xff0c;但是我们常用的操作系统都是 Windows&#x…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

【拾枝杂谈】从游戏开发的角度来谈谈原神4.0更新

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;结合最近的学习内容和以后自己的目标&#xff0c;今天又开了杂谈这个新坑&#xff0c;分享一下我在学习游戏开发的成长和自己的游戏理解&#xff0c;当然现在还是一枚…

【LeetCode75】第三十九题 二叉树的右视图

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一棵二叉树&#xff0c;让我们返回站在二叉树右边从上到下看到的节点。 那实际上就是要我们对二叉树进行层序遍历&#xff0c…

108页石油石化5G智慧炼化厂整体方案PPT

导读:原文《108页石油石化5G智慧炼化厂整体方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。以下是部分内容,

PKI/CA体系介绍

概述 目前最常用的第三方认证服务包括&#xff1a;PKI/CA和Kerberos。PKI/CA是基于非对称密钥体系的&#xff0c;Kerberos是基于对称密钥体系的。 数字证书&#xff1a;提供一种发布公钥的简便途径&#xff1b; 数字签名&#xff1a;用来确认信息发送者的身份&#xff0c;保证…

win11出现安全中心空白和IT管理员已限制对此应用的某些区域的访问

问题 windows安全中心服务被禁用 winr 输入services.msc 找到windows安全中心服务查看是否被禁用&#xff0c;改为启动&#xff0c;不可以改动看第三条 打开设置&#xff0c;找到应用—windows安全中心–终止–修复–重置 重启如果还是不行看第四条 家庭版系统需要打开gped…

设计模式大白话——命令模式

命令模式 一、概述二、经典举例三、代码示例&#xff08;Go&#xff09;四、总结 一、概述 ​ 顾名思义&#xff0c;命令模式其实和现实生活中直接下命令的动作类似&#xff0c;怎么理解这个命令是理解命令模式的关键&#xff01;&#xff01;&#xff01;直接说结论是很不负责…

【设计模式】Head First 设计模式——桥模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点&#xff0c;然后分离它们&#xff0c;从而管理变化。将变化像小兔子一样关到笼子里&#xff0c;让它在笼子里随便跳&#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想 桥模式。将抽象部分(业务功能)与实现部分(平…

Mysql B+数索引结构

一、B树和B树区别 二、 B 树形成过程 三、页分裂过程 3.1 页分裂过程实例 3.1.1 原有数据1、3、5形成如下数据页 3.1.2 先新插入数据4&#xff0c;因为 页10 最多只能放3条记录所以我们不得不再分配一个新页&#xff1a; 新分配的数据页编号可能并不是连续的&#xff0c;也…

iOS逆向:越狱及相关概念的介绍

在上一篇内容中我们介绍了App脱壳的技术&#xff0c;今天我们来介绍一个和iOS逆向密切相关的知识&#xff1a;越狱。 iOS操作系统的封闭性一直是开发者们关注的焦点之一。为了突破Apple的限制&#xff0c;越狱技术应运而生。本文将深入探讨iOS越狱&#xff0c;包括可越狱的版本…

【C语言】每日一题(除自身以外数组的乘积)

添加链接描述&#xff0c;链接奉上 方法&#xff1a; 暴力循环:前缀积后缀积&#xff08;分组&#xff09;: 暴力循环: 暴力循换真的是差生法宝&#xff0c;简单好懂&#xff0c;就是不实用&#xff0c;大多数的题目都会超过时间限制&#xff08;无奈&#xff09; 思路&…

嵌入式Linux开发实操(十五):nand flash接口开发

# 前言 flash memory,分NAND和NOR: 如果说nor flash有个特点就是能执行代码,NOR并行接口具有地址和数据总线,spi flash更是主要用于存储代码,SPI(或QSPI)NOR代码可就地执行(XiP),一般系统要求flash闪存提供相对较高的频率和数据缓存的clocking。而nand flash主要用于…