Elastic 之网络设备日志收集

这篇具有很好参考价值的文章主要介绍了Elastic 之网络设备日志收集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景介绍

如何收集网络设备日志?收集日志后如何对日志进行分析判断网络中是否存在隐患?笔者通过Elastic + rsyslog 实现。

系统环境

  • Debian 11
  • Elastic 8.5

架构说明

需要两台服务器,设备数量不多可以安装再一台服务器上。

  • 一台安装Elasticsearch + Kibana
  • 一台安装Logstansh + resyslog

使用Elastic自带JVM环境。
网络设备日志,linux,debian,运维,elasticsearch

Elasticsearch

什么是Elasticsearch 请参照官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/8.5/elasticsearch-intro.html

安装

笔者通过包安装手动安装
Debian

# 安装wget
sudo apt install wget -y
# 下载安装包和校验包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.1-amd64.deb &&
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.1-amd64.deb.sha512
# 校验包完整性
shasum -a 512 -c elasticsearch-8.5.1-amd64.deb.sha512 
# 安装包
sudo dpkg -i elasticsearch-8.5.1-amd64.deb

Centos

# 安装shasum检测包完整性,安装wget
sudo dnf install perl-Digest-SHA -y && sudo dnf install wget -y
# 下载安装包 和 完整性检测包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.0-x86_64.rpm &&
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.0-x86_64.rpm.sha512

# 验证包完整性 elasticsearch-8.5.0-x86_64.rpm: OK
shasum -a 512 -c elasticsearch-8.5.0-x86_64.rpm.sha512 

# 安装
sudo rpm --install elasticsearch-8.5.0-x86_64.rpm

安装完成后如下信息

----------- Security autoconfiguration information --------

Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.

# 系统自动生成的密码 M-=LwwxrCT0nmXz9i3Dg
The generated password for the elastic built-in superuser is : M-=LwwxrCT0nmXz9i3Dg

If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.

You can complete the following actions at any time:

Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.

Generate an enrollment token for Kibana instances with
 '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.

Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.

修改配置参数

字段说明:

  • cluster.name:集群名称,节点根据集群名称确定是否是同一个集群。默认名称为 my-application,但应将其更改为描述集群用途的适当名称。不要在不同的环境中重用相同的集群名称。否则,节点可能会加入错误的集群
  • node.name:节点名称,集群内唯一,默认为主机名。,但可以在配置文件中显式配置
  • network.host: 节点对外提供服务的地址以及集群内通信的ip地址,例如127.0.0.1和 [::1]
  • xpack.security.enabled: true 启动安全传输
  • cluster.initial_master_nodes 指定master节点
  • http.port:对外提供服务的端口号,默认 9200
  • transport.port:节点通信端口号,默认 9300

更换日志和存储路径,指定文件路径。

  • 存储数据的目录路径(用逗号分隔多个位置): path.data: /var/lib/elasticsearch
  • 日志文件路径: path.logs: /var/log/elasticsearch
# 创建文件目录
mkdir /opt/elastic

# 将目录授权给elasticsearch账户
sudo chown -R elasticsearch:elasticsearch /opt/elastic/

# 修改配置文件
sudo vim /etc/elasticsearch/elasticsearch.yml

# 配置集群名称
cluster.name: Elastic-cluster

# 配置节点名称
node.name: node-1

# 配置数据及日志目录,如果使用默认路径可以不用修改,修改后方便升级与迁移。
path.data: /opt/elastic/lib/elasticsearch
path.logs: /opt/elastic/log/elasticsearch

# 指定集群初始化节点主机, node-1 为 node.name 设置的名称
cluster.initial_master_nodes: ["node-1"]

网络设备日志,linux,debian,运维,elasticsearch
网络设备日志,linux,debian,运维,elasticsearch

启动服务

# 开机自启和启动服务
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

开启防火墙

Debian 默认不启动防火墙可以跳过

sudo ufw allow 9200/tcp
sudo ufw allow 9300/tcp
sudo ufw reload 

Centos

sudo firewall-cmd --add-port=9200/tcp --permanent
sudo firewall-cmd --add-port=9300/tcp --permanent
sudo firewall-cmd --reload

访问 https://IP:9200 可以看到如下信息
网络设备日志,linux,debian,运维,elasticsearch

查看日志

cat /opt/elastic/log/elasticsearch/Elastic-cluster.log

