计算机网络day16 防火墙 - iptables - netfilter - iptables的四表五链 - iptables命令 - iptables的匹配条件 - iptables端口实验

本文主要是介绍计算机网络day16 防火墙 - iptables - netfilter - iptables的四表五链 - iptables命令 - iptables的匹配条件 - iptables端口实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

防火墙

linux的内核(kernel)

内核的主要作用: 

硬件-内核-系统-应用程序架构关系图: 

内核的2种两种工作模式:(内核态、用户态)(进程的两种工作状态)

netfilter 和 iptables的关系

netfilter

iptables

firewalld

firewalld和iptables的区别

五虎上将图(iptables工作流程图)(iptables的四表五链)

包过滤防火墙iptables工作在TCP/IP的网络层

iptables的规则链、链结构:

iptables的规则表、表结构:

规则表间的优先顺序 

 规则链间的匹配顺序 

规则链内的匹配顺序 

数据包过滤匹配流程

iptables命令:

iptables命令的语法格式

iptables的注意点:

常用的iptables命令选项包括: 

iptables实现例子:

撰写清除iptables规则的脚本clear_rule.sh 

创建一个计划任务,每隔1分钟执行一次,清除防火墙规则(防止清除防火墙导致无法上网啦)

iptables创建新链

计算机网络中存在的一些条件:

iptables匹配数据包的条件:(通用条件、隐含条件、显式条件)

通用条件匹配

LOG日志实现抓包功能的过程(ping命令抓包的实现)

隐含条件匹配

禁ping的iptables命令: 

显式条件匹配

导入、导出防火墙规则​编辑

开机自动加载我们的iptables规则

实验: 实现设置iptables规则指定端口访问实验

步骤:

实验拓扑图:

open_app.sh

SNAT_DNAT.sh 

最后测试

验证DNAT发布的Web的80端口:

验证DNAT发布的SSH中的2233端口

其他的端口我们能通过内部的linux机器进行测试(192.168.91.80)

iptables总结:


防火墙

防火墙(Firewall)是计算机网络中的一种安全设备或软件,用于监控、过滤和控制网络数据包的流动。它的作用是保护计算机和网络免受未经授权的访问、恶意攻击和未知威胁,提高网络安全性并保护数据的机密性和完整性。

linux系统的防火墙功能是由内核实现的

防火墙:数据过滤机制
包过滤机制是netfilter,管理工具是iptables

netfilter --》阵法(机关) --》八卦阵 、一字长蛇阵、18铜人阵 等  --》是一个软件属于linux内核里的一个小功能

iptables 相当于给阵法传递参数--》告诉阵法如何调整,运转,对数据包进行过滤 --》是一个软件,只是给netfilter传递参数,查看netfilter里的

linux的内核(kernel)

linux的内核官网:The Linux Kernel Archives

内核是操作系统内部最核心的软件,它是位于计算机硬件和应用程序之间的一层软件,起着非常重要的作用。内核负责管理计算机的硬件资源,并提供了一个抽象的接口,使得应用程序可以与硬件交互而不需要了解底层硬件的细节。

内核的主要作用: 

1.对cpu进行管理
2.对进程管理
3.对内存的管理
4.对文件系统管理
5.对网络的管理     --》防火墙
6.对其他硬件的管理

如何查看自己linux机器的内核版本

[root@router ~]# uname  -r
3.10.0-1160.el7.x86_64
[root@router ~]# 

硬件-内核-系统-应用程序架构关系图: 

 

内核的2种两种工作模式:(内核态、用户态)(进程的两种工作状态)

1.内核态:  内核态的进程可以访问用户空间,管理用户态的进程

2.用户态:  用户态的进程不能随意访问内核态空间

  1. 内核态(Kernel Mode): 内核态是处理器的高特权级别,也称为特权模式或系统态。在内核态下,操作系统内核拥有对计算机硬件和资源的完全访问权限,可以执行所有指令,包括访问和操作系统内存、I/O设备、中断处理等。操作系统内核运行在内核态,它负责管理系统资源、处理中断、进行进程调度、提供系统服务等。在内核态下执行的代码具有更高的权限,可以直接访问所有内存和设备。

  2. 用户态(User Mode): 用户态是处理器的低特权级别,也称为非特权模式或用户态。在用户态下,应用程序和用户进程运行,它们受限于操作系统内核的保护机制,只能访问自己的内存空间和经过授权的资源,无法直接访问硬件设备和其他进程的内存。在用户态下执行的代码没有直接访问硬件的权限,它们必须通过系统调用来请求内核提供的服务和资源,例如文件读写、网络通信等。

