IPTABLE:Linux下的网络防火墙

IPTABLE:Linux下的网络防火墙

引言

在Linux系统中,IPtable是一种强大的网络防火墙工具,广泛应用于各种网络环境中。它不仅可以实现基本的包过滤功能,还能进行网络地址转换(NAT)、数据包记录、流量统计等高级功能。本文将详细介绍IPtable的定义、架构、原理、应用场景以及常见的命令体系,帮助读者更好地理解和使用这一工具。


一、IPtable定义

IPTABLE是一种网络防火墙,在LINUX下使用,RedHat9.0版本以上自带。它可以实现NAT转换,做上网代理。IPtable位于/sbin/iptables,是Linux防火墙的管理工具,而真正实现防火墙功能的是Netfilter,它是Linux内核中实现包过滤的内部结构。

防火墙(firewall)一词本是建筑用语,本意是为了保护建筑物不受火灾侵害的,后来被借鉴到了网络通信领域中,表示保护局域网或主机不受网络攻击的侵害。防火墙工作在主机或者网络边缘,对于进出的数据报文按照事先定义好的规则进行检查、监控,一旦符合标准,就按照事先定义好的规则处理动作。


二、IPtable架构

IPtable的架构基于Linux内核中的Netfilter子系统,Netfilter提供了数据包过滤、网络地址转换、数据包修改和数据跟踪等功能。IPtable则是控制Netfilter的工具,它将复杂的规则组织成易于管理的方式,方便管理员进行分组测试、启动或关闭某组规则。

1. Netfilter子系统

Netfilter是Linux内核中负责网络数据包处理的子系统,它提供了以下四个表:

  • Filter表:用于包过滤,包含INPUT、FORWARD、OUTPUT三个链。
  • NAT表:用于网络地址转换(IP、端口),包含PREROUTING、POSTROUTING、OUTPUT三个链。
  • Mangle表:用于修改数据包的服务类型、TTL等,包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD五个链。
  • Raw表:用于决定数据包是否被状态跟踪机制处理,包含OUTPUT、PREROUTING两个链。

这些表具有一定的优先级:raw -> mangle -> nat -> filter。当数据包经过内核时,会按照这些表的优先级顺序进行检查和处理。

2. 规则链与规则表

IPtable中定义了五个规则链,分别对应数据包经过内核的五个关键地方,称为钩子函数:

  • PREROUTING:在数据包进行路由选择前应用此链中的规则。
  • INPUT:进入防火墙主机的数据包应用此链中的策略。
  • FORWARD:转发数据包时应用此链中的策略。
  • OUTPUT:防火墙主机向外部地址发送的数据包应用此链中的策略。
  • POSTROUTING:在数据包进行路由选择后应用此链中的规则。

每个钩子函数中可以定义多条规则,每当数据包到达一个钩子函数时,IPtable就会从该钩子函数中的第一条规则开始检查,看数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理数据包;否则IPtable将继续检查下一条规则。如果该数据包不符合钩子函数中任一条规则,IPtable就会根据该函数预先定义的默认策略来处理数据包。


三、IPtable原理

IPtable的原理在于对经过内核的数据包进行过滤和处理。数据包在内核空间中处理时,会根据预设的规则链和规则表进行检查和决策。

1. 数据包处理流程

当主机收到一个数据包后,数据包先在内核空间中处理。若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理;若发现目的不是自身,则会将包丢弃或进行转发。

IPtable在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数。IPtable这款用户空间的软件可以在这五处地方写规则,对经过的数据包进行处理。

具体的数据包处理流程如下:

  • 入站流程
    • 数据包到达防火墙后,首先被PREROUTING链处理(是否修改数据包地址等)。
    • 然后进行路由选择(判断数据包发往何处)。
    • 如果数据包的目标地址是防火墙本机(如Internet用户访问网关的Web服务端口),则内核将其传递给INPUT链进行处理(决定是否允许通过等)。
  • 出站流程
    • 防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT链处理。
    • 然后进行路由选择。
    • 再交给POSTROUTING链(是否修改数据包的地址等)进行处理。
  • 转发流程
    • 来自外界的数据包到达防火墙后,首先被PREROUTING链处理。
    • 然后进行路由选择。
    • 如果数据包的目标地址是其他的外部地址(如局域网用户通过网关访问QQ服务器),则内核将其传递给FORWARD链进行处理(允许转发、拦截、丢弃)。
    • 最后交给POSTROUTING链(是否修改数据包的地址等)进行处理。
2. 规则匹配与动作

