Wireshark源码编译安装指南:从环境搭建到性能调优

1. 项目概述:为什么选择源码安装Wireshark?

如果你经常和网络数据包打交道,Wireshark这个名字对你来说一定不陌生。作为网络分析领域的“瑞士军刀”,它几乎是每一位网络工程师、安全研究员、开发者和运维人员的必备工具。我们通常通过包管理器(如 apt yum )或者官网下载预编译的二进制包来安装Wireshark,这种方式简单快捷,适合绝大多数用户。但今天,我们要聊点不一样的:从源码开始,亲手编译安装Wireshark。

你可能会问,有现成的包不用,为什么要折腾源码?这就像买车,直接买成品车(二进制包)省心省力,但如果你是个汽车发烧友,或者需要一辆能适应特殊路况(比如特定Linux发行版、老旧系统、嵌入式环境)的改装车,那么从零件开始组装(源码编译)就是唯一的选择。源码安装能给你带来几个核心优势:首先,你可以获得最新、甚至尚未正式发布的开发版特性,走在技术最前沿;其次,你可以根据你的硬件和系统环境,进行深度优化,比如启用特定的CPU指令集来提升性能;再者,你可以完全掌控编译选项,只启用你需要的协议解析器,精简安装体积,或者集成一些特殊的依赖库;最后,当遇到一些冷门平台的兼容性问题时,源码编译往往是唯一的解决方案。

因此,这篇内容就是为你——那些不满足于“开箱即用”,希望深入工具内部、定制专属分析环境,或者解决特定平台部署难题的实践者准备的。我们将从零开始,一步步拆解Wireshark源码编译的全过程,并深入探讨那些关键的配置选项背后的意义,让你不仅会操作,更明白每一步操作的意图和影响。

2. 源码安装前的核心准备与环境搭建

动手编译之前,充分的准备工作是成功的一半。源码编译不像安装二进制包那样一键完成,它更像是一场精密的“外科手术”,需要合适的手术台(构建环境)、锋利的工具(编译工具链)和所有必需的器官(依赖库)。这一步没做好,后续的编译过程会错误百出,让人抓狂。

2.1 系统环境与基础工具检查

无论你使用的是Ubuntu/Debian、CentOS/RHEL还是其他Linux发行版,第一步都是确保你的系统是最新的,并且安装了最基础的开发工具。打开你的终端,让我们开始准备工作。

对于基于Debian的系统(如Ubuntu),你需要安装构建必备工具包和Git:

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential cmake git

这里的 build-essential 包含了GCC编译器、make等核心工具; cmake 是Wireshark使用的构建系统生成器; git 则用于从代码仓库拉取源码。

对于基于RPM的系统(如CentOS、Fedora),命令略有不同:

sudo yum groupinstall -y "Development Tools"
sudo yum install -y cmake3 git
# 或者使用dnf(新版本Fedora/CentOS)
# sudo dnf groupinstall -y "Development Tools"
# sudo dnf install -y cmake git

注意 :在一些较老的CentOS 7系统上,默认的 cmake 版本可能过低(要求≥3.5),你需要通过EPEL仓库安装 cmake3 ,并在后续命令中用 cmake3 替代 cmake 。这是编译大型C/C++项目时常见的版本兼容性问题。

2.2 依赖库的“全家桶”安装

Wireshark功能强大,支持上千种协议解析,这背后依赖于大量的第三方库。这些库主要分为几类:图形界面支持(如Qt、GTK)、压缩库(如zlib、libpcap)、加密库(如GnuTLS、libgcrypt)、XML解析库(如libxml2)等。缺少任何一个关键依赖,编译都会失败,或者导致某些功能缺失。

我们可以通过包管理器一次性安装大部分已知的依赖。这样做最省心,虽然可能会安装一些你用不到的库,但能最大程度保证编译成功。

Debian/Ubuntu系统依赖安装命令:

sudo apt install -y \
    flex bison \
    libpcap-dev \
    libgcrypt20-dev \
    libglib2.0-dev \
    libgnutls28-dev \
    libc-ares-dev \
    libsmi2-dev \
    liblua5.2-dev \
    libnl-3-dev libnl-genl-3-dev \
    libsbc-dev \
    libmaxminddb-dev \
    libnghttp2-dev \
    libssh-gcrypt-dev \
    libsystemd-dev \
    qtbase5-dev qttools5-dev qttools5-dev-tools \
    libqt5svg5-dev \
    libcap-dev \
    libkrb5-dev \
    liblz4-dev \
    libsnappy-dev \
    libzstd-dev \
    libxml2-dev \
    libspeexdsp-dev \
    libbrotli-dev \
    python3-ply

CentOS/RHEL/Fedora系统依赖安装命令:

sudo yum install -y \
    flex bison \
    libpcap-devel \
    libgcrypt-devel \
    glib2-devel \
    gnutls-devel \
    c-ares-devel \
    lua-devel \
    libnl3-devel \
    sbc-devel \
    maxminddb-devel \
    libnghttp2-devel \
    libssh-devel \
    systemd-devel \
    qt5-qtbase-devel qt5-qttools-devel \
    libcap-devel \
    krb5-devel \
    lz4-devel \
    snappy-devel \
    libzstd-devel \
    libxml2-devel \
    speexdsp-devel \
    brotli-devel
# 对于Qt5,你可能还需要
sudo yum install -y qt5-qtsvg-devel

这一长串命令看起来吓人,但每一条都对应着Wireshark的某个功能模块。例如, libpcap-dev 是抓包的基础; libgnutls28-dev 用于解密TLS/SSL流量; libsmi2-dev 用于管理MIB库,方便SNMP协议分析; libmaxminddb-dev 用于IP地理定位。如果你确定某些功能永远用不到(比如在无头服务器上不需要Qt图形界面),可以酌情省略 qtbase5-dev 等包,但这通常不建议初次编译者这么做。

2.3 获取Wireshark源码

依赖就绪后,我们需要获取源代码。官方推荐从Wireshark的Git仓库克隆,这样可以方便地切换版本、跟踪最新提交或打补丁。

# 创建一个专门的工作目录
mkdir -p ~/wireshark-build
cd ~/wireshark-build

# 克隆官方Git仓库(这需要一些时间,因为仓库历史较大)
git clone https://gitlab.com/wireshark/wireshark.git
cd wireshark

克隆完成后,你可以通过 git tag 查看所有发布版本,并使用 git checkout 切换到某个稳定版本进行编译,例如 git checkout wireshark-4.2.0 。直接编译主分支( master )可以获得最新特性,但也可能包含未稳定的代码,更适合测试环境。对于生产或学习环境,建议选择一个稳定的发布标签。

3. CMake配置选项的深度解析与定制

进入源码目录,真正的定制化工作开始了。Wireshark使用CMake作为构建系统,我们需要通过 cmake 命令生成适用于本机环境的Makefile。这个步骤的核心在于理解并设置那些 -D 开头的配置选项。它们就像汽车改装时的参数表,决定了最终产出的Wireshark具备哪些功能、性能如何以及如何安装。

3.1 基础编译路径与安装路径设置

首先,我们通常不在源码目录内直接编译,而是创建一个独立的构建目录,这能保持源码树的干净。

mkdir build
cd build

接下来是最关键的 cmake 配置命令。一个最基础但功能完整的配置示例如下:

cmake .. \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DCMAKE_BUILD_TYPE=Release
  • -DCMAKE_INSTALL_PREFIX=/usr/local :这指定了软件安装的根目录。编译后的可执行文件、库文件、手册页等都将安装到这个目录下。 /usr/local 是类Unix系统存放本地安装软件的标准位置。你也可以设置为 /opt/wireshark 来创建一个完全独立的目录。
  • -DCMAKE_BUILD_TYPE=Release :这指定了构建类型。 Release 意味着开启编译器优化(如 -O2 ),关闭调试信息,生成性能最优但体积较小的二进制文件。其他选项还有 Debug (包含完整调试信息,用于开发)、 RelWithDebInfo (带调试信息的发布版,平衡性能与可调试性)。

3.2 核心功能模块的启用与禁用

Wireshark的模块化程度很高,你可以精确控制要编译哪些组件。以下是一些最常用且重要的选项:

图形界面选择:

  • -DENABLE_QT=ON :启用基于Qt的现代图形界面(Wireshark默认推荐)。需要 qtbase5-dev 等Qt开发包。
  • -DENABLE_GTK3=OFF :禁用较老的GTK+ 3界面。除非你偏爱GTK或环境限制,否则建议使用Qt。
  • -DBUILD_wireshark=ON :是否编译图形界面程序本身。在服务器上可以设为 OFF

核心组件控制:

  • -DBUILD_tshark=ON :编译 tshark ,这是命令行版的Wireshark,在服务器和脚本中极其有用。
  • -DBUILD_capinfos=ON -DBUILD_editcap=ON 等:编译一系列命令行工具,分别用于统计包信息、编辑抓包文件等。通常全部保持 ON
  • -DBUILD_dumpcap=ON :编译 dumpcap ,这是实际负责抓包的工具,通常以root权限运行,为 wireshark / tshark 提供数据。 必须为 ON

插件与协议支持:

  • -DENABLE_PLUGINS=ON :启用插件支持。允许动态加载第三方解析器插件,建议开启。
  • -DENABLE_LUA=ON :启用Lua脚本支持。Lua是Wireshark强大的扩展和自动化工具,强烈建议开启。
  • -DENABLE_NETLINK=ON :启用Linux Netlink协议族支持,用于分析路由、防火墙等内核通信。
  • -DCMAKE_DISABLE_FIND_PACKAGE_<PackageName>=TRUE :如果你不想依赖某个库(即使系统已安装),可以用此选项强制禁用对其的查找和支持。例如, -DCMAKE_DISABLE_FIND_PACKAGE_SMI=TRUE 会禁用SMI/MIB支持。

3.3 性能与安全优化选项

  • -DENABLE_DEBUG=OFF :关闭调试输出。在 Release 构建中应设为 OFF 以提升性能。
  • -DUSE_STATIC=OFF :是否静态链接库。默认 OFF (动态链接),生成的文件小,依赖系统库。设为 ON 会静态编译,生成独立的二进制文件,体积巨大,但便于移植到不同环境。 一般不建议开启
  • -DENABLE_ASAN=OFF -DENABLE_UBSAN=OFF :关闭地址消毒器(AddressSanitizer)和未定义行为消毒器(UndefinedBehaviorSanitizer)。这些是用于在开发阶段检测内存错误的高级工具,会显著降低性能,正式编译时应关闭。

3.4 一个完整的定制化配置示例

假设我想编译一个功能全面、性能优化的Wireshark,安装到 /usr/local ,使用Qt界面,并启用Lua支持,但明确不需要旧的GTK界面,我的配置命令会是:

cmake .. \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DCMAKE_BUILD_TYPE=Release \
    -DENABLE_QT=ON \
    -DENABLE_GTK3=OFF \
    -DBUILD_wireshark=ON \
    -DBUILD_tshark=ON \
    -DENABLE_LUA=ON \
    -DENABLE_PLUGINS=ON \
    -DENABLE_DEBUG=OFF

执行这个命令后,CMake会检查所有依赖是否满足,并输出一个详细的摘要。 请务必仔细阅读输出结果! 它会列出哪些功能被启用( YES ),哪些被禁用( NO ),以及原因(如“Missing library”)。这是排查依赖问题的最直接窗口。

4. 编译、安装与权限配置实战

配置成功后,我们就进入了编译和安装阶段。这个过程耗时较长,尤其是编译阶段,取决于你的CPU核心数和性能。

4.1 并行编译以提升效率

build 目录下,直接运行 make 即可开始编译。为了充分利用多核CPU,强烈建议使用 -j 参数指定并行编译的作业数。通常设置为CPU逻辑核心数或稍多一点。

# 查看CPU逻辑核心数
nproc
# 假设输出是8,则使用
make -j8

编译过程会持续几分钟到几十分钟,你会看到大量滚动的编译信息。只要之前依赖安装齐全且配置正确,这里通常会很顺利。如果遇到编译错误,最常见的原因仍然是某个依赖库缺失或版本不匹配,需要根据错误信息回溯到 cmake 配置阶段进行检查。

4.2 安装与系统集成