Kibana

什么是Kibana 请参照官方文档
https://www.elastic.co/guide/en/kibana/current/introduction.html

安装

debian

wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.1-amd64.deb &&
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.1-amd64.deb.sha512

shasum -a 512 -c kibana-8.5.1-amd64.deb.sha512
sudo dpkg -i kibana-8.5.1-amd64.deb

Centos

wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.0-x86_64.rpm &&
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.0-x86_64.rpm.sha512

shasum -a 512 -c kibana-8.5.0-x86_64.rpm.sha512
sudo rpm --install kibana-8.5.0-x86_64.rpm

修改配置参数

sudo vim /etc/kibana/kibana.yml

  • server.port: 5601 配置监听的端口
  • server.host: “127.0.0.1” 配置监听的IP
  • i18n.locale: “zh-CN” 汉化
    网络设备日志,linux,debian,运维,elasticsearch

启动服务

# 加载systemctl服务项
sudo /bin/systemctl daemon-reload
# 开机自启和启动服务
sudo systemctl enable kibana.service
sudo systemctl start kibana.service

开启防火墙

debain 默认不启动防火墙可以跳过

sudo ufw allow 5601/tcp
sudo ufw reload 

Centos

sudo firewall-cmd --add-port=5601/tcp --permanent
sudo firewall-cmd --reload

连接 elasticsearch

访问 http://192.168.12.128:5601/
网络设备日志,linux,debian,运维,elasticsearch

elassticsearch 上执行如下命令,将得到密钥写入web中点击 Configure Elastic

sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

网络设备日志,linux,debian,运维,elasticsearch

在 kibana 上执行如下命令获取验证码,将验证码填入web中点击 verify

sudo /usr/share/kibana/bin/kibana-verification-code

网络设备日志,linux,debian,运维,elasticsearch

登陆使用 elassticsearch 的账户和密码,账户是 elastic 密码是安装elassticsearch是自动生成的。

查看日志

cat /var/log/kibana/kibana.log

80端口访问

为什么kibana不能通过80端口启动,简短的回答:1024以下的端口只能由root用户打开。根据注释,您可以使用 CAP_NET_BIND_SERVICE,但应用于javabin的方法将使任何java程序都使用此设置运行,这样不安全,具体可以参照此篇 文章

笔者通过本地端口转发的方式实现
下载启动ufw

# 安装
sudo apt-get install ufw

# 允许通过ufw
sudo ufw allow ssh
sudo ufw allow 22/tcp
sudo ufw allow 5601/tcp

# 开机自启 和 启动 ufw
sudo ufw enable && sudo ufw start

配置允许端口转发

# 编辑配置文件
vim /etc/ufw/sysctl.conf
# 允许转发
net/ipv4/ip_forward=1

网络设备日志,linux,debian,运维,elasticsearch

本地端口转发配置

# 编辑配置文件
sudo vim /etc/ufw/before.rules

# 将80端口的请求转发至5601
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5601
COMMIT

重新加载ufw配置

sudo ufw reload

Rsyslog

什么是Rsyslog 请参照官方文档
https://www.rsyslog.com/

安装

一般情况下系统已经安装
debian

# 验证安装
sudo dpkg-query -l | grep rsys
# 安装命令
sudo apt install -y rsyslog

Centos

# 验证安装
rpm -qa | grep rsyslog
# 安装命令
yum install rsyslog

服务器管理

sudo systemctl enable rsyslog
sudo systemctl start rsyslog

修改配置参数

删除module 和 input 下的注释,imudp 为UDP,imtcp 为 TCP,华为的TCP传输为6514端口需要的可以自行修改本文采用UDP作为传输协议。

sudo vim /etc/rsyslog.conf   

# 更改 $FileCreateMode 0640 授权给其他用户可读
$FileCreateMode 0644

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

网络设备日志,linux,debian,运维,elasticsearch

新增如下字段,用于存储对应设备日志在/var/log/network/目录下,日志名称为设备发送源IP地址 + 当前日期,设备支持 local1-local7 可自行定义,下文中的 \ 为换行连接符。

        local3.none;\
        local4.none;\
        local5.none;\
        local6.none             -/var/log/messages