IPtable中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪)。当数据包到达一个钩子函数时,IPtable会从该钩子函数中的第一条规则开始检查,看数据包是否满足规则所定义的条件。规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。

IPtable中常见的动作有:

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包,不给出任何回应。
  • REJECT:拒绝数据包通过,必要时会给出提示。
  • LOG:记录日志信息,然后传给下一条规则继续匹配。

如果数据包满足某条规则的条件,IPtable就会根据该条规则所定义的动作处理数据包;否则,IPtable将继续检查下一条规则。如果该数据包不符合钩子函数中任一条规则,IPtable就会根据该函数预先定义的默认策略来处理数据包。


四、IPtable应用场景

IPtable广泛应用于各种网络环境中,可以实现多种网络功能。以下是一些常见的应用场景:

1. 网关服务器安全策略

目标:网关服务器系统自生安全策略,只对内网用户开放特定端口(如sshd服务)。

配置步骤:

  1. 清空filter表和nat表。
  2. 设置默认策略(INPUT链默认为DROP,OUTPUT链和FORWARD链默认为ACCEPT)。
  3. 配置回环接口(lo)默认accept。
  4. 只对内网用户开放sshd服务(如只允许192.168.138.0/24网段的用户访问22端口)。
# 清空 filter table
iptables -F -t filter
iptables -X -t filter
iptables -Z -t filter
# 清空 nat table
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
# 设置默认策略
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
# 回环接口(lo),默认accept
iptables -A INPUT -p ALL -i lo -j ACCEPT
# 只对内网用户开放sshd服务
iptables -A INPUT -p tcp -s 192.168.138.0/24 --dport 22 -j ACCEPT
2. 共享上网(NAT)

目标:使局域网的用户都可以访问外网的服务器。

配置步骤:

  1. 启用IP转发功能。
  2. 配置POSTROUTING链,实现SNAT或MASQUERADE(动态SNAT地址转换)。
# 启用IP转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置POSTROUTING链,实现MASQUERADE(适合ADSL动态拨号场景)
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
3. 内网服务器对外服务(端口映射)

目标:使外网用户可以访问到局域网内的特定服务器(如HTTP服务)。

配置步骤:

  1. 启用IP转发功能。
  2. 配置PREROUTING链和POSTROUTING链,实现DNAT和SNAT。
# 启用IP转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置PREROUTING链,实现DNAT
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.138.21
# 配置POSTROUTING链,实现SNAT(或MASQUERADE)
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
4. 透明代理服务器

目标:使局域网用户访问外网web服务时,自动使用squid作为透明代理服务器。

配置步骤:

  1. 启用IP转发功能。
  1. 配置PREROUTING链,实现DNAT到代理服务器(假设代理服务器的IP地址为192.168.138.10,监听端口为3128)。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.138.10:3128
  1. 配置FORWARD链,允许经过的数据包进行转发。
iptables -A FORWARD -p tcp -d 192.168.138.10 --dport 3128 -j ACCEPT
  1. 配置POSTROUTING链,确保从代理服务器返回的数据包能够正确地路由回原始请求者。
iptables -t nat -A POSTROUTING -s 192.168.138.0/24 -o eth0 -j MASQUERADE

注意:这里的eth0是连接外网的网卡接口,根据实际情况替换。

5. 防火墙日志记录

目标:记录所有被拒绝的入站连接尝试,以便后续分析。

配置步骤:

  1. 启用日志记录功能。
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4

这条规则表示每分钟最多记录5次被拒绝的入站连接尝试,日志级别为4(警告),前缀为"iptables denied: "。

  1. 配置拒绝策略。
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

这条规则表示对所有不符合前面定义的允许规则的入站数据包执行拒绝操作,并返回ICMP消息“host prohibited”。

6. 流量控制

目标:限制特定IP地址的下载速度,防止网络拥塞。

配置步骤:

  1. 使用iptablesHASHLIMIT模块来限制特定IP的下载速度。
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-above 10/minute --hashlimit-burst 5 -j DROP

这条规则表示对每个IP地址,如果其在1分钟内下载请求超过10次(突发流量为5次),则后续的下载请求将被丢弃。

  1. 更精细的流量控制可以使用tc(Traffic Control)工具,但tciptables的结合使用通常涉及更复杂的网络架构和配置,这里不展开详述。

五、IPtable常见命令体系

IPtable的命令体系丰富,涵盖了规则管理、链管理、表管理等多个方面。以下是一些常用的IPtable命令及其解释:

