WireGuard 组网教程:快速构建安全高效的私密网络并实现内网穿透

文章目录

  • 1 引言
    • 1.1 什么是WireGuard
    • 1.2 WireGuard可以用来做什么
    • 1.3 WireGuard原理
    • 1.4 WireGuard安装
  • 2 WireGuard组网实现内网穿透
    • 2.1 前提条件
    • 2.2 网络拓扑结构
    • 2.3 具体步骤
      • 2.3.1 中继服务器配置
      • 2.3.2 其他peer
      • 2.3.3 测试
    • 2.4 WireGuard配置文件说明
  • 3 WireGuard工具
    • 3.1 wg-easy
    • 3.2 wg-gen-web
    • 3.3 dsnet

1 引言

1.1 什么是WireGuard

在这里插入图片描述

官方介绍如下:

WireGuard ® 是一款极其简单但快速且现代的 VPN,采用最先进的加密技术。它的目标是比 IPsec 更快、更简单、更精简、更有用,同时避免令人头疼的问题。它的性能远高于 OpenVPN。

WireGuard 被设计为通用 VPN,可在嵌入式接口和超级计算机上运行,适合许多不同的情况。它最初针对 Linux 内核发布,现在已跨平台(Windows、macOS、BSD、iOS、Android)且可广泛部署。它目前正在大力开发中,但它可能已被视为业内最安全、最易于使用且最简单的 VPN 解决方案。

我们可以用一句话概括它:

WGuard是一款可以组建虚拟私人局域网(VPN)的软件,允许用户通过公共网络(如互联网)安全地传输数据,同时保持数据的机密性和完整性。

WireGuard有如下优势

  • 更轻便:以Linux内核模块的形式运行,资源占用小。
  • 更高效:相比目前主流的IPSec、OpenVPN等协议,WireGuard的效率要更高。
  • 更快速:比目前主流的VPN协议,连接速度要更快。
  • 更安全:使用了更先进的加密技术。
  • 更易搭建:部署难度相对更低。
  • 更隐蔽:以UDP协议进行数据传输,比TCP协议更低调。
  • 不易被封锁:TCP阻断对WireGuard无效,IP被墙的情况下仍然可用。
  • 更省电:不使用时不进行数据传输,移动端更省电。

1.2 WireGuard可以用来做什么

  1. 建立VPN(不限设备类型)

    WireGuard支持多种平台,包括电脑、智能手机和路由器。这一特性使其成为构建虚拟私有网络(VPN)的理想选择,能在这些设备上实现安全连接。无论是用于远程工作、保护数据隐私,还是绕过地理限制,WireGuard都能提供稳定且安全的网络连接。

  2. 实现内网穿透

    内网穿透,即NAT(Network Address Translator)穿透,是指计算机在内网(局域网)内使用私有IP地址,在连接外网(互联网)时使用全局IP地址的技术。该技术被普遍使用在有多台主机但只通过一个公有IP地址访问的私有网络中。

    举个例子:比如我在实验室配置了一个服务器 Server A,当我在实验室的时候,就可以通过自己的笔记本使用SSH连接【因为我和服务器处于一个局域网】,当我回宿舍以后,就没有办法直接使用SSH连接了【因为我和服务器不在一个局域网】,这个时候就需要进行NAT穿透,让我在宿舍也可以使用SSH连接Server A。

    通过Wireguard可以将广域网上的主机连接起来,形成一个局域网。只需要有一台具有固定公网IP的服务器,就可以将其作为我们搭建的局域网的中心节点,让其他的主机(不论是否有公网IP,不论是否在NAT内),都通过这个中心节点和彼此相连。由此就构建了一个中心辐射型的局域网,实现了内网穿透等功能。

  3. Docker容器通信

    WireGuard还可用于Docker容器之间的通信。在Docker环境中,容器之间的网络通信是一个重要的问题。WireGuard通过提供一种安全的通信方式,能够在不同容器之间建立一个加密的网络连接,从而保障数据的安全传输。这对于需要在不同容器间安全共享数据的应用尤为重要。

