## 环境准备:操作系统、依赖库、网络配置 我记得刚接触DSPM项目的时候,第一件事就是被环境折腾得够呛。你想想看,一个号称“开箱即用”的方案,光装依赖就折腾了大半天。说实话,后来我自己带团队做对接,花在环境准备上的时间反而最多。为什么?因为环境不稳,后面全是坑。 ### 操作系统选型 我个人习惯在Ubuntu上做第一轮验证。DSPM官方文档里推荐的是 **Ubuntu 20.04 LTS** 或 **CentOS 7.9+**。我建议你直接用Ubuntu 20.04,社区活跃,遇到问题好搜。 | 系统 | 推荐版本 | 内核要求 | 我的建议 | |------|----------|----------|----------| | Ubuntu | 20.04 LTS | ≥ 5.4 | 首选,坑最少 | | CentOS | 7.9+ | ≥ 3.10 | 老项目兼容还行 | | Rocky Linux | 8.x+ | ≥ 4.18 | Red Hat生态替代品 | **为什么内核版本重要?** DSPM的数据采集模块依赖 **eBPF** 技术,需要内核支持 `BPF_PROG_TYPE_TRACING`。Ubuntu 20.04默认内核≥5.4,正好满足。我在一个项目里遇到过CentOS 7.6内核是3.10,结果eBPF程序根本跑不起来——后来只能手动升级内核,多花了两天。 >
> 如果你必须在CentOS 7.x上部署,建议用 `elrepo` 升级内核到5.x。命令我写过无数次: >
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml
grub2-set-default 0
reboot
>
### 依赖库安装 说实话,依赖库这一块往往是新手最容易翻车的地方。DSPM的核心依赖分成三层: 1. **基础运行时** — Python 3.8+ / Go 1.18+ / Node.js 16+ 2. **数据通道** — Redis 6.2+ / Kafka 3.0+ / RabbitMQ 3.8+ 3. **采集工具链** — clang 12+ / llvm 12+ / libbpf-dev 我建议你用一个脚本一次性装完。下面这个脚本我在三个项目里验证过,直接复制就能用:
#!/bin/bash
# DSPM 环境依赖一键安装(Ubuntu 20.04/22.04)
set -e

echo ">>> 更新系统包"
apt update && apt upgrade -y

echo ">>> 安装基础依赖"
apt install -y \
    python3.10 python3.10-dev python3-pip \
    golang-go  \
    nodejs npm \
    redis-server \
    rabbitmq-server \
    clang-12 llvm-12 libbpf-dev \
    git curl wget jq

echo ">>> 安装 Python 包"
pip3 install --upgrade pip
pip3 install \
    dspm-sdk==2.1.0 \
    pydantic==1.10.0 \
    requests==2.28.0 \
    flask==2.2.0

echo ">>> 验证安装"
python3 --version
go version
node --version
redis-cli --version
clang-12 --version | head -n1