1. 规则管理命令
  • iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • -D, --delete:删除指定链中的一条规则。可以是按规则编号删除,也可以是按规则内容匹配删除。

    iptables -D INPUT 1 # 删除INPUT链的第一条规则
    iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 删除匹配到的规则
  • -R, --replace:替换指定链中的一条规则。

    iptables -R INPUT 1 -p tcp --dport 80 -j ACCEPT # 将INPUT链的第一条规则替换为允许HTTP流量
  • -I, --insert:在指定链的指定位置插入一条规则。默认为链的开头。

    iptables -I INPUT -p tcp --dport 23 -j DROP # 在INPUT链的开头插入一条拒绝Telnet流量的规则
  • -L, --list:列出指定链中的所有规则。

    iptables -L INPUT # 列出INPUT链的所有规则
  • -F, --flush:清空指定链中的所有规则。

    iptables -F INPUT # 清空INPUT链的所有规则
  • -Z, --zero:将指定链中所有规则的数据包计数器和字节计数器清零。

    iptables -Z INPUT # 将INPUT链的所有规则的计数器清零
  • -N, --new-chain:创建一个新的用户自定义链。

    iptables -N MYCHAIN # 创建一个名为MYCHAIN的新链
  • -X, --delete-chain:删除一个用户自定义链。如果该链被其他规则引用,则无法删除。

    iptables -X MYCHAIN # 删除名为MYCHAIN的链
  • -E, --rename-chain:重命名一个用户自定义链。

    iptables -E MYCHAIN NEWCHAIN # 将MYCHAIN重命名为NEWCHAIN
2. 匹配条件
  • -p, --protocol:指定要匹配的协议类型(如tcp, udp, icmp等)。

    iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP流量
  • -s, --source:指定源IP地址或网络。

    iptables -A INPUT -s 192.168.1.100 -j DROP # 拒绝来自192.168.1.100的流量
  • -d, --destination:指定目标IP地址或网络。

    iptables -A OUTPUT -d 8.8.8.8 -j ACCEPT # 允许访问8.8.8.8的流量
  • --sport, --source-port:指定源端口。

    iptables -A INPUT -p tcp --sport 22 -j ACCEPT # 允许源端口为22的TCP流量
  • --dport, --destination-port:指定目标端口。

    iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许目标端口为80的TCP流量
  • -m, --match:指定要使用的扩展匹配模块(如multiport, state, conntrack等)。

    iptables -A INPUT -m multiport --dports 22,80 -j ACCEPT # 允许目标端口为22或80的流量
  • -i, --in-interface:指定数据包进入的网络接口。

    iptables -A INPUT -i eth0 -j ACCEPT # 允许通过eth0接口进入的流量
  • -o, --out-interface:指定数据包离开的网络接口。

    iptables -A OUTPUT -o eth1 -j DROP # 拒绝通过eth1接口离开的流量
3. 动作
  • -j, --jump:指定匹配规则后的动作(如ACCEPT, DROP, REJECT, LOG等)。

    iptables -A INPUT -p tcp --dport 23 -j REJECT --reject-with icmp-port-unreachable # 拒绝Telnet流量,并返回ICMP消息
  • --log-prefix:指定日志前缀。

    iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4 # 记录被拒绝的流量,日志前缀为"iptables denied: "
  • --log-level:指定日志级别。

    # 同上例
  • --reject-with:指定REJECT动作返回的消息类型(如icmp-port-unreachable, icmp-host-prohibited等)。

    # 同上例
六、保存和恢复iptables规则

由于iptables规则在系统重启后会丢失,因此我们需要一种方法来保存当前的规则配置,并在系统重新启动后恢复它们。

1. 保存iptables规则

在大多数Linux发行版中,你可以使用iptables-save命令来保存当前的iptables规则。这个命令会将规则输出到标准输出(通常是终端),但你可以将其重定向到一个文件中以便稍后恢复。

sudo iptables-save > /etc/iptables/rules.v4

上面的命令会将IPv4的iptables规则保存到/etc/iptables/rules.v4文件中。如果你还需要保存IPv6的规则,可以使用ip6tables-save命令:

sudo ip6tables-save > /etc/iptables/rules.v6
2. 恢复iptables规则

在系统启动时,你可以使用iptables-restore命令来从文件中恢复iptables规则。这通常是通过系统服务或启动脚本来实现的。

你可以手动运行以下命令来恢复规则:

 

sh复制代码

sudo iptables-restore < /etc/iptables/rules.v4
sudo ip6tables-restore < /etc/iptables/rules.v6