编译成功后,使用 sudo make install 将软件安装到之前 CMAKE_INSTALL_PREFIX 指定的目录(如 /usr/local )。

sudo make install

安装过程会将可执行文件(如 wireshark tshark )、库文件、手册页等复制到系统目录。

4.3 解决抓包权限问题: dumpcap 与用户组

安装完成后,直接以普通用户身份运行 wireshark ,你可能会发现无法开始抓包,提示“无权限”。这是因为抓取网络数据包需要底层系统的超级用户权限。Wireshark的解决方案不是让整个程序以 root 运行(那样不安全),而是让核心抓包组件 dumpcap 具备特权。

在从源码安装时,我们需要手动完成这个权限设置:

  1. 找到 dumpcap 的安装路径 :通常在 /usr/local/bin/dumpcap
  2. 设置 setcap 权限 :这比传统的 setuid 更安全。
    sudo setcap cap_net_raw,cap_net_admin+eip /usr/local/bin/dumpcap
    
    这条命令赋予 dumpcap 捕获原始数据包( cap_net_raw )和管理网络接口( cap_net_admin )的能力,无需 root 密码。
  3. (可选)将用户加入 wireshark :一些发行版通过用户组来管理权限。你可以创建 wireshark 组并将用户加入。
    sudo groupadd wireshark
    sudo usermod -a -G wireshark $USER
    # 更改dumpcap所属组
    sudo chgrp wireshark /usr/local/bin/dumpcap
    sudo chmod 750 /usr/local/bin/dumpcap
    
    设置完成后, 需要注销并重新登录 ,新的组权限才会生效。

实操心得 setcap 和用户组两种方式任选其一即可, setcap 方式更为通用和直接。完成此步骤后,普通用户应该就能正常启动Wireshark并抓包了。如果还不行,尝试重启一下系统,或者检查是否有其他安全模块(如SELinux、AppArmor)阻止了操作。

5. 验证安装与基础功能测试

安装和权限配置完成后,必须进行验证,确保编译的Wireshark不仅能用,而且各项核心功能正常。

5.1 基础版本与功能验证

首先,检查主程序和命令行工具的版本,确认是我们编译的版本。

wireshark --version
tshark --version

输出信息应包含版本号、编译时启用的特性(如 with Qt with Lua )以及依赖库的版本。这能直观确认之前的配置选项是否生效。

5.2 核心抓包与解码测试

功能测试分两步:图形界面和命令行。

  1. 图形界面测试 :在终端输入 wireshark (或从应用菜单启动)。界面应正常弹出。尝试选择一个非回环网卡(如 eth0 wlan0 )开始抓包,看是否能正常捕获到数据流。检查“捕获选项”中,是否能看到所有网络接口。
  2. 命令行抓包测试 :这是更严格的测试,尤其对于服务器环境。
    # 捕获2个ICMP包(ping包)到文件test.pcapng
    sudo tshark -i any -c 2 -f "icmp" -w test.pcapng
    # 读取并显示捕获文件的内容
    tshark -r test.pcapng -V
    
    • -i any :在所有接口上抓包。
    • -c 2 :捕获2个包后停止。
    • -f "icmp" :设置捕获过滤器,只抓ICMP包(可以先在另一个终端执行 ping 8.8.8.8 )。
    • -w test.pcapng :写入文件。
    • -r test.pcapng -V :读取文件并输出详细协议树。 如果命令能成功执行并输出详细的包解析信息,说明 tshark dumpcap 的协作、协议解析功能都是正常的。

5.3 高级特性验证

根据你编译时启用的选项,进行针对性测试:

  • Lua脚本测试 :在Wireshark中,点击“帮助” -> “关于Wireshark” -> “插件”,查看Lua引擎是否已加载。可以尝试一个简单的Lua脚本,比如在 init.lua 中取消一行注释,测试脚本功能。
  • 特定协议解析 :尝试打开一个包含你关心的特殊协议(如S7Comm、MQTT、QUIC)的抓包文件,查看协议解析树是否完整,字段解析是否正确。这可以验证相关依赖库(如 libsmi for SNMP)是否正常工作。

6. 编译安装过程中的常见问题与排查实录

