Linux之Iptables简易应用

文档形成时期:2009-2024年
和iptables打交道有15年+了,经过无数实践后,形成一个简易应用文档。
文档主题是简易应用,所以其原理不详述了。
因软件世界之复杂和个人能力之限,难免疏漏和错误,欢迎指正。

文章目录

  • iptables简要说明
  • iptables和firewalld的关系
  • 如何选择防火墙
  • 禁用firewalld
  • 启用iptables
  • 保存经验
    • 通过自定义链并写入开机启动的解决案例
  • 加载内核模块
  • 基本操作
  • 常用模块和参数
    • iprange
    • icmp
    • sport和dport
    • multiport
    • state
    • mac
    • line-numbers
    • limit
    • comment
    • -j 动作
      • SNAT示例
      • DNAT示例
  • 应用案例
    • 通过iptables实现跨地域转发端口
    • LOG示例
    • 调节MTU
    • 简单限速
    • 通过状态模块实现FTP策略
    • 防攻击示例
    • 初始化和默认策略示例
  • 常规简易配置综合脚本范例

iptables简要说明

rhel7以下系列使用iptables,从rhel7开始使用firewalld,但iptables也存在,正因为共同存在,所以常给初用者造成诸多困扰。
rhel8开始firewalld已经与iptables解绑。

iptables和firewalld的关系

在RHEL7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。

如何选择防火墙

一般来讲:
rhel7或以下,选择iptables;
rhel8或以上,可以采用firewalld,使用iptables也是可以的,但两者选其一即可。
如果有docker、k8s等紧密依赖iptables的环境,建议采用iptables,禁用firewalld,请把这个配置写入新系统初始配置中。
ubuntu22仍然可保持采用iptables。
iptables

禁用firewalld

#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld

启用iptables

yum install -y iptables
yum install -y iptables-services

systemctl enable iptables.service
systemctl start iptables.service

保存经验

默认保存位置:/etc/sysconfig/iptables

两种常见保存方式:

  • 方式一
    service iptables save #安装了iptables套件后才有效,默认保存位置:/etc/sysconfig/iptables,iptables套件配置文件是/etc/sysconfig/iptables-config
  • 方式二
    iptables-save -c > /etc/sysconfig/iptables #没有安装iptables套件也可执行,参数-c是保存计数

保存为不同版本的示例

iptables-save > ipt.v1.0     #版本保存
iptables-restore < ipt.v1.0  #恢复datetime=$(date +%Y%m%d-%H%M%S)
iptables-save -c > /etc/sysconfig/iptables_${datetime} #以时间为版本保存
iptables-restore -c < /etc/sysconfig/iptables_${datetime}

在多人管理的工作环境中,采用同一脚本去管理iptables是非常推荐的做法,但如果确实混乱不堪,维护好/etc/sysconfig/iptables是最好的选择。参考常规简易配置综合脚本范例

在iptables和firewalld共存的系统,比如rhel7系列,但又没有安装iptables套件,或采用了firewalld和iptables共同管理防火墙,造成了iptables策略混乱,这时候可用iptables-save命令保存策略,不过这时可能更应该考虑采用firewalld去管理iptables

2024年实践中发现,k8s的网络插件calico管理的iptables策略可能造成iptables-save命令也无法完整保存策略,这需要根据生产场景来制定应对方案,以避免重启后策略丢失。

通过自定义链并写入开机启动的解决案例

