Lily的博客 - Lily
type: channel
link: https://lycode.top/index.php/author/1/
description: Lily
items: MySQL Binlog 数据恢复方案
items: OpenClaw 模型厂商配置指南
items: Claude Code使用技巧
items: Vibecoding提示词工程
items: ZLMediaKit 搭建流媒体服务：监控直播与录播完整方案
items: Arthas线上诊断实战指南
items: 数据仓库分层架构：从零搭建 ODS、DWD、DWS 到 ADS
items: 远程访问方案（二）：WireGuard点对点组网实战
items: 远程访问方案（一）：FRP端口转发与内网穿透
items: Linux tcpdump 抓包实战指南

MySQL Binlog 数据恢复方案
type: item
date: 2026-04-20T09:02:00+00:00
description: AI摘要 本文介绍了一种基于MySQL Binlog的闪回恢复方案，用于恢复因误操作而删除的数据。方案包括定位binlog文件、解析binlog、将DELETE事件转换为INSERT、导入恢复数据、验证数据和回写原库等步骤。同时，提供了Python脚本用于将binlog中的DELETE事件转换为INSERT语句，并讨论了方案的适用场景和局限性。 此内容根据文章生成，仅用于文章内容的解释与总结 背景2026-04-18 18:05:15，FSSE 数据中心系统通过 FsseDataVersionApiService.deleteMany() 接口删除了 7 个数据版本，触发级联删除，清空了终端表 ads_rpt_team_series（252,830 行）和 rpt_template_params（3,480 行）的对应数据。根因分析调用链路：deleteMany API（传入 7 个版本 ID） → FsseDataVersionServiceImpl.deleteMany() → 遍历 FinalTableEnum 所有终端表 → FinalTableServiceImpl.deleteFinalTableDataByVersionCode() → DELETE FROM tableName WHERE version_code IN (:versionCodes) → 更新任务记录状态为 NOT_SAVED → 删除版本记录本身被删除的 7 个版本：坡头巴里坤洋浦赤坎_v1、柯坪县_v1、民丰县_v1、沙湾市_v2、泽普县_v2、泽普县_v3、泽普县_测试。环境信息项目值服务器192.168.3.166MySQL 版本5.7（Docker 容器 mysql_5.7）数据卷/data/mysql_5.7/data → /var/lib/mysql认证方式mysql -h 127.0.0.1 -u root -pyide123456（必须用 TCP，socket 连接会认证失败）binlog 格式ROW原始数据库data_center_test恢复数据库data_center_test_recover恢复流程第一步：定位 binlog 文件-- 登录 MySQL 查看 binlog 列表 SHOW BINARY LOGS; -- 查看目标时间点附近的事件（先找大致位置） SHOW BINLOG EVENTS IN 'mysql-bin.000003' LIMIT 100;第二步：解析 binlog注意：该 Docker 镜像是精简版，容器内没有 mysqlbinlog 工具。需要在宿主机安装 MySQL 5.7 客户端。MariaDB 自带的 mysqlbinlog 与 MySQL 5.7 binlog 不兼容（报错 event_type: 35）。安装 MySQL 5.7 客户端（CentOS）：# 添加 MySQL 官方 repo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm # 安装（跳过 GPG 校验，官方 key 已过期） yum install --nogpgcheck mysql-community-client -y解析 binlog 为可读文本：mysqlbinlog \ --base64-output=DECODE-ROWS -v \ --start-datetime="2026-04-18 18:04:00" \ --stop-datetime="2026-04-18 18:07:00" \ /data/mysql_5.7/data/mysql-bin.000003 \ > /tmp/binlog_0418.txt第三步：将 DELETE 转换为 INSERT（闪回）ROW 格式的 binlog 中，DELETE 事件包含被删除行的完整数据（在 WHERE 子句中）。通过 Python 脚本将 DELETE 反转为 INSERT：脚本 flashback_parser.py：#!/usr/bin/env python3 """ 解析 mysqlbinlog --base64-output=DECODE-ROWS -v 的输出， 将 DELETE 行反转为 INSERT 语句，用于数据恢复。 """ import sys import re # 根据实际表结构定义列名（顺序必须与 binlog @1, @2, ... 对应） ADS_RPT_COLUMNS = [ "id", "org_id", "org_name", "org_type_code", "org_type_name", "org_…