即使准备再充分,源码编译的路上也难免会遇到“坑”。下面是我在多次编译中遇到的典型问题及其解决方案,希望能帮你快速排雷。

6.1 依赖库缺失或版本不匹配

这是最常见的一类错误,发生在 cmake 配置阶段。

  • 症状 :CMake输出中大量显示 NO ,并提示“Could NOT find ”或“Package requires version ‘x.x.x‘ but found ‘y.y.y‘”。
  • 排查 :仔细阅读CMake的输出摘要。找到缺失或版本不符的库。
  • 解决
    1. 对于缺失库 :使用包管理器搜索并安装对应的 -dev -devel 包。例如,提示找不到 LibGcrypt ,就安装 libgcrypt20-dev (Debian)或 libgcrypt-devel (RHEL)。
    2. 对于版本过低 :首先尝试更新系统仓库。如果仓库中的版本仍然过低,你有两个选择:一是通过 -DCMAKE_DISABLE_FIND_PACKAGE_<PackageName>=TRUE 暂时禁用该功能;二是从源码编译该依赖库的新版本并安装到自定义路径(如 /usr/local ),然后通过 -D<PackageName>_DIR=/usr/local/lib/cmake/... 提示CMake查找新位置。后者较为复杂。

6.2 编译过程中的链接错误

这类错误发生在 make 阶段。

  • 症状 :编译中途报错,错误信息常包含 undefined reference to ‘xxx‘ cannot find -lxxx
  • 排查 :这通常是链接器找不到某个库文件。可能是依赖库没装对(比如装了运行时库 libxxx 但没装开发库 libxxx-dev ),或者是库文件路径不在链接器的搜索范围内。
  • 解决
    1. 确认开发包已安装。
    2. 对于自定义路径安装的库,可能需要设置 LD_LIBRARY_PATH 环境变量,或者在CMake配置时通过 -DCMAKE_PREFIX_PATH=/your/custom/path 指定查找路径。
    3. 有时需要清理 build 目录,从头开始 cmake make

6.3 运行时错误: GLIBCXX 版本问题

  • 症状 :启动Wireshark时崩溃,终端提示类似 /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version ‘GLIBCXX_3.4.29‘ not found 的错误。
  • 原因 :你在一个较老的系统(如Ubuntu 18.04)上,用较新的GCC编译器编译了Wireshark。编译时链接了高版本的 libstdc++ 库,但运行时系统的库版本过低。
  • 解决 :这是最棘手的问题之一。根本方法是升级系统的GCC运行时库,但这可能影响系统其他软件。更可行的方案是: 在与你目标部署环境相似的系统上进行编译 。例如,如果你要在Ubuntu 18.04上运行,就在Ubuntu 18.04的容器或虚拟机上编译。或者,考虑使用静态链接( -DUSE_STATIC=ON ),但这会极大增加二进制文件体积。

6.4 图形界面相关错误

  • 症状 wireshark 无法启动,提示与Qt、GTK或显示相关。
  • 排查
    1. 确认编译时启用了正确的GUI选项( -DENABLE_QT=ON )。
    2. 确认安装了对应GUI库的运行时环境。例如,编译了Qt版,就需要安装 qt5-default 或类似包来提供运行时库。
    3. 在纯命令行服务器(无图形界面)上,自然无法启动 wireshark ,但 tshark 应正常工作。
  • 解决 :安装缺失的运行时包,或确保环境有可用的X11/Wayland显示服务器(对于远程SSH,可能需要设置 DISPLAY 环境变量或使用X11转发)。

6.5 抓包权限问题依旧

  • 症状 :即使设置了 setcap 或加入了 wireshark 组,仍提示“You don‘t have permission to capture on that device”。
  • 排查
    1. 检查 dumpcap 的权限: ls -l /usr/local/bin/dumpcap 。应显示 cap_net_admin, cap_net_raw 能力位已设置。
    2. 某些发行版(如Fedora、RHEL)默认开启了SELinux,可能会阻止 dumpcap 。可以尝试临时禁用SELinux测试( sudo setenforce 0 ),但这不是长久之计。
    3. 检查是否使用了非标准的网络接口(如Docker创建的虚拟接口、VPN接口),这些接口可能需要特殊权限。
  • 解决
    1. 重新执行 setcap 命令。
    2. 如果SELinux是原因,需要为其添加策略规则,这比较复杂。一个简单的(但不推荐用于生产)方法是禁用Wireshark相关的SELinux限制: sudo setsebool -P wireshark_traffic_analyzer 1
    3. 对于Docker接口,可能需要以 root 身份运行,或配置Docker守护进程的权限。