$template aruba,"/var/log/network/aruba/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local3.* ?aruba
$template cisco,"/var/log/network/cisco/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local4.* ?cisco
$template h3c,"/var/log/network/h3c/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local5.* ?h3c
$template huawei,"/var/log/network/huawei/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local6.* ?huawei

网络设备日志,linux,debian,运维,elasticsearch

单个厂商的设备会在一个目录下,命令方式为 日期+设备IP,方便后期清理。
网络设备日志,linux,debian,运维,elasticsearch

创建文件并授权所有用户权限

sudo mkdir  /var/log/network
sudo mkdir  /var/log/network/aruba
sudo mkdir  /var/log/network/cisco
sudo mkdir  /var/log/network/h3c
sudo mkdir  /var/log/network/huawei
sudo chmod 777 -R /var/log/network

重启服务

systemctl restart rsyslog.service

网络设备配置

将 syslog-ip 替换成服务器的IP地址。

Huawei

info-center loghost source interface
info-center loghost syslog-ip local-time facility local6

H3C

info-center loghost source interface
info-center loghost syslog-ip facility local5

Aruba

网络设备日志,linux,debian,运维,elasticsearch
网络设备日志,linux,debian,运维,elasticsearch
将所有日志级别中的 all 全都定义为 warning
网络设备日志,linux,debian,运维,elasticsearch

CISCO

(config)#logging on
(config)#logging syslog-ip 
(config)#logging facility local4
(config)#logging source-interface e0

logstash

什么是logstash 请参照官方文档
https://www.elastic.co/guide/en/logstash/current/introduction.html

安装

debian

wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-amd64.deb &&
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-amd64.deb.sha512

shasum -a 512 -c logstash-8.5.1-amd64.deb.sha512

sudo dpkg -i logstash-8.5.1-amd64.deb

centos

wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-x86_64.rpm &&
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-x86_64.rpm.sha512

shasum -a 512 -c logstash-8.5.1-x86_64.rpm.sha512

sudo rpm --install logstash-8.5.1-x86_64.rpm

创建日志发送账户

登陆 Kibana 创建管理角色
网络设备日志,linux,debian,运维,elasticsearch

创建logstash账户并授权刚刚创建的角色
网络设备日志,linux,debian,运维,elasticsearch
权限说明参考文档
网络设备日志,linux,debian,运维,elasticsearch

创建incedb文件

用于存储logstash读取日志状态。

sudo touch /var/log/network/huawei/incedb && sudo chmod 777 /var/log/network/huawei/incedb
sudo touch /var/log/network/h3c/incedb && sudo chmod 777 /var/log/network/h3c/incedb
sudo touch /var/log/network/aruba/incedb && sudo chmod 777 /var/log/network/aruba/incedb

获取 cacert

下载 elasticsearch 服务器上的证书文件,用于连接elasticsearch,目录地址如下。

/etc/elasticsearch/certs/http_ca.crt

将证书文件上传至 logstash 服务器,目录地址如下,不使用该路径请一同更改 output下的文件路径。

/etc/logstash/conf.d/

# 授权所有用户读取和执行权限
sudo chmod 755 /etc/logstash/conf.d/http_ca.crt

配置启动文件

默认会读取 /etc/logstash/conf.d/ 下的文本,需要配置多个输入,可以创建多个配置文件。

新增配置文件
读取resyslog 接收到的日志导入elasticsearch,笔者使用到的设备没有Cisco,Cisoc用户需要自行编写grok匹配。

sudo vim /etc/logstash/conf.d/read_file.conf

插入如下内容,记得修改output的账户信息

input {
  file {
    path => ["/var/log/network/huawei/*.log"]
    type => huawei_log
    start_position => "beginning"
    sincedb_path => "/var/log/network/huawei/incedb"
  }

  file {
    path => ["/var/log/network/h3c/*.log"]
    type => h3c_log
    start_position => "beginning"
    sincedb_path => "/var/log/network/h3c/incedb"
  }

  file {
    path => ["/var/log/network/aruba/*.log"]
    type => aruba_log
    start_position => "beginning"
    sincedb_path => "/var/log/network/aruba/incedb"
  }  
}