#!/bin/bash
###################################
# function   iptables防火墙因服务不正常而采用的临时处置
#
# 参考创建或使用示例: mkdir -p /root/sh/log; touch /root/sh/iptables_for_tmp.sh; chmod a+x /root/sh/iptables_for_tmp.sh
#
# if (! grep -q iptables_for_tmp /etc/rc.local); then echo '/root/sh/iptables_for_tmp.sh >> /root/sh/log/iptables_for_tmp.log 2>&1' >> /etc/rc.local; else echo "This script already exists in /etc/rc.local"; fi; chmod a+x /etc/rc.d/rc.local
#
# Change History:
# date        author       note
# 20240105    N        k8s的calico导致防火墙iptables服务无法恢复运行,改用脚本
#
###################################export LANG=C
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# 22端口处理 ###
iptables -F FOR_TMP > /dev/null 2>&1
iptables -D INPUT -j FOR_TMP > /dev/null 2>&1
iptables -X FOR_TMP > /dev/null 2>&1
iptables -N FOR_TMP
iptables -I INPUT -j FOR_TMP#放通
iptables -I FOR_TMP -s 1.2.3.4 -p tcp --dport 22 -j ACCEPT#限制
iptables -A FOR_TMP -p tcp --dport 22 -j DROP#保存
iptables-save -c > /etc/sysconfig/iptables # 执行后保存if (! grep -q iptables_for_tmp /etc/rc.local); then echo '/root/sh/iptables_for_tmp.sh >> /root/sh/log/iptables_for_tmp.log 2>&1' >> /etc/rc.local; else echo "This script already exists in /etc/rc.local"; fi; chmod a+x /etc/rc.d/rc.local

该脚本可以反复执行,不会产生冗余策略。

加载内核模块

在早期版本的Linux内核,iptables的NAT,一般不能使用FTP的20端口,可以使用下面命令加载模块
insmod /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter/ip_conntrack_ftp.ko
insmod /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter/ip_nat_ftp.ko
或使用modprobe命令加载(推荐modprobe,因为insmod不解决依赖关系)
允许NAT转换FTP的跟踪连接,如下:
modprobe ip_nat_ftp
允许本机FTP的跟踪连接,这样就不必设置允许20和被动端口了
modprobe ip_conntrack_ftp

脚本中常用配置:

modules="ip_conntrack_ftp ip_conntrack_irc ip_nat_pptp ip_gre ip_conntrack_pptp ip_conntrack_proto_gre"
for mod in $modules
dotestmod=`lsmod | grep "${mod}"`if [ "$testmod" == "" ]; thenmodprobe $modfi
done

基于近些年Linux内核版本的系统,比如rhel6+,还未仔细分析过是否默认支持上述模块,没有的话,可以根据业务场景选择是否加载。

基本操作

iptables规则执行顺序是从上到下,前面的匹配后就不再看后面的。
基本语法:
iptables [-t table] -[AD] chain rule-specification [options]
iptables [-t table] -I chain [rulenum] rule-specification [options]
iptables [-t table] -R chain rulenum rule-specification [options]
iptables [-t table] -D chain rulenum [options]
iptables [-t table] -[LFZ] [chain] [options]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target [options]
iptables [-t table] -E old-chain-name new-chain-name

iptables -A 添加一条规则到末尾
iptables -D 删除
iptables -I 插入一条规则到最前面
iptables -R 替换
iptables -vnL 列表
iptables -vnL --line-numbers 列表时同时显示策略号,方便更新局部策略,而不需要重新配置所有策略。

常用模块和参数

iprange

–src-range ip-ip Match source IP in the specified range.
–dst-range ip-ip
例:
-m iprange --src-range 192.168.10.2-192.168.10.6
iptables -I INPUT -m iprange --src-range 192.168.10.2-192.168.10.6 -p tcp --dport 22 -j ACCEPT

icmp

-p icmp --icmp-type 类型 ping: type 8 pong: type 0

sport和dport

-p tcp
-p udp
–sport 和–dport 必须配合-p 参数使用

multiport

   This  module  matches  a set of source or destination ports.  Up to 15 ports can be specified.  A port range (port:port) counts as twoports.  It can only be used in conjunction with -p tcp or -p udp.--source-ports [!] port[,port[,port:port...]]Match if the source port is one of the given ports.  The flag --sports is a convenient alias for this option.--destination-ports [!] port[,port[,port:port...]]Match if the destination port is one of the given ports.  The flag --dports is a convenient alias for this option.--ports [!] port[,port[,port:port...]]Match if either the source or destination ports are equal to one of the given ports.

例:
-p tcp -m multiport --dports 20,21,22

state