netfilter 和 iptables的关系

netfilter

netfilter位于Linux内核中的包过滤防火墙功能体系

它是Linux防火墙功能的基础,通过在数据包传输过程中进行函数的调用,允许对数据包进行修改、过滤和重定向。

netfilter称为Linux防火墙的“内核态”

iptables

iptables位于/sbin/iptables,是用来管理防火墙的命令工具

为防火墙体系提供过滤规则/策略,决定如何过滤或者处理达到防火墙的数据包

iptables是就是一个用户端的程序,给内核里的netfilter软件提供参数,告诉netfilter如何去过滤数据(哪些数据让它过,哪些不让它过)

iptables是一个防火墙工具--》作用:给linux内核的netfilter软件传递参数

iptables称为Linux防火墙的“用户态”

(人---》iptables ---》netfilter--》data) 

上述两种称呼都可以代表Linux的防火墙

firewalld

firewalld和iptables的区别

参考:细说firewalld和iptables - 爱你爱自己 - 博客园 (cnblogs.com)浅析Firewalld与Iptables_firewalld会扫描网络吗_奋斗吧,青年!的博客-CSDN博客

firewalld也是和iptables一样的防火墙传参工具

firewalld是对iptables进行了封装,换了另外的一套概念和方法,但是底层任然调用的是iptables

五虎上将图(iptables工作流程图)(iptables的四表五链)

包过滤防火墙iptables工作在TCP/IP的网络层

iptables的规则链、链结构:

规则链


规则的作用在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的“链”中
规则链是防火墙规则/策略的集合


默认的5种规则链


    INPUT:处理入站数据包  --》进入你的系统里的应用程序
    OUTPUT:处理出站数据包  --》应用程序的数据离开电脑
    FORWARD:处理转发数据包  --》做路由器使用,转发数据
    POSTROUTING链:在进行路由选择后处理数据包  --》SNAT
    PREROUTING链:在进行路由选择前处理数据包   -->DNAT

iptables的规则表、表结构:

规则表


具有某一类相似用途的防火墙规则,按照不同处理时机区分到不同的规则链以后,被归置到不同的“表”中
规则表是规则链的集合


默认的4个规则表


    raw表:确定是否对该数据包进行状态跟踪 --》记录我们的数据包以前来过没来过
    mangle表:为数据包设置标记 
    nat表:修改数据包中的源、目标IP地址或端口   --》实现snat和dnat的
    filter表:确定是否放行该数据包(过滤)  --》进入应用程序

iptables中意思的关键字解释:

chain 链
policy 策略/规则

ACCEPT  接收
DROP  丢弃
REJECT  委婉的拒绝--》不接收数据