7. 进阶配置:性能调优与生产环境部署建议

当你成功从源码编译出Wireshark后,还可以根据实际使用场景进行一些进阶调整,使其更贴合你的需求。

7.1 编译优化标志微调

对于追求极致性能的场景(如需要实时分析超高流量),可以在CMake配置时传递更激进的编译器优化选项。这需要你对GCC/Clang编译选项有一定了解。

cmake .. \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_FLAGS_RELEASE="-O3 -march=native" \
    -DCMAKE_CXX_FLAGS_RELEASE="-O3 -march=native"
  • -O3 :比 -O2 更激进的优化级别,但可能增加编译时间,且在某些极端情况下可能导致程序行为异常(极少见)。
  • -march=native :告诉编译器生成针对你当前CPU型号优化的代码,充分利用AVX2等高级指令集。 注意 :这样编译出的二进制文件可能无法在其他不同架构的CPU上运行。

7.2 为无头服务器构建精简版本

如果你只需要在服务器上使用 tshark 进行自动化分析,可以编译一个极度精简的版本,去掉所有图形界面和无关依赖。

cmake .. \
    -DCMAKE_INSTALL_PREFIX=/opt/wireshark-headless \
    -DCMAKE_BUILD_TYPE=Release \
    -DENABLE_QT=OFF \
    -DENABLE_GTK3=OFF \
    -DBUILD_wireshark=OFF \
    -DBUILD_tshark=ON \
    -DENABLE_PLUGINS=OFF \ # 可选,禁用插件简化依赖
    -DCMAKE_DISABLE_FIND_PACKAGE_SMI=TRUE \ # 可选,禁用SNMP MIB支持
    -DCMAKE_DISABLE_FIND_PACKAGE_GCRYPT=TRUE # 可选,如果不需要加密协议解密

这样编译出来的 tshark 体积更小,依赖更少,更适合在资源受限或需要批量部署的服务器环境中使用。

7.3 打包与分发

如果你需要将编译好的Wireshark部署到多台相同环境的机器上,手动编译安装效率太低。可以考虑打包。

  • 制作压缩包 :编译安装到某个独立前缀(如 /opt/wireshark-custom )后,直接将该目录打包成 tar.gz
    sudo make install DESTDIR=/tmp/wireshark-install
    cd /tmp
    tar czf wireshark-custom.tar.gz -C wireshark-install .
    
    在其他机器上解压到相同路径即可。但需要注意目标机器的库兼容性(尤其是 glibc 版本)。
  • 制作RPM/DEB包 :更专业的方法是编写spec文件(RPM)或debian规则(DEB),通过 checkinstall 工具或直接使用CMake的 cpack 命令来生成系统包。这涉及更深的知识,但可以实现依赖声明、版本管理和干净卸载。

7.4 版本管理与更新

从源码安装意味着脱离了系统包管理器的版本管理。更新Wireshark需要手动操作:

  1. 进入源码目录,拉取最新代码: git pull origin master (或你跟踪的分支)。
  2. 如果有子模块,更新之: git submodule update --init --recursive
  3. 删除旧的 build 目录,或彻底清理它: cd build && rm -rf *
  4. 重新执行 cmake 配置和 make 编译安装。
  5. 由于是覆盖安装,通常不需要重新设置 dumpcap 的权限,除非其路径或属性发生变化。

从源码安装Wireshark是一次深入了解这个强大工具背后机理的绝佳实践。它让你摆脱了二进制包的限制,获得了根据实际需求定制工具的完全自由。虽然过程比直接 apt install 复杂,但带来的控制力和灵活性是无可替代的。无论是为了获取最新特性、适配特殊环境,还是单纯为了学习,这份投入都是值得的。下次当你需要某个特定功能或遇到平台兼容性问题时,不妨尝试打开终端,从 git clone 开始你的定制之旅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值