-m state --state 状态 状态:NEW、RELATED、ESTABLISHED、INVALID
NEW:有别于tcp 的syn
ESTABLISHED:连接态
RELATED:衍生态,与conntrack 关联(比如FTP常用)
INVALID:不能被识别属于哪个连接或没有任何状态

mac

mac --mac-source [!] addressMatch source MAC address.  It must be of the form XX:XX:XX:XX:XX:XX.  Note that this only makes sense for packets  coming  froman Ethernet device and entering the PREROUTING, FORWARD or INPUT chains.

line-numbers

--line-numbersWhen listing rules, add line numbers to the beginning of each rule, corresponding to that rule's position in the chain.

limit

   This module matches at a limited rate using a token bucket filter.  A rule using this extension will match until this limit is reached(unless the flag is used).  It can be used in combination with the LOG target to give limited logging, for example.--limit rateMaximum average matching rate: specified as a number, with an optional second minute hour or day suffix;  thedefault is 3/hour.注意:limit 英语上看是限制的意思,但实际上只是按一定速率去匹配而已,要想限制的话后面要再跟一条DROP,但使用下面这条就不必了。--limit-burst numberMaximum  initial  number  of  packets  to  match: this number gets recharged by one every time the limit specified above is notreached, up to this number; the default is 5.

comment

   Allows you to add comments (up to 256 characters) to any rule.--comment commentExample:iptables -A INPUT -s 192.168.0.0/16 -m comment --comment "A privatized IP block"

-j 动作

-j有如下动作:
DROP 丢弃
ACCEPT 接受
LOG 记入日志,默认是message
–log-tcp-options :记录tcp header的相关资讯
–log-ip-options :记录ip header的相关资讯
RETURN 返回父链,例:假设一个包进入了INPUT 链,匹配了某条target 为–jump EXAMPLE_CHAIN 规则,然后进入了子链EXAMPLE_CHAIN。在子链中又匹配了某条规则,恰巧target 是–jump RETURN,那包就返回INPUT 链了。如果在INPUT链里又遇到了–jump RETURN,那这个包就要交由缺省的策略来处理了。
SNAT 更换源地址,NAT
DNAT 更换目的地址,NAT
MASQUERADE 伪装为-o选项指定的网卡上的IP,比SNAT和DNAT负载稍高

SNAT示例

通常用于客户端上外网
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -d 1.2.3.0/255.255.255.0 -j SNAT --to-source 192.168.1.2
特别注意192.168.1.2是本系统的出站网口IP,通过ip a可以查看到

DNAT示例

通常用于服务器端口的发布
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to X.X.X.X:8080

应用案例

通过iptables实现跨地域转发端口

iptables端口代理,做到像nginx,haproxy一样转发TCP请求,但是它不能关心应用层的东西,比机主机头,没有超时时间限制,除非网络不稳定

开启系统路由

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

或者修改/etc/sysctl.conf
net.ipv4.ip_forward = 1
然后执行sysctl -p 永久生效

添加nat策略到转发服务器iptables主脚本(假设通过脚本管理iptables且有一个主脚本),在转发服务器添加,示例如下

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -t nat -A PREROUTING -i eth0 -d 转发服务器本机系统ip -p tcp -m multiport --dport 80,8080 -j DNAT --to-destination 目标服务器公网ip
iptables -t nat -A POSTROUTING -o eth0 -d 目标服务器公网ip -p tcp -m multiport --dport 80,8080 -j SNAT --to-source 转发服务器本机系统ip

运行防火墙主脚本

LOG示例

iptables -A INPUT -s x.x.x.x -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES IMLOG] : ’

调节MTU

iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

简单限速

-A FORWARD -m limit -d 192.168.0.2 --limit 86/sec -j ACCEPT # 这句意思是限定每秒只转发86个到达192.168.0.2的数据包(约每秒128KB 一个数据包是1.5KB)

-A FORWARD -d 192.168.0.2 -j DROP #这句作用是超过限制的到达192.168.0.2的数据包不通过)
上面两条同时应用才有效。

通过状态模块实现FTP策略