echo ">>> 安装完成"
我记得第一次跑这个脚本时,`libbpf-dev` 在Ubuntu 22.04里包名变成了 `libbpf-dev`(少了个字母),结果编译报错。嗯,这里要注意:**不同Ubuntu版本,包名可能有细微差异。** 装之前先 `apt search libbpf` 确认一下。 >
> **千万别不管依赖版本就开装。** 我曾经在CentOS 7上装了Python 3.11,结果dspm-sdk里的某些c扩展不兼容,直接Segmentation Fault。后来老老实实退回到3.8才解决。建议严格按照官方文档的版本范围来。 >
### 网络配置要点 网络配置是我认为最容易“埋雷”的环节。DSPM对接涉及多个组件之间的通信,端口开不对,后面全白干。 | 组件 | 默认端口 | 协议 | 说明 | |------|----------|------|------| | DSPM Agent → Collector | 7843 | HTTPS/gRPC | 数据上报通道 | | Collector → Broker | 9092 / 5672 | TCP | Kafka / RabbitMQ | | DSPM Web UI | 8443 | HTTPS | 管理控制台 | | API Gateway | 9443 | HTTPS | REST API 入口 | **我给你的配置清单:** 1. **防火墙放通** — 不要偷懒只开SSH。上面表格里的端口必须全开。我见过一个线上事故,Agent上报数据总是超时,查了一下午,发现是Collector到Broker的9092端口被iptables DROP了。 2. **DNS/主机名** — DSPM内部依赖主机名解析。我建议所有节点都用静态IP,并在 `/etc/hosts` 里写死映射关系。为什么?你在云环境里重启一下,IP变了,DNS缓存还没刷新,整个集群就裂开了。 3. **MTU 调优** — 如果你的环境走的是VXLAN或overlay网络(比如K8s、Docker),建议把MTU从1500改成1450。我之前部署到阿里云,Agent上报大包时频繁丢包,改完MTU立马稳如狗。 4. **证书/SSL** — 生产环境必须用HTTPS。内部可以用自签名证书,但要注意把所有节点的CA证书都同步一份。我用过一个偷懒办法:统一部署一个Nginx反代,证书只配在Nginx上,后端全走HTTP。这样证书管理简单,安全等级也够。 >
> 网络配置一条至理:
> 先通,再优,最后加固。
> 先保证端口能通,再考虑性能调优,最后才上安全策略。不要一上来就开防火墙、iptables、selinux全上,自己把自己堵死了。 >
### 一张图看懂环境准备 下面这张SVG流程图,帮你把整个环境准备的逻辑串起来。画的是我脑子里最稳定的部署流程。 DSPM 环境准备核心流程 环境准备 操作系统 Ubuntu 20.04 / CentOS 7.9 依赖库 Python 3.8 / Redis 6.2 网络配置 端口 / DNS / SSL 环境验证 DSPM 对接开始 三大模块缺一不可,操作系统和依赖库决定基础,网络配置决定能否跑通 验证环节一定要做完整通信测试,不要跳步 ### 实战:一个完整的安装验证流程 好了,理论说完了,我带你走一遍完整的安装验证。假设你手上有台干净的Ubuntu 20.04服务器。 **第一步:确认系统版本**
$ cat /etc/os-release | grep -E '^VERSION_ID|^NAME'
NAME="Ubuntu"
VERSION_ID="20.04"
**第二步:执行安装脚本** 把前面那一段 `install.sh` 拷贝到服务器上,加上执行权限:
$ chmod +x install.sh
$ sudo ./install.sh
不出意外的话,5-10分钟后所有依赖装完。中间如果报 `apt lock` 错误,等一会儿重试就行。 **第三步:验证网络连通性** 我一般用这个脚本来验收:
# 测试 Agent 到 Collector
curl -k https://collector.internal:7843/health

# 测试 Collector 到 Broker
echo "test" | kcat -P -b broker.internal:9092 -t dspm-test

# 测试 Web UI 可访问
curl -k https://webui.internal:8443/

# 确认所有端口都在监听
sudo ss -tulpn | grep -E '7843|8443|9092|5672'
>
> **一条硬性验证标准:** 所有 curl 返回 200,所有端口 LISTEN。少一个都不行。我在现场交付时,哪怕只少一个服务,都绝不往下走。为什么?因为后面的问题会指数级放大,排查起来比现在修麻烦十倍。 >
**第四步:用DSPM自带的诊断工具** 如果你装的是官方版本,里面一般带一个 `dspm-diagnostics` 工具:
$ dspm-diagnostics check
[PASS] OS: Ubuntu 20.04.6 LTS
[PASS] Kernel: 5.4.0-150-generic
[PASS] Python: 3.8.10
[PASS] Redis: 6.2.7
[PASS] Clang: 12.0.1
[PASS] Network: Collector reachable in 2ms
[PASS] SSL: Certificate valid until 2026-01-01

Result: ALL PASS
我习惯把 `ALL PASS` 截图保存,作为环境交付物的一部分。 写到这里,我想强调一个我在多个项目里总结出的原则:**环境准备不是一次性的,而是持续要做的事。** 每次机器重启、内核更新、网络割接,最好都重新跑一遍诊断。我个人被坑最惨的一次就是忘了这个,结果机器重启后iptables规则丢了,Agent断连三天才发现。嗯,从那以后我就把这个写进了SOP里。