1.3 WireGuard原理

WireGuard源码地址

WireGuard 是一种在第 3 层(网络层)运行的安全网络隧道,与传统的 VPN 解决方案(如 IPsec 和 OpenVPN)相比,它的设计更安全、性能更高且更易于使用。它是作为 Linux 内核虚拟网络接口实现的,基于安全隧道的基本原理:将peer的公钥与隧道源 IP 地址关联。

相关术语:

  • Peer/Node/Device

    连接到VPN 并为自己注册一个VPN子网地址(如 192.0.2.3)的主机。还可以通过使用逗号分隔的 CIDR 指定子网范围,为其自身地址以外的 IP 地址选择路由。

  • 中继服务器(Bounce Server)

    一个公网可达的peer,可以将流量中继到 NAT 后面的其他peer。Bounce Server 并不是特殊的节点,它和其他peer一样,唯一的区别是它有公网 IP,并且开启了内核级别的 IP 转发,可以将 威屁恩 的流量转发到其他客户端。

  • 子网(Subnet)

    一组私有 IP,例如 192.0.2.1-255192.168.1.1/24,一般在 NAT 后面,例如办公室局域网或家庭网络。

  • CIDR 表示法

    CIDR,即无类域间路由(Classless Inter-Domain Routing),是一种用于对IP地址进行灵活表示和分配的标准。

  • NAT

    子网的私有 IP 地址由路由器提供,通过公网无法直接访问私有子网设备,需要通过 NAT 做网络地址转换。路由器会跟踪发出的连接,并将响应转发到正确的内部 IP。

  • 公开端点(Public Endpoint)

    节点的公网 IP 地址:端口,例如 123.124.125.126:1234,或者直接使用域名 some.domain.tld:1234。如果peer节点不在同一子网中,那么节点的公开端点必须使用公网 IP 地址。

  • 私钥(Private key)

    单个节点的 WireGuard 私钥,生成方法是:wg genkey > example.key

  • 公钥(Public key)

    单个节点的 WireGuard 公钥,生成方式为:wg pubkey < example.key > example.key.pub

  • DNS

    域名服务器,用于将域名解析为 VPN 客户端的 IP,不让 DNS请求泄漏到 VPN 之外。

主要功能和原理如下

WireGuard 通过添加一个(或多个)网络接口来工作,例如 eth0wlan0 ,称为 wg0 (或 wg1wg2wg3 等)。然后可以使用 ifconfig(8)ip-address(8) 正常配置该网络接口,并使用 route(8)ip-route(8) 添加和删除其路由,以及所有普通网络实用程序都是如此。接口的特定 WireGuard 方面使用 wg(8) 工具进行配置。该接口充当隧道接口。

WireGuard 将隧道 IP 地址与公钥和远程端点相关联。当接口向peer发送数据包时,它会执行以下操作:

  1. 该数据包适用于 192.168.30.8。那是哪位peer啊?让我看看…好吧,这是给peer ABCDEFGH 的。 (或者,如果它不适合任何已配置的peer,则丢弃该数据包。)
  2. 使用peer ABCDEFGH 的公钥加密整个 IP 数据包。
  3. Peer ABCDEFGH 的远程端点是什么?让我看看…好的,端点是主机 216.58.211.110 上的 UDP 端口 53133。
  4. 使用 UDP 通过 Internet 将步骤 2 中的加密字节发送到 216.58.211.110:53133。

当接口收到数据包时,会发生以下情况:

  1. 我刚刚从主机 98.139.183.24 上的 UDP 端口 7361 收到一个数据包。让我们来解密吧!
  2. 它为peer LMNOPQRS 正确解密和验证。好的,让我们记住,peer LMNOPQRS 的最新 Internet 端点是使用 UDP 的 98.139.183.24:7361。
  3. 解密后,明文数据包来自 192.168.43.89。是否允许peer LMNOPQRS 以 192.168.43.89 向我们发送数据包?
  4. 如果是,则在接口上接受数据包。如果没有,就放弃它。