对于FTP,如果有允许状态RELATED,ESTABLISHED的规则,并加载了ip_conntrack_ftp模块
就不必再单独允许20和被动端口,如:
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s -p tcp --dport 21 -j ACCEPT

防攻击示例

丢弃坏的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

处理IP碎片数量,防止攻击,允许每秒100个,-f就是指定碎片包
[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制.

限制 ping (echo-request) 传入的速度
限制前, 可正常每 0.2 秒 ping 一次
ping your.linux.ip -i 0.2

限制每秒只接受一个 icmp echo-request 封包
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j Drop
–limit 1/s 表示每秒一次; 1/m 则为每分钟一次
–limit-burst 表示允许触发 limit 限制的最大次数

限制 ssh 连入频率
建立自订 Chain, 限制 tcp 连线每分钟一次, 超过者触发 Log 记录 (记录在 /var/log/messages)
iptables -N ratelimit
iptables -A ratelimit -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A ratelimit -p tcp --syn -m limit --limit 1/m --limit-burst 1 -j ACCEPT
iptables -A ratelimit -p tcp -j LOG --log-level “NOTICE” --log-prefix “[RATELIMIT]”
iptables -A ratelimit -p tcp -j Drop

引用自定义Chain, 限制 ssh (tcp port 22) 连入频率
iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/16 -j ACCEPT (特定 IP 来源不受限制)
iptables -A INPUT -p tcp --dport 22 -j ratelimit
结合sshd_config设定
LoginGraceTime 30 密码输入时限为 30 秒
MaxAuthTries 2 最多只能输入 3 次密码

防治 SYN-Flood 碎片攻击
iptables -N syn-flood
iptables -A syn-flood -m limit --limit 100/s --limit-burst 150 -j RETURN
iptables -A syn-flood -j DROP
iptables -I INPUT -j syn-flood

控制单个IP的最大并发连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT #允许单个IP的最大连接数为 30
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
#单个IP在60秒内只允许最多新建30个连接

iptables也有缓存cc或ddos攻击的能力,但现如果很多cc和ddos都不是iptables能解决的,这里就略了。

初始化和默认策略示例

初始化(不会影响默认策略)
iptables -F 清空规则
iptables -X 清除自定义规则链
iptables -Z 将所有chain计数归零

默认策略,通过iptables -A或-I等是不会改变默认策略的。
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -F
iptables -t nat -X

常规简易配置综合脚本范例

一个非常简易通用适用于大部分场景的基础脚本,基于此广泛应用于rhel5-rhel9系列和ubuntu系列的数千台系统,有充分的实践过程,可靠且易于维护。
在有docker或k8s的环境中,建议基于此改用自定义链维护自定义策略,在本文通过自定义链并写入开机启动的解决案例中有采用自定义链的方式可参考。

#!/bin/bash
###################################
# function iptables 常用linux防火墙主脚本 默认阻止所有,允许部分
#
# create: touch /root/sh/iptables.sh; chmod 700 /root/sh/iptables.sh
#
# Change History:
# 2009/12/09 N create
# 2017/08/03 N improve
############################################ ENV #################
export LANG=C
#export LC_ALL=C
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin###### filter table ################
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -X###### INPUT chains ####### 20190618 TCP的远程拒绝服务漏洞临时解决措施
iptables -I INPUT -p tcp --tcp-flags SYN SYN -m tcpmss --mss 1:500 -j DROP -m comment --comment "TCP的远程拒绝服务漏洞临时解决措施"iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT### ICMP ###
iptables -A INPUT -p icmp -m icmp --icmp-type any -m limit --limit 20/s -j ACCEPT### web ###
iptables -A INPUT -p tcp -m state --state NEW -m multiport --dport 80,443 --tcp-flags SYN,RST,ACK SYN -j ACCEPT### mon ###
# zabbix
iptables -A INPUT -s 1.2.3.4 -p tcp --dport 10050 -j ACCEPT### Trust Network #################
adminiplistdata_array=(
'1.2.3.4 VPN1'
'1.2.3.5 VPN2'
)
# 注意:上面是模拟二维数组,确保每行有两个“元素”,并用单引号包住。
for adminipdata in "${adminiplistdata_array[@]}"
doadminip=`echo $adminipdata | awk '{ print $1; }'`adminip_comment=`echo $adminipdata | awk '{ print $2; }'`iptables -A INPUT -s $adminip -p tcp -m multiport --dport 20,21,22,3306 -j ACCEPT -m comment --comment "$adminip_comment"
done### global ###
iptables -A INPUT -j DROP###### save ####################
iptables-save -c > /etc/sysconfig/iptables
iptables-save -c > /etc/sysconfig/iptables_$(date +%Y%m%d-%H%M%S)

该脚本可以反复执行,不会产生冗余策略。

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

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

相关文章

C语言理解

目录 计算机语言算法C项目创建C程序框架经典实例 计算机语言 程序是用特殊的编程语言&#xff08;这里是C语言&#xff09;写出来表达如何解决问题的不是用编程语言来和计算机交谈&#xff0c;而是描述要求它如何做事情的过程或方法程序是问题的载体&#xff0c;程序的执行就是…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-6 线性控制器设计Linear Controller Design

本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-6 线性控制器设计Linear Controller Design

跨平台的文件传输协议@windows端服务器的配置@smb协议共享方案@ftp服务器设置

文章目录 abstractrefs ftp server下面是核心步骤FAQ smb server设置方法右键设置共享文件夹查看所有已经共享的文件夹停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题协议相关信息参考android客户端推荐FAQ不同用户文件无法访问 比较和总结其他用户访问smb服务器共享…

【LV12 DAY15 WDT】

WDT简介 看门狗定时器&#xff0c;其主要作用是发生软件故障时可产生复位信号使SOC复位&#xff0c;其本质上是一个计数器。 #include "exynos_4412.h"void delay(unsigned int time){while(time--);}int main(){//设置一级分频//WDT.WTCONWDT.WTCON | (0X4e<&l…

优惠券兑换码生成需求——事务同步回调问题分析

前段时间收到一个优惠券兑换码的需求&#xff1a;管理后台针对一个优惠券发起批量生成兑换码&#xff0c;这些兑换码可以导出分发到各个合作渠道&#xff08;比如&#xff1a;抖音、京东等&#xff09;&#xff0c;用户通过这些渠道获取到兑换码之后&#xff0c;再登录到我司研…

鸿鹄云商B2B2C:JAVA实现的商家间直播带货商城系统概览

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

数据库与低代码:加速开发,提升效率的完美结合

随着技术的不断进步&#xff0c;数据库和低代码开发成为了现代应用程序开发中的两大关键要素。本文将探讨如何通过结合数据库和低代码开发&#xff0c;加速应用程序的开发过程&#xff0c;并提高开发效率和质量。 在过去的几十年中&#xff0c;数据库一直被视为应用程序开发中不…

使用srs_librtmp实现RTMP推流

1、背景 由于项目有需求在一个现有的产品上增加RTMP推流的功能&#xff0c;目前只推视频流。 2、方案选择 由于是在现有的产品上新增功能&#xff0c;那么为了减少总的成本&#xff0c;故选择只动应用软件的来实现需求。 现有的产品中的第三方库比较有限&#xff0c;连个ffmp…

Linux CentOS 7.6安装nginx详细保姆级教程

一、通过wget下载nginx压缩包 1、进入home文件并创建nginx文件夹用来存放nginx压缩包 cd /home //进入home文件夹 mkdir nginx //创建nginx文件夹 cd nginx //进入nginx文件夹2、下载nginx,我这里下载的是Nginx 1.24.0版本&#xff0c;如果要下载新版本可以去官网进行下载:…

回归预测 | Matlab基于SMA+WOA+SFO-LSSVM多输入单输出回归预测

回归预测 | Matlab基于SMAWOASFO-LSSVM多输入单输出回归预测 目录 回归预测 | Matlab基于SMAWOASFO-LSSVM多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SMAWOASFO-LSSVM回归预测 基于黏菌算法鲸鱼算法向日葵算法优化LSSVM回归预测 其中包含三种改进…

RSIC-V“一芯”学习笔记(一)——概述

考研的文章和资料之后想写的时候再写怕趴 文章目录 一、阶段设计二、环境、开发语言和工具三、最重要的两个观念四、处理器芯片设计五、处理器芯片设计包含很多软件问题六、处理器芯片的评价指标七、复杂系统的构建和维护八、专业世界观九&#xff0c;提问的艺术(提问模板)十、…

Ubuntu下使用Virtual Box中显示没有可用的USB设备

Ubuntu中使用Virtual Box&#xff0c;但是使用到USB时只有USB1.1可以使用&#xff0c;并且提示没有可以使用的USB设备&#xff0c;解决方法如下 下载并安装Vitrual Box提供的功能扩展包 分别点击帮助->关于&#xff0c;查看当前使用的版本进入到Virtual Box官网下载链接根…

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置!

vue前端开发自学练习,Props数据传递-类型校验,默认值的设置&#xff01; 实际上&#xff0c;vue开发框架的时候&#xff0c;充分考虑到了前端开发人员可能会遇到的各种各样的情况&#xff0c;比如大家经常遇到的&#xff0c;数据类型的校验&#xff0c;再比如&#xff0c;默认…

Spring之整合Mybatis底层源码

文章目录 一、整体核心思路1 . 简介2. 整合思路 二、源码分析1. 环境准备2. 源码分析 一、整体核心思路 1 . 简介 有很多框架需要与Spring进行整合&#xff0c;而整合的核心思路就是把其他框架所产生的对象放到Spring容器中&#xff0c;让其成为一个bean。比如Mybatis&#x…

在Colab上测试Mamba

我们在前面的文章介绍了研究人员推出了一种挑战Transformer的新架构Mamba 他们的研究表明&#xff0c;Mamba是一种状态空间模型(SSM)&#xff0c;在不同的模式(如语言、音频和时间序列)中表现出卓越的性能。为了说明这一点&#xff0c;研究人员使用Mamba-3B模型进行了语言建模…

Oladance、南卡、Cleer开放式耳机怎么样?全方位测评大PK!

​开放式耳机作为新兴的音频设备领域中备受欢迎的选择&#xff0c;但市场上琳琅满目的产品汇集了质量千差万别的耳机&#xff0c;其中存在着一些粗制滥造的产品。身为一位音频设备测评博主&#xff0c;我经常收到有关哪个品牌的开放式耳机质量好的疑问。面对市面上众多选择&…

MFC结合GDI+

MFC结合GDI 创建一个空的MFC界面&#xff0c;在确定按钮函数里进行画图&#xff1a; 1、包含头文件与库 在stdafx.h中加入以下三行代码&#xff1a; #include "gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "gdiplus.lib")2、安装GDI 在…

uni-app做A-Z排序通讯录、索引列表

上图是效果图&#xff0c;三个问题 访问电话通讯录&#xff0c;拿数据拿到用户的联系人数组对象&#xff0c;之后根据A-Z排序根据字母索引快速搜索 首先说数据怎么拿 - 社区有指导https://ask.dcloud.net.cn/question/64117 uniapp 调取通讯录 // #ifdef APP-PLUSplus.contac…

安谋科技“周易”NPU与飞桨完成II级兼容性测试,助力实现多样化AI部署

近日&#xff0c;安谋科技&#xff08;中国&#xff09;有限公司&#xff08;以下简称“安谋科技”&#xff09;“周易”NPU系列IP与飞桨已完成II级兼容性测试&#xff0c;测试结果显示&#xff0c;双方兼容性表现良好&#xff0c;整体运行稳定。这是安谋科技加入“硬件生态共创…

【Node.js学习 day3——http模块】

创建HTTP服务端 //1.导入http模块 const http require(http);//2.创建服务对象 const server http.createServer((request, response) > {response.end(Hello HTTP Server);//设置响应体 });//3.监听端口&#xff0c;启动服务 server.listen(9000,()>{console.log(服务…