[root@router ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

规则表间的优先顺序 

 规则表间的优先顺序
    依次为:raw、mangle、nat、filter 

 规则链间的匹配顺序 

 规则链间的匹配顺序
    入站数据:PREROUTING、INPUT
    出站数据:OUTPUT、POSTROUTING
    转发数据:PREROUTING、FORWARD、POSTROUTING

规则链内的匹配顺序 

规则链内的匹配顺序
    按顺序依次进行检查,找到相匹配的规则即停止(LOG策略会有例外)
    若在该链内找不到相匹配的规则,则按该链的默认策略处理

数据包过滤匹配流程

其中的路由选择表达的意思就是查看我们数据包里面的IP包头内目的地址网段跟我们本机器的网段是否一样,如果一样就会走INPUT链去,使数据访问本机,如果不一样,就会走FORWARD链,直接进行路由转发了

iptables命令:

iptables命令的语法格式

iptables  -t nat -L -n -v --line
(-t nat -L 表示展示nat表内的内容 -n表示以数字的形式显示 -v表示展示详细内容 --line 表示可以看到规则编号)

iptables的注意点:

当不指定表名的时候,默认表示filter表

不指定链名,默认表示该表内所有链

常用的iptables命令选项包括: 

常用的iptables命令选项包括:

  1. -A:添加一条规则。
  2. -D:删除一条规则。
  3. -I:插入一条规则到指定位置。
  4. -P:设置默认策略(如ACCEPT或DROP)。
  5. -L:列出规则。
  6. -F:清空规则表。
  7. -N:创建一个用户定义的链。
  8. -X:删除一个用户定义的链。

iptables实现例子:

1、允许特定IP地址的连接到SSH端口(例如,允许IP地址为192.168.1.100的主机连接到SSH端口22):
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT2、拒绝来自特定IP地址的HTTP访问(例如,拒绝IP地址为10.0.0.5的主机访问HTTP端口80):
iptables -A INPUT -p tcp --dport 80 -s 10.0.0.5 -j DROP3、将HTTP请求转发到本地Web服务器(例如,将外部端口8080映射到本地端口80):
iptables -A PREROUTING -t nat -p tcp --dport 8080 -j DNAT --to-destination 127.0.0.1:80
iptables -A FORWARD -p tcp -d 127.0.0.1 --dport 80 -j ACCEPT4、删除filter表内的第一条规则
iptables -t filter  -D INPUT 15、允许其他用户访问我的22号端口
iptables  -A INPUT  -p tcp --dport 22 -j ACCEPT

撰写清除iptables规则的脚本clear_rule.sh 

[root@goweb iptables]# cat clear_rule.sh 
#!/bin/bashiptables='/usr/sbin/iptables'    # 写绝对路径,防止没有找到iptables服务
$iptables -P INPUT ACCEPT     # 设置INPUT链默认为ACCEPT     
$iptables -F -t filter        # 清空filter表内所有防火墙规则
$iptables -t nat -F           # 清空nat表内所有防火墙规则[root@goweb iptables]# 

创建一个计划任务,每隔1分钟执行一次,清除防火墙规则(防止清除防火墙导致无法上网啦)

[root@goweb iptables]# crontab -l
*/1 * * * *  bash /iptables/clear_rule.sh
[root@goweb iptables]# 

计划任务里很大的一个坑:调用的脚本里,如果有些命令不使用绝对路径会导致命令查找不到,从而不能被执行

iptables创建新链

创建SC这条链(默认情况会保存在filter表内),并在自定义的规则链里添加规则

[root@router ~]# iptables -t filter   -N SC            在filter表内创建SC链
[root@router ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
LOG        icmp --  anywhere             anywhere             LOG level warningChain FORWARD (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         Chain SC (0 references)
target     prot opt source               destination         
[root@router ~]# 
[root@router ~]# iptables  -t filter  -A SC -p tcp --dport 8090 -j DROP 在自定义的规则链里添加规则
[root@router ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
LOG        icmp --  anywhere             anywhere             LOG level warningChain FORWARD (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         Chain SC (0 references)
target     prot opt source               destination         
DROP       tcp  --  anywhere             anywhere             tcp dpt:8090
[root@router ~]# [root@router ~]# iptables -t filter -A INPUT  -p tcp -j SC  这是INPUT链引用SC自定义链	
[root@router ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
LOG        icmp --  anywhere             anywhere             LOG level warning
SC         tcp  --  anywhere             anywhere            Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         Chain SC (1 references)
target     prot opt source               destination         
DROP       tcp  --  anywhere             anywhere             tcp dpt:8090
[root@router ~]# 

计算机网络中存在的一些条件:

传输层: 
    tcp  udp  ---》源端口和目的端口
网络层:
    ip  icmp  arp  ospf rip  
    ip: 源ip和目的ip
    icmp: 
        请求报文  8
        响应报文  0
数据链路层:
    源mac和目的mac

iptables匹配数据包的条件:(通用条件、隐含条件、显式条件)

通用条件匹配

LOG日志实现抓包功能的过程(ping命令抓包的实现)

LOG 抓包的过程
[root@router ~]# vim /etc/rsyslog.conf kern.*                                                 /var/log/sctest.log  #修改这一行
[root@router ~]# service rsyslog restart  #刷新日志服务
Redirecting to /bin/systemctl restart rsyslog.service
[root@router ~]# 
/var/log/sctest.log 是内核日志记录的文件
[root@router ~]# iptables  -I INPUT  -p icmp  -j LOG --log-prefix "fengdeyong"  --log-level 4     #添加规则在其他电脑上ping 该服务器 , 发现禁止ping了
C:\Users\san'chuang>ping  192.168.2.169
正在 Ping 192.168.2.169 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。192.168.2.169 的 Ping 统计信息:数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),
C:\Users\san'chuang>   [root@router ~]# tail -f /var/log/sctest.log   #在自己的机器上查看内核的日志文件
Aug  3 16:09:55 router kernel: fengdeyongIN=ens33 OUT= MAC=00:0c:29:27:30:f9:00:e0:4c:24:b5:81:08:00 SRC=192.168.2.142 DST=192.168.2.169 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=5991 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=22 
Aug  3 16:09:59 router kernel: fengdeyongIN=ens33 OUT= MAC=00:0c:29:27:30:f9:00:e0:4c:24:b5:81:08:00 SRC=192.168.2.142 DST=192.168.2.169 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=6020 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=23 
Aug  3 16:10:04 router kernel: fengdeyongIN=ens33 OUT= MAC=00:0c:29:27:30:f9:00:e0:4c:24:b5:81:08:00 SRC=192.168.2.142 DST=192.168.2.169 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=6038 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=24 
Aug  3 16:10:09 router kernel: fengdeyongIN=ens33 OUT= MAC=00:0c:29:27:30:f9:00:e0:4c:24:b5:81:08:00 SRC=192.168.2.142 DST=192.168.2.169 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=6040 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=25 

因此我们可以知道log能帮我记录信息,但是不能帮助我们处理信息。

隐含条件匹配

禁ping的iptables命令: 

[root@router ~]# iptables  -I INPUT  -p icmp --icmp-type 8 -j DROP  
禁止别人ping我们的服务器,但是我们可以ping别人

显式条件匹配

导入、导出防火墙规则

[root@router nat]#iptables-save >/etc/sysconfig/iptables  #导入规则[root@router nat]# iptables-restore </etc/sysconfig/iptables  #导出规则

开机自动加载我们的iptables规则

开机执行iptables脚本

修改/etc/rc.local,添加命令到文件的末尾

首先需要执行/lianxi/713/iptables.sh脚本,使iptables中生成规则链

bash /lianxi/713/iptables.sh

修改权限 

[root@sc 713]# chmod +x /etc/rc.d/rc.local
[root@sc 713]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 11月  9 2019 /etc/rc.local -> rc.d/rc.local
[root@sc 713]#

iptables-restore实现规则导入

修改/etc/rc.local,添加命令到文件的末尾命令:iptables-restore < /lianxi/713/iptables.rule

实验: 实现设置iptables规则指定端口访问实验

步骤:


    1.搭建一台linux服务器,开启ssh和MySQL和nginx服务
    2.使用防火墙iptables规则,允许192.168.0.*(你的windows机器)访问sshd服务,允许192.168.2.12~192.168.2.100这个ip地址段主机访问本机的8080端口
    3.允许192.168.0.13和192.168.0.14访问mysql服务(3306端口)
    4.web服务所有的人都可以访问
    5.允许ping服务器,允许dns域名查询
    6.其他的端口都不允许访问
    7.记录所有ping本机的信息到日志文件
    8.保证开机自动使用这个脚本里的规则

实验拓扑图:

设置只有端口22  53  67  3306  80 443端口可以访问

例如:打开22号端口

#open ssh
iptables -t filter  -A INPUT  -p tcp  --dport  22 -j ACCEPT

在我们的业务服务器上

open_app.sh

[root@goweb iptables]# cat open_app.sh 
#!/bin/bash#open ssh
iptables -t filter  -A INPUT  -p tcp  --dport  22 -j ACCEPT#open dns
iptables -t filter  -A INPUT  -p udp  --dport 53 -s 192.168.91.0/24 -j ACCEPT#open dhcp 
iptables -t filter  -A INPUT  -p udp   --dport 67 -j ACCEPT#open http/https
iptables -t filter  -A INPUT -p tcp   --dport 80 -j ACCEPT
iptables -t filter  -A INPUT -p tcp   --dport 443 -j ACCEPT#open mysql
iptables  -t filter  -A INPUT -p tcp  --dport 3306  -j ACCEPT#default policy DROP
iptables  -t filter  -P INPUT DROP #设置默认规则,如果不是从如上的端口访问进来的数据,就都会被iptables丢弃(DROP)# drop icmp request
iptables -t filter  -A INPUT -p icmp  --icmp-type 8 -j DROP #设置默认规则,禁止别的机器ping你
[root@goweb iptables]# 

在我们的路由器上进行

配置网关服务器(路由器)的SNAT和DNAT策略:SNAT_DNAT.sh 

SNAT_DNAT.sh 

[root@router nat]# cat SNAT_DNAT.sh 
#!/bin/bash#enable  routing
echo 1 >/proc/sys/net/ipv4/ip_forward############# stop firewall and clear iptables rule
service firewalld  stop
systemctl disable firewalldiptables -F
iptables -t nat -F###########enable SNAT
#iptables -t nat  -A POSTROUTING  -s 192.168.91.0/24  -o ens33  -j SNAT  --to-source  192.168.2.169
iptables -t nat  -A POSTROUTING  -s 192.168.91.0/24  -o ens33  -j MASQUERADE
#内网来的192.168.91.0网段过来的ip地址全部伪装(替换)为ens33接口的公网ip地址,好处就是不需要考虑ens33接口的ip地址是多少,你是哪个ip地址,我就伪装成哪个ip地址###########enable DNAT
#open ssh 2233 --->192.168.91.80 2233   目的是发布SSH
iptables  -t nat -A PREROUTING   -d  192.168.2.169  -i ens33  -p tcp  --dport 2233 -j DNAT  --to-destination 192.168.91.128:22#open web 80     目的是发布web服务器
iptables  -t nat -A PREROUTING  -d 192.168.2.169 -i ens33  -p tcp --dport 80 -j DNAT  --to-destination 192.168.91.128:80[root@router nat]# 

最后测试

验证DNAT发布的Web的80端口:

验证DNAT发布的SSH中的2233端口

其他的端口我们能通过内部的linux机器进行测试(192.168.91.80)

iptables总结:

iptables的条件:1.协议:tcp  udp  icmp-p   protocol  小写的p-p  icmp   --icmp-type  8    ping请求报文-p  icmp   --icmp-type  0    ping响应报文2.端口号:-p  tcp   --sport-p  tcp   --dport-p  udp   --sport-p  udp   --dport-p tcp --sport 20:80iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT3.ip地址-s  source-d  destination
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP4.mac地址5.状态6.其他-i  in-interface-o  out-interfaceiptables -I INPUT -i ens33 -p tcp --tcp-flags  SYN,RST,ACK  SYN -j REJECT
ens33接口上不接收tcp三次握手的第一个包--》不允许新的连接产生了[root@localhost ~]# iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP常见的数据包处理方式
ACCEPT:放行数据包
DROP:丢弃数据包
REJECT:拒绝数据包,给一个回复
LOG:记录日志信息,并传递给下一条规则处理  --》相当于抓包
用户自定义链名:传递给自定义链内的规则进行处理SNAT:修改数据包的源地址信息
DNAT:修改数据包的目标地址信息
MASQUERADE 实现snat功能,不需要经常换公网ip地址
自定义链[root@web-server ~]# iptables -t filter -N sanchuang 新建链
[root@web-server ~]# iptables -t filter -A sanchuang -p tcp --dport 22 -j ACCEPT  增加规则[root@web-server ~]# iptables -A INPUT -p tcp  --dport 22 -j  sanchuang  通过INPUT链给sanchuang链导流,然后会根据sanchuang链里的规则进行匹配

这篇关于计算机网络day16 防火墙 - iptables - netfilter - iptables的四表五链 - iptables命令 - iptables的匹配条件 - iptables端口实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207713

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