WireGuard 的核心是一个称为加密密钥路由的概念,它的工作原理是将公钥与隧道内允许的隧道 IP 地址列表相关联。每个网络接口都有一个私钥和一个peer点列表。每个peer都有一个公钥。公钥短小且简单,由peer用来相互验证。它们可以通过任何带外方法传递以在配置文件中使用,类似于将 SSH 公钥发送给朋友以访问 shell 服务器的方式。

1.4 WireGuard安装

wireGuard官方安装教程

2 WireGuard组网实现内网穿透

2.1 前提条件

  1. 公网服务器: 必须拥有一台具有公网IP地址的服务器,这是内网穿透的关键。该服务器充当中转站,负责将外部请求传递到内部网络。
  2. 网络设备配置权限: 需要对内部网络的路由器或防火墙有一定的配置权限,以便进行端口映射或其他必要的网络设置。这确保了从公网服务器到内网的连接是有效的。
  3. 安装WireGuard: 在公网服务器和内网设备上都需要安装和配置WireGuard软件。确保两端的WireGuard配置一致,包括公私钥的生成和网络接口的配置。
  4. 开启相应端口: 在公网服务器的防火墙配置中,需要打开WireGuard所使用的端口(默认是51820/UDP),以确保能够接收来自内网设备的连接请求。
  5. 合适的网络拓扑: 确保了解内部网络的拓扑结构,以便正确设置WireGuard配置,包括允许流量通过的子网、路由等。

2.2 网络拓扑结构

在这里插入图片描述

2.3 具体步骤

2.3.1 中继服务器配置

  1. 创建密钥对

    wg genkey | tee server_privatekey | wg pubkey > server_publickey

    执行以上两条命令后,会在执行命令的当前文件夹自动生成2个文件:

    在这里插入图片描述

  • 开启IP地址转发

    sudo sysctl net.ipv4.ip_forward

    如果显示1则说明已开启,否则则未开启。

    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
    sysctl -p /etc/sysctl.conf
    
  • 设置IP地址伪装

    # 允许防火墙伪装IP
    firewall-cmd --add-masquerade
    # 检查是否允许伪装IP
    firewall-cmd --query-masquerade
    # 禁止防火墙伪装IP
    firewall-cmd --remove-masquerade
    
  • 配置wireguard虚拟网卡(不推荐,只是让读者直观了解过程)

    sudo ip link add wg0 type wireguard # 添加一块叫 wg0 的虚拟 wireguard 网卡
    sudo ip addr add 192.168.71.1/24 dev wg0 # 给 wg0 网卡添加 ip 地址 192.168.71.1,子网掩码 255.255.255.0
    sudo wg set wg0 private-key ./server-privatekey # wireguard 设置密钥
    sudo ip link set wg0 up # 启用刚刚添加的网卡
    

    我们可以通过ip addr命令查看到wg0网卡的状态

    在这里插入图片描述

    可以看到网卡wg0 接口是已启用的,具有 IPv4 地址 192.168.71.1

    输入wg命令则可以看到配置信息,配置文件通常在/etc/wireguard/目录中

    在这里插入图片描述

    有想继续尝试这种方式的可以看一下官方教程

  • 编写配置文件配置网卡(推荐,应该wg set命令需要提供很多参数,很容易出错)

    我们在/etc/wireguard目录中创建wg0.conf并编写配置,配置项请看2.4 配置项说明

    [Interface]
    # 本机密钥
    PrivateKey = KIDTljv66CgVYBNlrSD13Au6qfUdIcFJkTBkuErhTEk=
    # 本机地址
    Address = 192.168.71.1/24
    # 监听端口
    ListenPort = 51820
    
    [Peer]
    # 对端的publickey
    PublicKey = iWy57DmR6wVXcVzMDOa2WyywO0WT5JRAGYIlh0v/nW8=
    # 对端地址
    AllowedIPs = 192.168.71.2/24
    
  • 重新启动网卡

    sudo wg-quick down wg0
    sudo wg-quick up wg0
    

2.3.2 其他peer