但是,更常见的是将这些命令添加到系统的启动脚本中,以便在系统启动时自动恢复规则。在基于systemd的系统中,你可以创建一个systemd服务单元文件来实现这一点。

3. 创建systemd服务单元文件(可选)

你可以创建一个systemd服务单元文件,以便在系统启动时自动恢复iptables规则。以下是一个示例:

[Unit]
Description=Restore iptables rules
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
ExecStartPost=/sbin/ip6tables-restore /etc/iptables/rules.v6
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

将上述内容保存为/etc/systemd/system/iptables-restore.service,然后启用并启动该服务:

sudo systemctl enable iptables-restore.service
sudo systemctl start iptables-restore.service

现在,每次系统启动时,iptables规则都会自动从文件中恢复。

七、额外的配置和管理技巧
1. 使用iptables-persistent(可选)

在一些Linux发行版中,你可以使用iptables-persistent包来自动保存和恢复iptables规则。这个包提供了一个简单的机制来在系统启动时恢复iptables规则,并在规则更改时保存它们。

你可以通过你的包管理器安装iptables-persistent,例如:

sudo apt-get install iptables-persistent # 对于Debian/Ubuntu系统
sudo yum install iptables-services # 对于CentOS/RHEL系统(注意:这可能会安装一个不同的服务管理机制)

安装后,iptables-persistent会提示你是否要保存当前的iptables规则。你可以选择保存它们,以后每次更改规则时,iptables-persistent都会自动更新保存的文件。

2. 监控和日志记录

你可以使用iptables的日志记录功能来监控网络流量和规则匹配情况。通过添加带有LOG目标的规则,你可以将匹配到的数据包记录到系统日志中。

例如,要记录所有被拒绝的入站连接尝试,你可以添加以下规则:

sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4
sudo iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

上面的规则会限制每分钟最多记录5次被拒绝的入站连接尝试,并将它们记录到系统日志中,日志级别为4(警告),前缀为"iptables denied: "。然后,所有不符合前面定义的允许规则的入站数据包都会被拒绝,并返回ICMP消息“host prohibited”。

你可以使用journalctldmesg命令来查看这些日志记录。

sudo journalctl -u iptables.service # 如果iptables-persistent服务正在运行
dmesg | grep iptables # 直接查看内核日志(可能需要root权限)

请注意,频繁的日志记录可能会对系统性能产生影响,因此请谨慎使用。

八、结论

iptables是一个功能强大的防火墙工具,它允许你细粒度地控制网络流量。通过配置不同的规则、链和表,你可以实现复杂的网络策略和安全要求。然而,iptables的配置和管理也需要一定的学习和实践。希望本文能帮助你更好地理解iptables的基本概念和配置方法,并为你的网络安全提供有力的支持。

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

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

相关文章

Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

友思特应用 | 动态捕捉:高光谱相机用于移动产线上的食品检测

导读 高光谱成像技术能够为食品安全助力。以友思特BlackIndustry SWIR 1.7 Max 为代表的高光谱相机&#xff0c;完美解决了移动产线检测的应用难点。 高光谱技术&#xff1a;为食品安全保驾护航 食品安全一直是大众关心的热点话题&#xff0c;提供安全、高质量的食品需要对食…

Java——》try-with-resource

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

【极客兔兔-Web框架Gee详解】Day0 序言

文章目录 一、Web 开发1. 什么是Web 开发&#xff1f;2. 主要组成部分2.1 前端开发2.2 后端开发2.3 全栈开发2.4 数据库管理 3. Web开发过程3.1 规划和设计&#xff1a;3.2 开发和编码&#xff1a;3.3 测试和优化&#xff1a;3.4 部署和维护&#xff1a; 4. 总结 二、用标准库n…

点击文本将内容填入tinymce-vue 富文本编辑器的光标处

富文本编辑器组件 <template><div ref"tinymceBox" class"tinymce-box"><Editor id"myEditor" v-model"contentValue" :init"init" :disabled"disabled" blur"inputBlur" click"o…

3.2cpu

这个转换原理是基于&#xff0c;地址号*大小页内偏移量&#xff0c;通过页表使逻辑号和内存号之间建立起联系&#xff0c;从而实现地址的转换 按字节寻址&#xff0c;意思是说一个地址的大小是一个字节 页表记录的是逻辑块号与实际存储的主存块号之间的映射关系&#xff0c;是…

SQLI LABS | Less-35 GET-Bypass Add Slashes (we dont need them) Integer Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-35/ 话不多说…