filter {
  if[type] == "huawei_log"{
      grok {
        match => {
          "message" => [
            "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})\+08:00\s+(?<name>\S+)\s+(?<level>\S+\:)%{GREEDYDATA:info}",
            "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+(?<name>\S+)\s+(?<level>\S+\:)\s+%{GREEDYDATA:info}"
          ]
        }
      }

  }else if [type] == "h3c_log"{
      grok {
      match => {"message" => "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+%{YEAR}\s+(?<name>\S+)\s+(?<level>\S+\:)%{GREEDYDATA:info}"}
      }
  }else if [type] == "aruba_log"{
      grok {
        match => {
          "message" => [
            "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME}) %{YEAR}\s+(?<name>\S+)\s+(?<level>.+\>)\s+%{GREEDYDATA:info}",
            "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+%{YEAR}\s+(?<level>.+\)\:)\s+(?<ap_run_time>\S+\])\s+%{GREEDYDATA:info}"
          ]
        }
      }
  }

  if ("10.0.20.177" in [message]) or ("10.10.4.177" in [message]) { drop { }  }

  date {
  match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
  }

  mutate {
  remove_field => ["message"]
  }
}

output {
    elasticsearch {
      index => "networks-office01-%{+YYYY.MM.dd}"
      hosts => ["https://127.0.0.1:9200"]
      user => "logstash_internal"
      password => "xxx"
      ssl => true
      cacert => "/etc/logstash/conf.d/http_ca.crt"
    }
}

配置文件说明

input

  file {
    # 读取指定目录下的文件, *.log 为所有log结尾的文件
    path => ["/var/log/network/huawei/*.log"]
    # 给设备日志添加一个type的字段值为huawei_log
    type => huawei_log
    # 默认logstash从末尾开始读,这条命令顶端开始读
    start_position => "beginning"
    # 存储logstash的数据文件,以免重复读取
    sincedb_path => "/var/log/network/huawei/incedb"
  }

filter

  # 如果类型是 huawei_log 执行这个grok匹配方法
  if[type] == "huawei_log"{
      grok {
        match => {
          # 定义了两个正则匹配,会逐条匹配,华为交换机跟防火墙的日志格式不同
          "message" => [
            "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})\+08:00\s+(?<name>\S+)\s+(?<level>\S+\:)%{GREEDYDATA:info}",
            "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+(?<name>\S+)\s+(?<level>\S+\:)\s+%{GREEDYDATA:info}"
          ]
        }
      }
  # 10.0.20.177 和 10.10.4.177 是监控平台执行的查询命令,日志了比较大且监控平台已经存储,如果日志中包含这些信息,丢弃日志。
  if ("10.0.20.177" in [message]) or ("10.10.4.177" in [message]) { drop { }  }
  # 更改日期格式
  date {
  match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
  }
  # 移除 message 字段,event.original 字段有同样的信息
  mutate {
  remove_field => ["message"]
  }
}

正则匹配到的数据
网络设备日志,linux,debian,运维,elasticsearch