OpenClaw 模型厂商配置指南
type: item
date: 2026-03-19T11:20:00+00:00
description: AI摘要 本文是一份OpenClaw模型厂商配置指南，详细介绍了如何添加新模型厂商（以lingyu为例），包括修改Provider、认证、别名和Agent绑定模型等四个配置部分。文章还提供了Lingyu厂商配置概况、企业微信Agent当前配置和全部厂商总览，以及一些注意事项，如修改前备份、修改后验证和模型引用格式等。 此内容根据文章生成，仅用于文章内容的解释与总结 OpenClaw 模型厂商配置指南配置文件：~/.openclaw/openclaw.json添加新模型厂商（以 lingyu 为例）需修改 4 处配置：1. Provider（models.providers）"lingyu": { "baseUrl": "http://<your-proxy-ip>:18080", "apiKey": "sk-your-api-key-here", "api": "anthropic-messages", "models": [ { "id": "claude-sonnet-4-6", "name": "Claude Sonnet 4.6", "reasoning": false, "input": ["text"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 200000, "maxTokens": 8192 } ] }字段说明baseUrlAPI 代理地址（含端口，不加 /v1）apiKey厂商 API 密钥api协议类型：Claude 模型用 anthropic-messagesmodels[].id模型标识，引用时用 provider/id 格式contextWindow上下文窗口大小（tokens）maxTokens单次最大输出 tokens2. 认证（auth.profiles）"lingyu:default": { "provider": "lingyu", "mode": "api_key" }3. 别名（agents.defaults.models）"lingyu/claude-sonnet-4-6": { "alias": "Sonnet-4.6-LY" }, "lingyu/claude-haiku-4-5": { "alias": "Haiku-4.5-LY" }4. Agent 绑定模型（agents.list）{ "id": "wecom", "model": "lingyu/claude-sonnet-4-6" }Lingyu 厂商配置概况项目值Provider IDlingyuAPI 地址http://<proxy-ip>:18080协议Anthropic Messages认证方式API Key可用模型：模型 ID别名说明claude-sonnet-4-6Sonnet-4.6-LYAnthropic Claude Sonnet 4.6claude-haiku-4-5Haiku-4.5-LYAnthropic Claude Haiku 4.5企业微信 Agent 当前配置配置项值Agent IDwecom默认模型lingyu/claude-sonnet-4-6Providerlingyu切换模型示例：将 model 改为 lingyu/claude-haiku-4-5 可用更快的 Haiku。全部厂商总览Provider说明可用模型lingyu灵鱼云claude-sonnet-4-6, claude-haiku-4-5注意事项修改前备份：cp openclaw.json openclaw.json.bak.$(date +%Y%m%d%H%M)修改后验证：jq . openclaw.jsoncost 全 0 表示不计费（包月/自建接口）模型引用格式统一为 <provider>/<model-id>

Claude Code使用技巧
type: item
date: 2026-02-02T00:05:00+00:00
description: AI摘要 本文介绍了提高Claude代码使用效率的技巧，包括设置种子存储库、增强推理能力、一键停止或倒回、Safe YOLO模式、CLAUDE.md层次结构、一词工具白名单、图像增强上下文、gh CLI超能力、子代理健全性检查、Markdown清单草稿、自动接受模式、Git Worktrees并行、CI机器人无头模式、黄金工作流程、TDD强化版和文件定位超能力等。 此内容根据文章生成，仅用于文章内容的解释与总结 原文链接：https://youware.app/project/12j7l4bqao，因网络访问原因，现摘抄如下内容。种子存储库设置为每个代码库设置一个经过调整的 CLAUDE.md 文件，添加 "IMPORTANT / YOU MUST" 以获得更强的遵守度，使用 /init 命令立即生成模板。增强推理能力插入单词 think → think hard → think harder → ultrathink 以在 Claude 行动前解锁更大的思考预算。一键停止或倒回Esc 停止任何阶段但不丢失上下文；双击 Esc 可以编辑较早的提示并分支出新路径。Safe YOLO 模式在隔离容器中运行 claude --dangerously-skip-permissions 以无人值守地批量修复错误。CLAUDE.md 层次结构支持根目录、父目录、子目录或 ~/.claude 位置，monorepos 自动继承全局和每个包的指导。一词工具白名单使用 /allowed-tools Edit Bash(git commit:*) 移除未来权限提示，永久允许特定工具。图像增强上下文粘贴截图或提供文件路径；Claude 可以直观地比较模型与输出，迭代 UI 直到像素匹配。gh CLI 超能力Claude 熟练掌握 gh：起草 PR、修复审查评论、分类问题，并撰写引用历史的提交消息。子代理健全性检查让 Claude 启动子代理，独立验证计划或防止过度拟合您的测试，为关键系统增加额外验证。Markdown 清单草稿让 Claude 将问题列表转储到 .md 文件，在修复时勾选项目，特别适合处理大型迁移或批量修复。自动接受模式Shift+Tab 切换"自动接受"模式 - 让 Claude 无暂停运行，再次切换以恢复逐步控制。Git Worktrees 并行生成多个 worktrees，每个终端一个 Claude，每个在单独分支上；没有合并冲突，最大化吞吐量。CI 机器人无头模式claude -p "<prompt>" --output-format stream-json 插入到管道中，自动标记问题或 lint。黄金工作流程探索 → 规划（不编码） → 实现 → 提交；提前的规划请求显著提高成功率。TDD 强化版让 Claude 编写失败的测试，提交它们，然后迭代代码直到通过；用第二个 Claude 从零审查实现。文件定位超能力在提示中使用 tab 补全文件名，让 Claude 跳转到确切的位置，节省上下文预算。

Vibecoding提示词工程
type: item
date: 2025-12-15T09:30:00+00:00
description: AI摘要 Vibecoding是一个编程提示词工程，包含了一系列编程规范和最佳实践。这些规范涉及代码简洁、复用、模块化、代码删除、注释、版本控制、测试、文档更新、代码提交、代码格式化、命名、性能优化、代码审查、版本管理、依赖管理、前端设计、代码长度等方面，旨在提高代码质量和开发效率。 此内容根据文章生成，仅用于文章内容的解释与总结 "system_prompt": [ "遵循极简主义：保持功能简洁，避免过度设计与复杂架构。", "优先查找已有实现：先检查是否有开源库可直接复用，再检查项目中是否已有类似功能，避免重复造轮子。", "尽可能复用现有代码与模块，保持模块化和高解耦。", "删除无用代码时必须彻底，确认没有引用并确保可通过版本控制回滚。", "在删除或修改代码前必须添加注释，说明原因与替代方式。", "保持所有变更在 Git 中可追踪，禁止不透明修改。", "所有测试必须放在 tests/ 目录并按模块划分，禁止散乱测试文件。", "开发新功能必须编写单元测试（pytest 或 unittest）。", "测试逻辑必须独立清晰，不得依赖其他测试。", "开发中产生的中间文件、调试脚本、临时日志必须及时清理。", "功能开发完成后必须同步更新相关文档（README 或 docs）。", "每个迭代结束后必须清理中间文件、调试代码、测试残留。", "提交必须原子化，一次提交只做一件事。", "提交信息应简洁明确，例如：'feat: 完成功能A' 或 'fix: 修复模块B'。", "禁止冗余注释和随手文档，说明性内容必须放在 README.md 或 docs/。", "统一使用代码格式化工具（如 black 或 autopep8）。", "保持变量、函数、类命名简洁并遵循语言规范。", "注释必须精准，仅用于解释复杂逻辑或算法。", "禁止过早优化，先让功能正常运行再做性能优化。", "关键路径必须具备性能测试或性能验证。", "所有代码必须经过审查，合并前确保功能完整且测试通过。", "禁止合并未完成的功能或半成品代码。", "强制使用 Git 进行版本管理，每次提交必须原子且可回滚。", "使用 requirements.txt 或 poetry 管理依赖，禁止漂浮依赖。", "禁止使用全局环境安装依赖，必须使用虚拟环境或项目本地环境。", "前端页面不得使用蓝色、紫色、渐变色；必须使用统一主色与强调色, 宽屏设计，使用严肃的企业后端管理系统风格。", "前端页面禁止使用 emoji，样式保持脚手架默认或统一设计体系。", "每个代码文件尽量不超过 400 行，超过必须拆分、重构与模块化。", "如果使用 Python 作为技术栈，必须在虚拟环境中运行。" ]

ZLMediaKit 搭建流媒体服务：监控直播与录播完整方案
type: item
date: 2025-10-19T11:37:00+00:00
description: AI摘要 ZLMediaKit是一个基于C++11的流媒体服务框架，支持RTSP、RTMP、HLS等多种协议，适用于监控、直播和录播场景。本文详细介绍了如何使用ZLMediaKit搭建流媒体服务，包括Docker部署、配置文件说明、监控摄像头接入、直播推流、录播方案、多路监控批量接入、WebHook事件通知、WebRTC低延迟播放以及常见问题解答。通过ZLMediaKit，可以实现摄像头信号的多种场景服务，满足不同需求。 此内容根据文章生成，仅用于文章内容的解释与总结 ZLMediaKit是什么ZLMediaKit 是一个基于 C++11 的流媒体服务框架，核心能力是协议转换：摄像头推来的 RTSP、OBS 推来的 RTMP，统一转出 WebRTC/HLS/HTTP-FLV，让不同终端都能消费同一路流。支持协议：RTSP、RTMP、HLS、HTTP-FLV、WebRTC、SRT协议对比：RTSP vs RTMP vs WebRTC先搞清楚三个协议分别在哪个环节用，之后选配置才不会蒙：维度RTSPRTMPWebRTC传输层TCP/UDPTCPUDP（DTLS + SRTP）典型延迟1~3 秒1~3 秒< 500ms（亚秒级）浏览器支持不支持不支持（Flash 已死）原生支持主要用途摄像头/NVR 内网传输直播推流（OBS等）低延迟播放、视频通话防火墙穿透差（需开 554 端口）一般（需开 1935）好（走 443/TURN）加密可选（RTSPS）可选（RTMPS）强制加密并发能力中中中（信令开销较高）适用场景监控设备接入、内网传输直播推流端浏览器实时播放、监控大屏RTSP：摄像头/NVR 的原生协议，用于设备到服务器的接入RTMP：直播推流端的标准，OBS/编码器用这个往服务器推WebRTC：浏览器端播放的最优解，延迟最低，无需插件ZLMediaKit 接收前两者，输出成后面所有格式，一路摄像头信号同时服务多种终端。一、部署 ZLMediaKit1.1 Docker 部署（推荐）# 拉取镜像 docker pull zlmediakit/zlmediakit:master # 启动容器 docker run -d \ --name zlmediakit \ --restart=always \ -p 1935:1935 \ # RTMP -p 554:554 \ # RTSP -p 8080:80 \ # HTTP / HLS / HTTP-FLV -p 8443:443 \ # HTTPS -p 8554:8554 \ # RTSP over HTTP -p 10000:10000/udp \ # RTP/RTCP -p 8000:8000/udp \ # WebRTC（DTLS） -p 10000-10100:10000-10100/udp \ # WebRTC 媒体端口范围 -v /opt/zlmediakit/config:/opt/config \ -v /opt/zlmediakit/record:/opt/record \ zlmediakit/zlmediakit:master1.2 源码编译（Linux）# 安装依赖 apt-get install -y cmake gcc g++ git libssl-dev libsdl-dev libavcodec-dev libavutil-dev # 克隆源码（含子模块） git clone --depth 1 https://github.com/ZLMediaKit/ZLMediaKit.git cd ZLMediaKit git submodule update --init # 编译 mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) # 启动 cd release/linux/Release ./MediaServer -d &二、配置文件说明配置文件为 config.ini，关键配置项：[api] # HTTP API 密钥，用于调用 REST 接口 secret=your_api_secret [general] # 流媒体文件存储根目录 mediaServerId=zlmediakit-server [record] # 录像文件保存路径 appName=record # MP4 录制分片时长（秒） mp4MaxSecond=3600 [hls] # HLS 切片时长（秒） segDur=2 # 切片数量 segNum=3 [rtsp] # RTSP 服务端口 port=554 [rtmp] # RTMP 服务端口 port=1935 [http] # …

Arthas线上诊断实战指南
type: item
date: 2025-09-21T11:55:00+00:00
description: AI摘要 Arthas是阿里巴巴开源的Java诊断工具，能够在不重启应用的情况下实时查看和修改JVM运行状态。它适用于排查线上Java性能问题、内存泄漏、CPU飙高等问题。本文详细介绍了Arthas的安装方式、常用诊断场景、高级用法以及生产环境最佳实践，帮助开发者提升问题排查效率。 此内容根据文章生成，仅用于文章内容的解释与总结 线上 Java 应用出问题了？别急着重启Arthas 是什么Arthas 是阿里开源的 Java 诊断工具。线上应用突然 CPU 飙高、接口变慢、内存泄漏，你不用重启应用就能实时查看 JVM 状态，甚至热更新代码。我在生产环境用它救过好几次火。什么时候该用它遇到这些情况，Arthas 能帮上忙：CPU 突然飙到 100%，不知道哪个方法在疯狂运行接口响应从 100ms 突然变成 5 秒，调用链路不清楚内存一直涨，怀疑有泄漏但不确定类加载冲突，想看看实际加载的是哪个版本线上紧急 bug，等不及走发布流程想看看 JVM 参数、线程状态、GC 情况安装最简单的方式# 下载 curl -O https://arthas.aliyun.com/arthas-boot.jar # 启动 java -jar arthas-boot.jar启动后会列出所有 Java 进程，输入序号就能 attach 上去。完整安装curl -O https://arthas.aliyun.com/arthas-packaging-latest.zip unzip arthas-packaging-latest.zip ./as.sh一键安装curl -L https://arthas.aliyun.com/install.sh | shDocker 环境怎么用临时诊断最常用的方式，进容器直接下载：docker exec -it <container_id> /bin/bash curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar内置到镜像如果经常需要诊断，可以把 Arthas 打进镜像。Dockerfile 加这几行：FROM openjdk:8-jdk-alpine RUN apk add --no-cache curl RUN curl -O https://arthas.aliyun.com/arthas-boot.jar COPY app.jar /app.jar COPY start.sh /start.sh RUN chmod +x /start.sh ENTRYPOINT ["/start.sh"]start.sh 内容：#!/bin/sh java -jar /app.jar & sleep 10 if [ "$ENABLE_ARTHAS" = "true" ]; then java -jar /arthas-boot.jar --target-ip 0.0.0.0 --telnet-port 3658 --http-port 8563 <PID> fi wait启动容器：# 平时不启用 docker run -d my-app # 需要诊断时启用 docker run -d -e ENABLE_ARTHAS=true -p 3658:3658 -p 8563:8563 my-appDocker Compose 配置：version: '3' services: app: image: my-app environment: - ENABLE_ARTHAS=false ports: - "8080:8080" - "3658:3658" - "8563:8563"实战场景CPU 飙高# 看最忙的 3 个线程 thread -n 3 # 看某个线程在干什么 thread <thread_id> # 持续监控方法耗时 monitor -c 5 com.example.Service method接口慢# 追踪调用路径和耗时 trace com.example.Controller handleRequest # 只追踪耗时超过 100ms 的 trace com.example.Controller handleRequest '#cost > 100' # 看入参和返回值 watch com.example.Service query "{params,returnObj}" -x 2内存问题# 看内存使用 memory # 导出堆转储 heapdump /tmp/dump.hprof # 实时监控 dashboard类加载问题# 看类信息 sc -d com.example.MyClass # 看方法信息 sm com.…

数据仓库分层架构：从零搭建 ODS、DWD、DWS 到 ADS
type: item
date: 2025-08-03T10:46:00+00:00
description: AI摘要 本文详细介绍了数据仓库的分层架构，包括ODS（贴源层）、DWD（明细层）、DWS（汇总层）和ADS（应用层），并解释了各层的职责、命名规范和数据流转的全链路示例。分层架构有助于提高数据的可追溯性、可复用性、解耦合性和易维护性。 此内容根据文章生成，仅用于文章内容的解释与总结 为什么你的报表总是对不上？从数据分层说起什么是数据仓库分层数据仓库（Data Warehouse）不是把数据堆在一起，而是按层次组织，让每一层只干一件事。这样做的好处很实际：数据出问题时，能快速定位是哪一层的锅；中间层算好的结果可以被多个下游复用；源系统改了字段，只需要改最底层，上层不用动；每层职责清晰，改动的影响范围可控。标准分层架构主流的数据仓库分层方案如下：业务系统 (OLTP) ↓ ODS（贴源层） ↓ DWD（明细层） ↓ DWS（汇总层） ↓ ADS（应用层） ↓ 报表 / BI / 接口ODS：贴源层（Operational Data Store）ODS 是数据进入仓库的第一站。从业务系统（MySQL、PostgreSQL、日志等）同步过来，原样保存，不加任何业务逻辑。按天分区，保留历史快照，顺带做数据质量检查（空值、格式异常这类）。命名通常以 ods_ 开头，带上源系统名和表名：ods_mysql_user_info_di # di = daily increment，日增量 ods_mysql_order_di ods_log_app_click_di有几点容易踩坑：ODS 这层只管存，别在这里做业务逻辑；源系统如果有物理删除，ODS 要用软删除记下来；字段名保持原样，改名的事留到 DWD 做。DWD：明细层（Data Warehouse Detail）DWD 是数据清洗和整合的核心。ODS 的原始数据经过清洗、标准化、关联维度表之后，在这里变成干净的、面向业务过程的明细数据。具体做的事包括：去脏数据、空值处理、类型转换、统一时区编码和状态含义、把 ID 关联成有意义的字段（比如 user_id 关联出 city_name），以及按业务过程拆分或合并表。命名以 dwd_ 开头，描述业务过程：dwd_order_detail_di # 订单明细 dwd_user_behavior_click_di # 用户点击行为明细 dwd_pay_success_di # 支付成功明细示例ODS 原始订单数据：-- ods_mysql_order_di order_id | user_id | status | create_time | amount 1001 | 888 | 2 | 2026-02-27 10:00:00 | 99.00DWD 清洗后：-- dwd_order_detail_di order_id | user_id | status_name | create_date | amount | city_name 1001 | 888 | 已付款 | 2026-02-27 | 99.00 | 上海关键点：status=2 转成了可读的 已付款create_time 拆出了 create_date 用于分区通过 user_id 关联用户维度表，补充了 city_name维度表 vs 事实表DWD 里有两类表：类型说明示例事实表（Fact）记录业务过程，有度量值订单、支付、点击维度表（Dimension）描述业务实体，相对稳定用户、商品、地区维度表通常以 dim_ 命名：dim_user_info_full # full = 全量快照 dim_product_info_full dim_region_fullDWS：汇总层（Data Warehouse Summary）DWS 在 DWD 明细基础上做聚合汇总，按主题域和时间粒度生成宽表。这层是报表计算的主要数据来源。按天/周/月聚合统计指标，按业务主题构建宽表（用户域、商品域、地区域），提高下游查询效率，避免重复计算。命名以 dws_ 开头，体现主题域 + 时间粒度：dws_user_order_1d # 用户粒度，订单，最近1天 dws_product_sale_1d # 商品粒度，销售，最近1天 dws_region_gmv_1d # 地区粒度，GMV，最近1天举个例子，用户日汇总宽表长这样：-- dws_user_order_1d user_id | dt | order_count | pay_amount | avg_amount | city_name 888 | 2026-02-27 | 3 | 299.00 | 99.67 | 上海ADS：应用层（Application Data Store）ADS 是最终结果表，直接给报表、BI 工具、接口查询用。按具体业务…

远程访问方案（二）：WireGuard点对点组网实战
type: item
date: 2025-06-28T08:42:00+00:00
description: AI摘要 本文提供了一个完整的WireGuard组网方案指南，包括架构说明、CentOS 7内核升级、云服务器配置、公司内网配置、客户端配置（Mac）、验证与测试以及常见问题排查。文章详细介绍了如何配置网络拓扑、IP地址规划、安装Docker和Docker Compose、创建WireGuard目录和配置文件、启动服务、修改服务器配置、设置内网路由权限等。同时，还提供了客户端配置方法，包括使用Homebrew和App Store安装WireGuard，并配置连接。最后，文章还提供了验证与测试方法和常见问题排查，以确保组网方案的稳定性和安全性。 此内容根据文章生成，仅用于文章内容的解释与总结 目录架构说明CentOS 7 内核升级（重要）云服务器配置公司内网配置客户端配置（Mac）验证与测试常见问题排查架构说明网络拓扑客户端 Mac (10.0.0.4) ↓ WireGuard 隧道 云服务器 (10.0.0.1) ↓ WireGuard 隧道 公司内网网关 peer2 (10.0.0.3) ↓ 本地网络 公司内网设备 (192.168.3.0/24)IP 地址规划设备VPN IP说明云服务器10.0.0.1WireGuard 服务端peer110.0.0.2其他客户端peer2（公司内网）10.0.0.3内网网关，转发到 192.168.3.0/24peer3（Mac）10.0.0.4你的开发机peer4-510.0.0.5-6预留CentOS 7 内核升级（重要）⚠️ 为什么要升级内核？CentOS 7 默认内核版本为 3.10.x，不支持 WireGuard 内核模块。必须升级到 5.6+ 内核才能正常使用 WireGuard。升级步骤1. 导入 ELRepo 仓库# 导入 GPG 密钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 安装 ELRepo 仓库 rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm2. 安装最新内核# 查看可用的内核版本 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available # 安装 kernel-ml（mainline stable） yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y # 推荐版本：kernel-ml-6.6.12-1.el7.elrepo.x86_64 # 手动下载地址：https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/3. 设置默认启动内核# 查看当前所有内核 awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg # 输出示例： # 0 : CentOS Linux (6.6.12-1.el7.elrepo.x86_64) 7 (Core) # 1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) # 设置默认启动第一个内核（6.6.12） grub2-set-default 0 # 验证配置 grub2-editenv list4. 重启系统reboot5. 验证内核版本# 重启后检查内核版本 uname -r # 应该输出：6.6.12-1.el7.elrepo.x86_64 # 验证 WireGuard 模块是否可用 modprobe wireguard && echo "WireGuard 模块加载成功" || echo "WireGuard 模块加载失败"常见内核升级问题问题 1：升级后无法启动解决方法：重启时进入 GRUB 菜单选择旧内核（3.10.x）启动检查 /boot 分区空间是否足够：df -h /boot清理旧内核：yum remove kernel-3.10.0-xxx问题 2：Docker 容器无法启动解决方法：# 重新加载 Docker 服务 systemctl daemon-reload systemctl restart docker # 检查 Docker 状态 systemctl status docker问题 3：网络模块加载失败解决方法：# 确保安装了 kernel-ml-devel yum --enablerepo=elrepo-kernel install kernel-ml-devel -y…

远程访问方案（一）：FRP端口转发与内网穿透
type: item
date: 2025-06-01T04:08:00+00:00
description: AI摘要 本文介绍了如何使用FRP（Fast Reverse Proxy）搭建内网穿透方案，实现从家中安全访问公司内网服务，告别VPN的繁琐配置。文章详细列出了搭建方案所需的准备清单，包括云服务器、公司内网服务器/电脑、家用电脑和需要访问的公司服务。接着，文章分步骤介绍了如何在云服务器上部署frp服务端，包括SSH登录、安装frp、配置frps、创建systemd服务、启动服务、配置防火墙和验证服务端。然后，文章指导如何在公司内网部署frp客户端，包括下载frp客户端、配置frp客户端、启动客户端和验证连接。通过这些步骤，用户可以突破内网限制，随时随地访问公司资源，无需复杂VPN配置，支持多种协议，实现安全稳定的远程办公。 此内容根据文章生成，仅用于文章内容的解释与总结 目录方案概述准备清单步骤一：云服务器部署frp服务端步骤二：公司内网部署frp客户端步骤三：家中访问配置常见问题安全建议🎯 目标本章将使用FRP(Fast Reverse Proxy)搭建内网穿透方案,实现从家中安全访问公司内网服务,告别VPN的繁琐配置,让远程办公像在公司一样便捷。核心价值:✅ 突破内网限制,随时随地访问公司资源✅ 无需复杂VPN,一次配置长期使用✅ 支持多种协议,覆盖常见开发场景✅ 安全稳定,企业级解决方案📋 准备清单[ ] 云服务器（1核2G，公网IP）[ ] 公司内网一台服务器/电脑（能访问外网）[ ] 家用电脑（Windows/Mac）[ ] 需要访问的公司服务（MySQL/Redis/Nacos等）步骤一：云服务器部署 frp 服务端1.1 SSH 登录云服务器ssh root@你的云服务器IP1.2 安装 frp# 创建目录 mkdir -p /opt/frp && cd /opt/frp # 下载（检查最新版本：https://github.com/fatedier/frp/releases） wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz # 解压 tar -zxvf frp_0.65.0_linux_amd64.tar.gz cd frp_0.65.0_linux_amd64 # 复制服务端文件 cp frps /usr/local/bin/ chmod +x /usr/local/bin/frps # 创建配置目录 mkdir -p /etc/frp /var/log/frp1.3 配置 frpsvim /etc/frp/frps.toml粘贴以下内容（⚠️ 修改 token）：# frp 服务端配置 bindPort = 7000 auth.token = "your_complex_token_here_12345678" # ⚠️ 改成强密码 # Web 管理界面 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin_password_123" # ⚠️ 改成强密码 # 日志 log.to = "/var/log/frp/frps.log" log.level = "info" log.maxDays = 7 # 性能优化 transport.maxPoolCount = 5 transport.tcpMux = true1.4 创建 systemd 服务cat > /etc/systemd/system/frps.service <<'EOF' [Unit] Description=frp server After=network.target Wants=network.target [Service] Type=simple ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml Restart=on-failure RestartSec=5s User=root [Install] WantedBy=multi-user.target EOF1.5 启动服务# 重载 systemd systemctl daemon-reload # 启动 frps systemctl start frps systemctl enable frps # 检查状态 systemctl status frps # 查看日志 tail -f /var/log/frp/frps.log ``` 预期输出： ``` ● frps.service - frp server Active: active (r…

Linux tcpdump 抓包实战指南
type: item
date: 2025-05-02T08:30:00+00:00
description: AI摘要 本文详细介绍了Linux下强大的命令行抓包工具tcpdump的使用方法，包括安装、基本语法、查看网络接口、过滤表达式详解、常用抓包场景、实战排查TCP连接问题、读懂tcpdump输出、配合Wireshark深度分析以及权限说明。通过掌握tcpdump的核心用法，结合Wireshark进行可视化分析，可以应对几乎所有网络层面的问题定位。 此内容根据文章生成，仅用于文章内容的解释与总结 Linux tcpdump 抓包实战：从入门到分析网络问题排查时，抓包是最直接有效的手段。tcpdump 是 Linux 下最强大的命令行抓包工具，本文从安装到实战分析，系统介绍其使用方法。安装 tcpdump大多数 Linux 发行版默认已安装，可先检查：tcpdump --version若未安装，根据发行版执行：# Debian / Ubuntu sudo apt install tcpdump # CentOS / RHEL / Rocky Linux sudo yum install tcpdump # 或 sudo dnf install tcpdump # Alpine apk add tcpdump基本语法tcpdump [选项] [过滤表达式]常用选项：选项说明-i <网卡>指定监听网卡，any 表示所有网卡-n不解析主机名，直接显示 IP-nn不解析主机名和端口名-v / -vv / -vvv详细程度，层层递增-c <数量>捕获指定数量的包后退出-w <文件>将数据包写入 .pcap 文件-r <文件>从 .pcap 文件读取并分析-s <字节>捕获每个包的字节数，0 表示完整包-A以 ASCII 显示包内容（适合 HTTP）-X以十六进制 + ASCII 显示包内容-e显示链路层头部（MAC 地址）-t不显示时间戳-l行缓冲模式，配合管道使用查看网络接口在抓包前，先确认本机有哪些网卡：tcpdump -D # 或 ip link show输出示例：1.eth0 2.lo 3.any过滤表达式详解tcpdump 使用 BPF（Berkeley Packet Filter）语法，灵活强大。按主机过滤# 过滤所有与 192.168.1.1 通信的包 tcpdump -i eth0 host 192.168.1.1 # 只看来自某 IP 的包 tcpdump -i eth0 src host 192.168.1.1 # 只看发往某 IP 的包 tcpdump -i eth0 dst host 192.168.1.1按端口过滤# 过滤 80 端口（HTTP） tcpdump -i eth0 port 80 # 过滤 443 端口（HTTPS） tcpdump -i eth0 port 443 # 过滤端口范围 tcpdump -i eth0 portrange 8000-9000 # 过滤来源端口 tcpdump -i eth0 src port 22按协议过滤tcpdump -i eth0 tcp tcpdump -i eth0 udp tcpdump -i eth0 icmp tcpdump -i eth0 arp逻辑组合# AND tcpdump -i eth0 host 192.168.1.1 and port 80 # OR tcpdump -i eth0 port 80 or port 443 # NOT tcpdump -i eth0 not port 22 # 复杂组合（用括号分组，需转义或加引号） tcpdump -i eth0 'host 192.168.1.1 and (port 80 or port 443)'按网段过滤tcpdump -i eth0 net 192.168.1.0/24常用抓包场景1. 抓取 HTTP 明文请求tcpdump -i eth0 -A -nn port 80-A 以 ASCII 输出，可以直接看到 HTTP 请求/响应头和 Body。2. 抓取 DNS 查询tcpdump -i eth0 -nn port 533. 抓取与某主机的 TCP 握手tcpdump -i eth0 -nn 'host 10.0.0.1 and tcp'查看 SYN、SYN-ACK、ACK 三次握手过程。4. 只抓 ICMP（ping）tcpdump -i eth0 icmp5. 排除 SSH 避免干扰远程操作时 SSH 流量会污染抓包结果：tcpdump -i eth0 -nn not port 226. 保存抓包文件# 抓 100 个包并保存 tcpdump -i eth0 -nn -c 100 -w /tmp/capture.pcap # 抓取指定时长（配合 timeout 命令） timeou…