我这里只列举MacOS的操作方式(其他都同理,就是要配置私钥和公钥)

在这里插入图片描述

操作完之后,它会给出密钥对,我们只需要添加好其他信息即可。

在这里插入图片描述

配置文件如下:

[Interface]
# 本机密钥
PrivateKey = kDUqWzkbaB1EU5C2ADoId1TXtZF89xxn0VV45EcjFHs=
# 本机地址
Address = 192.168.71.2/24

[Peer]
# 对端公钥,即公网服务器公钥
PublicKey = bEm1p736FQySfKlTTUCeHmiwTmna5umZWOWLGWqioSk=
# 允许此对等方的传入流量并指定传出流量的目标。
AllowedIPs = 192.168.71.0/24
# 公网IP+监听端口号
Endpoint = 1.1.1.1:51820
PersistentKeepalive = 25

2.3.3 测试

在这里插入图片描述

2.4 WireGuard配置文件说明

  • interface部分
    • PrivateKey: 由 wg genkey 生成的 Base64 编码的私钥。必须配置。
    • ListenPort: 用于监听的 16 位端口。可选,如果未指定,则随机选择端口。
    • DNS: 指定 DNS 服务器的 IP 地址。
    • FwMark: 用于传出数据包的 32 位 fwmark。如果设置为 0 或 “off”,则禁用此选项。可选。可以以十六进制形式指定,例如,以 “0x” 开头。可选。
  • Peer 部分:
    • PublicKey: 由 wg pubkey 根据私钥计算的 Base64 编码的公钥。必须配置。
    • PresharedKey: 由 wg genpsk 生成的 Base64 编码的预共享密钥。可选,可以省略。此选项为现有的公钥加密提供了额外的对称密钥加密层,以增强对抗后量子计算的能力。
    • AllowedIPs: 逗号分隔的 IP 地址(IPv4 或 IPv6)列表,带有 CIDR 掩码,用于允许此对等方的传入流量并指定传出流量的目标。可以多次指定。可用 0.0.0.0/0 匹配所有 IPv4 地址,使用 ::/0 匹配所有 IPv6 地址。
    • Endpoint: 一个 IP 地址或主机名,后跟冒号,然后是一个端口号。此端点将自动更新为来自对等方的正确经过身份验证的数据包的最新源 IP 地址和端口。可选。
    • PersistentKeepalive: 保持活跃的时间间隔,介于 1 和 65535 之间,表示多久发送一次对等方的身份验证空数据包,以保持有状态的防火墙或 NAT 映射的有效性。如果设置为 0 或 “off”,则禁用此选项。可选,默认情况下此选项被禁用。

下面是一个简单的配置文件示例:

[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820

[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
Endpoint = 192.95.5.67:1234
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24

[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
Endpoint = [2607:5300:60:6b0::c05f:543]:2468
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16

[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
Endpoint = test.wireguard.com:18981
AllowedIPs = 10.10.10.230/32

3 WireGuard工具

3.1 wg-easy

github地址

这是一个用于管理 WireGuard 设置的 Web 用户界面。使用它之前我们得先安装docker和docker-compose。这里我给出docker-compose.yml配置文件示例。还有很多配置项可在仓库中找到,灵活配置VPN

version: '3'
services:
  wg-easy:
    image: weejewel/wg-easy
    container_name: wg-easy
    environment:
      - WG_HOST=YOUR_SERVER_IP # 公网IP
      - PASSWORD=YOUR_ADMIN_PASSWORD # Web UI登录密码
      - WG_PORT=51820 # 监听端口
      - WG_PERSISTENT_KEEPALIVE=25 # 保持“连接”打开的值(以秒为单位)
      - WG_DEFAULT_ADDRESS=192.168.71.0 # 客户端 IP 地址范围
      - WG_ALLOWED_IPS=192.168.71.0/24 # 客户端将使用的允许 IP
    volumes:
      - ~/.wg-easy:/etc/wireguard
    ports:
      - 51820:51820/udp
      - 51821:51821/tcp
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    restart: unless-stopped

通过docker compose up -d部署好后,我们进入Web界面即可添加Client。在这里插入图片描述

这里,我们只需要将这三个配置文件分给对应的Client的即可完成网络搭建,特别方便!

3.2 wg-gen-web

wg-gen-web

跟wg-easy类似,不过功能更强大。

在这里插入图片描述

3.3 dsnet

github地址

一款用于管理集中式wireguard VPN 的FAST 命令。

dsnet add

官网配置教程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Numpy数组进阶_Python数据分析与可视化

Numpy数组进阶 Numpy的广播机制高级索引整数数组索引布尔索引花式索引 数组迭代 Numpy的广播机制 广播 (Broadcast) 是 numpy 对不同形状 (shape) 的数组&#xff0c;进行数值计算的方式。 对数组的算术运算通常在相应的元素上进行&#xff0c;当运算中的 2 个数组的形状不同时…

轻松实现文件改名:让新文件名与目录名称一致

在日常工作中&#xff0c;我们经常需要处理文件改名的问题。有时候&#xff0c;我们需要将新文件名设置为与目录名称相同&#xff0c;以方便管理和查找。然而&#xff0c;这个过程可能很繁琐&#xff0c;尤其是当你有大量的文件需要改名时。幸运的是&#xff0c;现在有一种简单…

Windows2019部署IIS后,浏览文件变成下载的问题解决过程

1、反复重起服务器、重建应用程序、建应用程序并改名才好使&#xff01; 2、总体上&#xff0c;角色为&#xff1a; 一、在Windows2019服务器上&#xff0c;填加角色&#xff0c;一路下一步&#xff0c;到填加服务器角色时&#xff0c;勾选了【Web服务器(IIS)】 二、然后在【…

阿里云2核2G3M服务器e实例、40G ESSD Entry系统盘性能测评

阿里云99元服务器新老用户同享2核2G经济型e实例、3M固定带宽和40G ESSD Entry系统盘&#xff0c;老用户也可以买&#xff0c;续费不涨价依旧是99元一年&#xff0c;阿里云百科aliyunbaike.com分享阿里云3M带宽服务器40G ESSD Entry云盘性能说明&#xff1a; 阿里云99元服务器配…

el-table操作栏添加el-dropdown获取当前行的数据

0 效果 点击子合同获取到当前行的id 1 代码 beforeHandleCommand(row, childCommand) {return { row: row, childCommand: childCommand }; }, addChildBtn(command) {const row command.row;if (command.childCommand 0) {// todo} else {// todo} },

el-select下拉框只回显value不回显label的原因以及解决方法

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; el-select的采用的是map的key value结构&#xff0c;因此只显示value而不显示label的原因是&#xff0c;value的类型不正确&…

【Effect C++ 笔记】(四)设计与声明

【四】设计与声明 条款18 &#xff1a; 让接口容易被正确使用&#xff0c;不易被误用 Item 18: 让接口容易被正确使用&#xff0c;不易被误用 Make interfaces easy to use correctly and hard to use incorrectly. “让接口容易被正确使用&#xff0c;不易被误用”&#xff0…

Abaqus2023新功能:分析技术

隐式耦合的松弛和加速器方法 产品&#xff1a;Abaqus/Standard SIMULIA协同仿真引擎现在支持Aitkens松弛方法以及Anderson和Broyden加速器方法&#xff0c;为强耦合物理场提供稳健且省时高效的解决方案。此功能在 2022 FD04 &#xff08;FP.2232&#xff09;版本中首次提供。…

vue的常用指令

1.使用双花括号( {{}} )对变量输出,内部可以写简单的表达式用于对数据的处理 2..v-text&#xff1a;相当于js的innerText, 3.v-html&#xff1a;相当于js的innerHTML 4.v-bind&#xff1a;动态绑定属性,简写是冒号( : ) 5.绑定class&#xff1a;操作元素的 class 列表和内联样式…

Moka人事:实现无代码开发的API连接,打通电商平台与用户运营系统

无代码开发的API连接&#xff1a;Moka人事的核心优势 Moka人事&#xff0c;是北京希瑞亚斯科技有限公司于2015年推出的一款数据驱动的智能化HR SaaS产品。这款产品的主要优势在于其无需进行API开发即可实现系统的连接和集成&#xff0c;这不仅大大提升了企业的工作效率&#x…

2023数维杯国际赛数学建模D题思路模型分析

D题思路模型分析&#xff1a;详细思路获取见文末名片 问题D&#xff1a;洗衣清洗的数学问题 洗衣清洗是人们每天都在做的事情。洗衣粉的去污功能来自于一些表面活性剂的化学物质。它们可以提高水的渗透性&#xff0c;并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分…

【汇编】Debug的使用

文章目录 前言一、Debug是什么&#xff1f;二、为什么Debug如此重要&#xff1f;三、Debug的使用3.1 Debug的运行3.1 R命令查看寄存器的状态改变寄存器的值 3.2 用D命令查看内存中的内容列出预设地址内存内容列出指定地方的内容列出指定地方的指定大小的内容 3.3 使用e命令修改…

learning to rank 学习排名系统综述

Learning to Rank 的实践 文档列表方法 Listwise 算法相对于 Pointwise 和 Pairwise 方法来说&#xff0c;它不再将排序问题转化为一个分类问题或者回归问题&#xff0c;而是直接针对评价指标对文档的排序结果进行优化&#xff0c;如常用的 MAP、NDCG 等。应用 Listwise 的模型…

js构造函数之工厂模式(学习笔记1)

目录 一、简单工厂 1、存储一个用户信息 2、存储N个用户信息 3、存储N个用户信息不同年龄用户有不同美食的搭配方案【简单工厂模式】 二、抽象工厂模式 1、抽象工厂(AbstractFactory) 2、具体工厂&#xff08;ConcreteFactory&#xff09; 3、生产新款手机 4、总结 本…

V10服务器安装virt-manage

kvm是什么 KVM(Kernel-based Virtual Machine, 即内核级虚拟机) 是一个开源的系统虚拟化模块。它使用Linux自身的调度器进行管理&#xff0c;所以相对于Xen&#xff0c;其核心源码很少。目前KVM已成为学术界的主流VMM之一&#xff0c;它包含一个为处理器提供底层虚拟化 可加载…

服务器数据恢复—服务器raid5离线磁盘上线同步失败的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某品牌DL380服务器中有一组由三块SAS硬盘组建的RAID5阵列。数据库存放在D分区&#xff0c;数据库备份存放在E分区。 服务器上有一块硬盘的状态灯显示红色&#xff0c;D分区无法识别&#xff0c;E分区可识别&#xff0c;但是拷贝文件报…

MyBatis 操作数据库(⼊⻔)

前言 通过本篇博客&#xff0c;我们将学到以下内容 1.使⽤MyBatis完成简单的增删改查操作,参数传递 2.掌握MyBatis的两种写法: 注解和 XML⽅式 3.掌握 MyBatis 相关的⽇志配置 什么是 MyBatis? MyBatis是⼀款优秀的 持久层 框架&#xff0c;⽤于简化JDBC&#xff08;关于 JD…

推荐5款堪称神器的免费软件

​ 今天再次推荐5个良心好用的Windows神级软件&#xff0c;每一个都是完全免费&#xff0c;堪称神器&#xff0c;让你打开新世界的大门。 1.文件复制——SuperCopy ​ SuperCopy 是一款 Chrome 浏览器的扩展&#xff0c;可以帮助您解除网站上禁止复制、右键、全选、粘贴等限制…

Linux Docker图形化工具Portainer如何进行远程访问?

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

easyExcle单元格合并

自定义单元格合并策略&#xff1a; /*** 自定义单元格合并策略** create: 2023-11-15 13:41**/ Data NoArgsConstructor AllArgsConstructor Slf4j public class EasyExcelCustomMergeStrategy implements RowWriteHandler {/*** 总数*/private Integer totalNum;//合并行计数…