output

  # 如果 type 是 huawei_log 执行如下字段
  if[type] == "huawei_log"{
    elasticsearch {
      # 设置日志索引
      index => "networks-office01-%{+YYYY.MM.dd}"
      # elasticsearch 地址
      hosts => ["https://127.0.0.1:9200"]
      # 用户名
      user => "logstash_internal"
      # 密码
      password => "xxx"
      # 使用ssl加密
      ssl => true
      # 指定证书文件,在elasticsearch上获取
      cacert => "/etc/logstash/conf.d/http_ca.crt"
    }

发送给 elasticsearch 的日志如下:
网络设备日志,linux,debian,运维,elasticsearch

服务管理

sudo systemctl enable logstash.service
sudo systemctl start logstash.service

查看日志

cat /var/log/logstash/logstash-plain.log

Kibana日志配置

设置索引

进入 Discover
网络设备日志,linux,debian,运维,elasticsearch

单击创建数据视图
网络设备日志,linux,debian,运维,elasticsearch

填写相关信息,*为匹配多个字符,保存数据
网络设备日志,linux,debian,运维,elasticsearch

选择刚刚创建的数据试图查看日志
网络设备日志,linux,debian,运维,elasticsearch

分析日志

日志已经通过grok分开,Elastic会统计相关字段,在keyword结尾的字段中显示统计信息可以发现一些隐患。
网络设备日志,linux,debian,运维,elasticsearch

如一段时间内单个接口频繁UP/DOWN可能出现问题,也可以联动告警。
网络设备日志,linux,debian,运维,elasticsearch文章来源地址https://www.toymoban.com/news/detail-623025.html

参考文档

  • https://www.elastic.co/guide/index.html
  • https://www.rsyslog.com/doc/v8-stable/

到了这里,关于Elastic 之网络设备日志收集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux 网络设备驱动之报文接收

    从网络上接收报文比发送它要难一些, 因为必须分配一个 sk_buff 并从一个原子性上下 文中递交给上层. 网络驱动可以实现 2 种报文接收的模式: 中断驱动和查询. 大部分驱 动采用中断驱动技术, 这是我们首先要涉及的. 有些高带宽适配卡的驱动也可能采用查询 技术; 我们在\\\"接收

    2024年02月02日
    浏览(54)
  • 正点原子嵌入式linux驱动开发——Linux 网络设备驱动

    网络驱动是linux里面驱动三巨头之一 ,linux下的网络功能非常强大,嵌入式linux中也常常用到网络功能。前面已经讲过了字符设备驱动和块设备驱动,本章就来学习一下linux里面的 网络设备驱动 。 本次笔记中讨论的都是有线网络! 提起网络,一般想到的硬件就是“网卡”。在

    2024年01月17日
    浏览(71)
  • linux usb设备网络共享 usb/ip

    USB设备的网络共享可以通过USB/IP来实现, USB/IP把USB I/O信息封装成TCP/IP格式在网络端传输 ,可以实现usb的全部功能,且跨平台,是个透明的设备共享机制。 -b 后为上面列出的busid ip地址和端口号换成自已的 可以看出串口usb设备已经在客户端显示出来了

    2024年01月23日
    浏览(50)
  • 【IoT】嵌入式Linux开发:网络设备开发(测试题)

    目录 网络开发 选择题 1、路由器工作在哪一层(B)

    2024年02月06日
    浏览(59)
  • 「Linux系列」Linux网络通讯/系统管理/系统设置/备份压缩/设备管理命令

    Linux网络通讯命令是Linux系统中用于管理和调试网络功能的一系列工具。这些命令可以帮助用户查看网络状态、测试网络连接、查询DNS记录以及进行其他网络相关操作。以下是一些常用的Linux网络通讯命令及其案例: ping命令 功能 :用于检查与目标主机之间的连接是否正常,通

    2024年04月10日
    浏览(49)
  • 深入理解Linux网络技术内幕(八)——设备注册和初始化

    经过前面所学,我们已经知道内核如何验证NIC,以及内核所做的初始化,使得NIC得以和其他设备驱动程序对话。下面我们将讨论初始化的其他步骤: 网络设备何时以及如何在内核注册 网络设备如何利用网络设备数据库注册,并指派一个 net_device 结构的实例。 net_device 结构如

    2024年02月08日
    浏览(51)
  • 网络设备中VRRP协议和Linux服务器中keepalived的两个区别

    VRRP全称是Virtual Router Redundancy Protocol,即虚拟路由冗余协议。它的主要目的是在一个网络中提供冗余的路由。当一个三层网络设备或服务器出现故障时,VRRP可以确保网络仍能正常工作。VRRP通过在这些设备之间使用IP组播或单播通信来实现冗余。它可以确保在网络中有多个物理

    2024年02月02日
    浏览(44)
  • 运用 Elastic Stack 收集 docker 容器日志

    Elastic Stack 在收集日志方面有很多的方面的应用。在今天的文章中,我将使用 docker 来安装 Elastic Stack。我将演示如何使用 docker 安装 Filebeat 并收集容器的日志。 在我之前的文章 “Beats:为 Filebeat 配置 inputs”,我展示了如何使用 Filebeat 来收集 container 里的日志数据。在那篇文

    2023年04月08日
    浏览(36)
  • 【Elastic (ELK) Stack 实战教程】06、Filebeat 日志收集实践(下)

    目录 一、Filebeat 收集 Nginx 日志实践 1.1 为什么收集 Nginx 日志 1.2 Nginx 日志收集架构图 1.3 Nginx 日志收集实践 1.3.1 安装 Nginx  1.3.2 配置 filebeat 1.3.3 kibana 展示 1.4 Nginx json 日志收集实践 1.4.1 收集问题 1.4.2 解决方案 1.4.3 配置 json 1.4.4 配置 Filebeat 1.4.5 Kibana 展示 1.5 Nginx 多个日志收

    2024年02月01日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包