小北的字节跳动青训营与LangChain实战课:深入探索输出解析器与Pydantic解析器重构(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

Leetcode 两数之和 Ⅱ - 输入有序数组

这段代码实现了在一个非递减排序的数组中找到两个数&#xff0c;使它们的和等于目标值的算法。算法使用了双指针技术&#xff0c;具体思想如下&#xff1a; 算法思想&#xff1a; 初始化指针&#xff1a;定义两个指针 left 和 right&#xff0c;分别指向数组的起始位置和末尾位…

UE5.4 PCG 复制关卡实例

关卡实例&#xff1a;最大层级的管理&#xff0c;方便关卡级别的复制、重载 1.创建关卡实例&#xff0c;右箭生成PCG设置。注意&#xff1a;当关卡实例发生变化&#xff0c;需要重新手动再创建一次PCG设置 2.直接拖放到PCG图&#xff0c;设置如下 说明&#xff1a;PCG设置文…

C++ | Leetcode C++题解之第551题学生出勤记录I

题目&#xff1a; 题解&#xff1a; class Solution { public:bool checkRecord(string s) {int absents 0, lates 0;for (auto &ch : s) {if (ch A) {absents;if (absents > 2) {return false;}}if (ch L) {lates;if (lates > 3) {return false;}} else {lates…

Python 获取PDF的各种页面信息(页数、页面尺寸、旋转角度、页面方向等)

目录 安装所需库 Python获取PDF页数 Python获取PDF页面尺寸 Python获取PDF页面旋转角度 Python获取PDF页面方向 Python获取PDF页面标签 Python获取PDF页面边框信息 了解PDF页面信息对于有效处理、编辑和管理PDF文件至关重要。PDF文件通常包含多个页面&#xff0c;每个页…

设计模式(主要的五种)

1.设计模式&#xff1a; 设计模式就是代码设计经验 2.设计模式的类型&#xff1a; 分为三大类&#xff1a;创建型模式&#xff0c;结构型模式&#xff0c;行为模式 创建型模式&#xff1a; 单例模式&#xff1a;某个类只能有一个实例&#xff0c;提供一个全局的访问点。 工…

【北京迅为】itop-3588开发板摄像头使用手册Android12 双摄方案

本章节对应资料在网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \07_Android 系统开发配套资料\08_Android12 摄像头使用配套资料”目录下下载。 2.1 Android12 前摄后摄 网盘中默认的 Android12 源码支持四个摄像头单独打开&#xff0c;本小节我们来修改源码…

Javascript如何实现继承?

#一、是什么 继承&#xff08;inheritance&#xff09;是面向对象软件技术当中的一个概念。 如果一个类别B“继承自”另一个类别A&#xff0c;就把这个B称为“A的子类”&#xff0c;而把A称为“B的父类别”也可以称“A是B的超类” 继承的优点 继承可以使得子类具有父类别的…

测度论原创(三)

Morden Prob 文章目录 Morden ProbWeek3多维扩展和随机向量定理3.1推论&#xff1a;random variable的变换定理3.2 连续函数的可测性定理3.3 可测函数的线性组合关于拓展实数集的延伸定理3.4 可测函数的极限依旧为可测性随机变量的概率律&#xff08;Law of X X X&#xff09;…

Sql面试题二:请查询出用户连续三天登录的所有数据记录

问题&#xff1a; 现有用户登录记录表&#xff0c;请查询出用户连续三天登录的所有数据记录 id dt 1 2024-04-25 1 2024-04-26 1 2024-04-27 1 2024-04-28 1 2024-04-30 1 2024-05-01 1 2024-05-02 1 2024-05-04 1 2024-05-05 2 2…

vite中env uat/dev文件项目配置

1&#xff1a;图示 在vscode中显示的是&#xff08;在文件中显示不是文件夹而在vscode中显示是文件夹-- .env 而这个.env也是有内容的&#xff09; 2&#xff1a;.env文件内容 # 标题 VITE_APP_TITLE管理系统# 项目本地运行端口号 VITE_PORT80# open 运行 npm run dev 时自动打…

ssm基于JAVA的网上订餐管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

向日葵远程桌面Visual Studio白屏

问题描述 今天没带笔记本&#xff0c;想着拿 Ipad 远程写会代码&#xff0c;打开VS发现白屏了&#xff0c;看了看向日葵里面的设置有GPU加速&#xff0c;发现是和VS的GPU加速冲突了 解决方案&#xff08;远程同样可用&#xff09; ALT T 弹出工具菜单O 打开选项菜单A会取消…