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>
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 跳转到确切的位置，节省上下文预算。
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 搭建流媒体服务：监控直播与录播完整方案
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] # HTTP 服务端口（HLS/HTTP-FLV 分发） port=80三、监控摄像头接入3.1 拉取 RTSP 流并转发ZLMediaKit 提供 HTTP API 可主动拉取摄像头的 RTSP 流：# 调用 API 拉取 RTSP 流，自动转换为 RTMP/HLS/HTTP-FLV curl "http://127.0.0.1:8080/index/api/addStreamProxy?secret=your_api_secret\ &vhost=__defaultVhost__\ &app=live\ &stream=camera01\ &url=rtsp://admin:password@192.168.1.100:554/h264/ch1/main/av_stream\ &rtp_type=0\ &enable_mp4=1"参数说明：参数说明app应用名，自定义stream流 ID，自定义url摄像头 RTSP 地址rtp_type0=TCP 1=UDP，推荐 TCPenable_mp4是否录制为 MP43.2 拉流后访问地址成功拉流后，同一路流自动转换为多种协议：协议访问地址RTSPrtsp://your-server:554/live/camera01RTMPrtmp://your-server:1935/live/camera01HTTP-FLVhttp://your-server:8080/live/camera01.flvHLShttp://your-server:8080/live/camera01/hls.m3u8WebRTChttp://your-server:8080/webrtc.html?url=webrtc://your-server/live/camera013.3 查看所有在线流curl "http://127.0.0.1:8080/index/api/getMediaList?secret=your_api_secret"3.4 停止拉流curl "http://127.0.0.1:8080/index/api/delStreamProxy?secret=your_api_secret\ &key=__defaultVhost__/live/camera01"四、直播推流4.1 OBS / ffmpeg 推 RTMP 流ffmpeg 推流示例：# 推送本地视频文件 ffmpeg -re -i input.mp4 -c copy -f flv rtmp://your-server:1935/live/stream01 # 推送摄像头（macOS） ffmpeg -f avfoundation -framerate 30 -i "0:0" \ -c:v libx264 -preset ultrafast -tune zerolatency \ -c:a aac -f flv rtmp://your-server:1935/live/stream01OBS 推流设置：服务器：rtmp://your-server:1935串流密钥：live/stream014.2 推流后的播放地址同 3.2 节，推流成功后自动生成多种协议地址。五、录播方案5.1 推流时自动录制通过 API 触发录制，或在配置中开启自动录制：# 对指定流开启 MP4 录制 curl "http://127.0.0.1:8080/index/api/startRecord?secret=your_api_secret\ &type=1\ &vhost=__defaultVhost__\ &app=live\ &stream=camera01\ &customized_path=/opt/record/camera01"参数说明type0=HLS录制 1=MP4录制customized_path自定义录制路径（可选）5.2 停止录制curl "http://127.0.0.1:8080/index/api/stopRecord?secret=your_api_secret\ &type=1\ &vhost=__defaultVhost__\ &app=live\ &stream=camera01"5.3 查询录制状态curl "http://127.0.0.1:8080/index/api/isRecording?secret=your_api_secret\ &type=1\ &vhost=__defaultVhost__\ &app=live\ &stream=camera01"5.4 录制文件目录结构/opt/record/ └── live/ └── camera01/ ├── 2026-02-27/ │ ├── 08-00-00.mp4 │ ├── 09-00-00.mp4 │ └── ...默认按 mp4MaxSecond 分片，每小时一个文件（3600秒）。5.5 录制文件回放MP4 文件可通过 HTTP 直接访问（需配置 http 根目录指向录制目录）：http://your-server:8080/record/live/camera01/2026-02-27/08-00-00.mp4六、多路监控批量接入多路摄像头用脚本批量拉流：#!/bin/bash SECRET="your_api_secret" SERVER="http://127.0.0.1:8080" cameras=( "camera01|rtsp://admin:pass@192.168.1.100:554/stream" "camera02|rtsp://admin:pass@192.168.1.101:554/stream" "camera03|rtsp://admin:pass@192.168.1.102:554/stream" ) for item in "${cameras[@]}"; do name="${item%%|*}" url="${item##*|}" echo "Adding stream: $name" curl -s "${SERVER}/index/api/addStreamProxy?secret=${SECRET}\ &vhost=__defaultVhost__\ &app=live\ &stream=${name}\ &url=${url}\ &rtp_type=0\ &enable_mp4=1" | python3 -m json.tool echo "" done七、WebHook 事件通知ZLMediaKit 支持 Webhook，在流上线/下线/录制完成时回调你的业务系统：[hook] enable=1 # 流上线通知 on_publish=http://your-backend/hook/publish # 流下线通知 on_stream_none_reader=http://your-backend/hook/no_reader # MP4 录制完成通知 on_record_mp4=http://your-backend/hook/record_done录制完成回调 payload 示例：{ "app": "live", "stream": "camera01", "file_path": "/opt/record/live/camera01/2026-02-27/08-00-00.mp4", "file_name": "08-00-00.mp4", "file_size": 104857600, "folder": "/opt/record/live/camera01/2026-02-27/", "start_time": 1740614400, "time_len": 3600, "url": "live/camera01" }八、WebRTC 低延迟播放8.1 为什么用 WebRTC 看监控传统监控大屏用 HLS 延迟通常 5~10 秒，HTTP-FLV 还得靠特殊播放器。WebRTC 能把延迟压到 500ms 以内，浏览器原生跑，适合监控大屏和移动端 H5 实时预览，双向通话也行。8.2 配置 WebRTCconfig.ini 中启用 WebRTC：[webrtc] # WebRTC 监听端口（UDP） port=8000 # 服务器公网 IP（必填，否则 ICE 协商失败） externIP=your.public.ip注意：externIP 是 WebRTC 能否正常工作的关键。内网部署填内网 IP，公网部署必须填公网 IP。8.3 播放 WebRTC 流ZLMediaKit 内置了一个 WebRTC 播放页面：# 浏览器直接打开 http://your-server:8080/webrtc.html?url=webrtc://your-server/live/camera01也可以用 JavaScript 调用 ZLMediaKit 的 WebRTC API 自行集成：// 1. 创建 RTCPeerConnection const pc = new RTCPeerConnection(); // 2. 获取 ZLMediaKit 的 SDP offer const response = await fetch('http://your-server:8080/index/api/webrtc?' + 'app=live&stream=camera01&type=play', { method: 'POST', body: new RTCSessionDescription(await pc.createOffer()).sdp }); // 3. 设置远端 SDP await pc.setRemoteDescription({ type: 'answer', sdp: await response.text() }); // 4. 绑定到 video 元素 pc.ontrack = (e) => { document.querySelector('video').srcObject = e.streams[0]; };8.4 WebRTC 推流（浏览器推流）ZLMediaKit 也支持从浏览器直接推流（无需 OBS）：http://your-server:8080/webrtc.html?url=webrtc://your-server/live/stream01&type=push九、常见问题Q: 摄像头 RTSP 拉流失败？确认摄像头 RTSP 地址正确，可先用 VLC 验证尝试切换 rtp_type=1（UDP）或 rtp_type=0（TCP）检查防火墙是否放行 554 端口Q: HLS 延迟高？调低 segDur（切片时长），如改为 1 秒减少 segNum（切片数量），如改为 2Q: MP4 录制文件损坏？不要直接 kill 进程，使用 API /index/api/kick_session 或正常停止服务确保磁盘空间充足Q: 流媒体鉴权？配置 [hook] on_play 和 on_publish Webhook，在业务后端做鉴权返回 allow/denyQ: WebRTC 播放黑屏/无法连接？检查 config.ini 的 externIP 是否填写了正确的公网 IP确认 UDP 8000 端口和媒体端口范围（10000-10100）已在防火墙放行WebRTC 要求 HTTPS 或 localhost，HTTP 下浏览器会拒绝访问摄像头（推流场景）Q: WebRTC 有延迟但比 HLS 好不了多少？检查是否走了 TURN 中转（可在浏览器 chrome://webrtc-internals 查看 ICE 候选）若服务器在内网/NAT 后面，需配置 TURN 服务器或确保 externIP 正确参考资料GitHub：https://github.com/ZLMediaKit/ZLMediaKit官方 Wiki：https://github.com/ZLMediaKit/ZLMediaKit/wikiREST API 文档：https://github.com/ZLMediaKit/ZLMediaKit/wiki/MediaServer支持的HTTP-API
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.example.MyClass # 反编译看源码 jad com.example.MyClass # 看类加载器 classloader紧急热更新有次线上出了个空指针，等不及走发布流程，就用 Arthas 热更新救急：# 1. 反编译获取源码 jad --source-only com.example.Service > Service.java # 2. 改完代码后编译 mc Service.java -d /tmp # 3. 重新加载 redefine /tmp/com/example/Service.class注意这只是临时方案，事后还是要正常发版。实时监控# 仪表盘，显示线程、内存、GC dashboard # 监控方法调用统计 monitor -c 5 com.example.Service method # 看调用栈 stack com.example.Service method高级用法Web Console不想用命令行，可以用浏览器：java -jar arthas-boot.jar --http-port 8563 # 访问 http://localhost:8563远程诊断java -jar arthas-boot.jar --tunnel-server 'ws://tunnel-server:7777/ws'批量执行命令cat > commands.txt << EOF dashboard thread -n 3 memory EOF java -jar arthas-boot.jar -c commands.txt生产环境注意事项按需启动别在镜像里默认启动 Arthas，用环境变量控制：if [ "$(curl -s http://config-server/arthas/enable)" = "true" ]; then java -jar arthas-boot.jar & fi安全加固# 限制访问 IP java -jar arthas-boot.jar --target-ip 127.0.0.1 # 设置认证 java -jar arthas-boot.jar --username admin --password secret资源限制Arthas 本身也吃资源，用的时候注意：高峰期别长时间跑 trace、watch用 -n 限制输出次数诊断完及时 stop 或 shutdown保存诊断结果# 保存到文件 trace com.example.Service method > /tmp/trace.log # 用 tt 命令记录调用 tt -t com.example.Service method tt -i 1000常见问题Arthas attach 失败检查 JVM 参数：-Djdk.attach.allowAttachSelf=trueDocker 容器中无法使用容器权限不够：docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined ...命令执行后没输出可能是条件表达式不匹配，去掉条件试试：watch com.example.Service method "{params,returnObj}"最后说两句Arthas 确实好用，但别把它当监控系统用。开发环境多练练手，生产环境按需启动，诊断完就退出。我的习惯是：平时结合监控告警快速定位问题遇到紧急情况才上 Arthas诊断完立即保存结果，然后退出释放资源热更新只用来救急，事后一定要正常发版记住，Arthas 是诊断工具，不是常驻服务。
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 工具、接口查询用。按具体业务场景定制，结构贴近前端使用，通常是聚合度最高的一层。命名以 ads_ 开头，体现具体业务报表：ads_daily_gmv_report # 日GMV报表 ads_user_retention_report # 用户留存报表 ads_new_user_funnel # 新用户转化漏斗比如日 GMV 报表：-- ads_daily_gmv_report dt | gmv | order_count | pay_user_count | avg_order_amount 2026-02-27 | 10000.00 | 320 | 280 | 31.25数据流转全链路示例以"统计昨日各城市 GMV"为例，完整链路如下：1. ODS 入仓-- 从 MySQL 同步原始订单 INSERT INTO ods_mysql_order_di SELECT * FROM mysql_source.t_order WHERE date(create_time) = '2026-02-27';2. DWD 清洗-- 清洗、标准化、关联维度 INSERT INTO dwd_order_detail_di SELECT o.order_id, o.user_id, CASE o.status WHEN 2 THEN '已付款' WHEN 3 THEN '已退款' END AS status_name, o.amount, u.city_name, DATE(o.create_time) AS dt FROM ods_mysql_order_di o LEFT JOIN dim_user_info_full u ON o.user_id = u.user_id WHERE o.dt = '2026-02-27' AND o.status = 2;3. DWS 汇总-- 按城市聚合 INSERT INTO dws_region_gmv_1d SELECT city_name, dt, SUM(amount) AS gmv, COUNT(1) AS order_count FROM dwd_order_detail_di WHERE dt = '2026-02-27' GROUP BY city_name, dt;4. ADS 输出-- 生成报表数据 INSERT INTO ads_city_gmv_report SELECT city_name, dt, gmv, order_count FROM dws_region_gmv_1d WHERE dt = '2026-02-27' ORDER BY gmv DESC;常见问题分层一定要这么多吗？小团队数据量不大时，可以简化为三层：ODS → DWD → ADS，跳过 DWS。但随着业务复杂度增加，DWS 能显著减少重复计算。DWD 和 DWS 的边界在哪？DWD 有明细行，一行代表一个业务事件（一笔订单、一次点击）；DWS 已经聚合过了，一行代表一个统计周期的汇总结果。维度表放哪层？维度表通常单独放在 DIM 层或归入 DWD 层管理，不参与 ODS→DWS 的加工链路，供各层 JOIN 使用。数据怎么跑？分层数据通常用调度工具按依赖顺序跑任务，常见工具：工具特点Apache DolphinScheduler开源，国内用得多Apache Airflow功能全，社区大DataWorks阿里云托管，配合 MaxComputexxl-job轻量，Java 技术栈常用总结层次英文名核心职责数据粒度ODSOperational Data Store原样同步源数据原始行DIMDimension维度数据管理实体快照DWDData Warehouse Detail清洗标准化业务事件行DWSData Warehouse Summary主题聚合宽表统计周期行ADSApplication Data Store业务报表输出指标结果行搭数据仓库不难，难的是把每层的职责想清楚。先定好分层，再落技术选型，比一上来就堆 SQL 要稳得多。
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 # 重启后重新加载模块 modprobe wireguard云服务器配置1. 安装 Docker 和 Docker Compose# 安装 Docker yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker systemctl start docker systemctl enable docker # 安装 Docker Compose curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose2. 创建 WireGuard 目录mkdir -p /opt/wireguard cd /opt/wireguard3. 创建 docker-compose.ymlnano docker-compose.ymlversion: "3.8" services: wireguard: image: linuxserver/wireguard:latest container_name: wireguard cap_add: - NET_ADMIN - SYS_MODULE environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai - SERVERURL=<云服务器公网IP> # 改成你的云服务器公网 IP - SERVERPORT=51820 - PEERS=5 # 客户端数量 - PEERDNS=223.5.5.5 # 阿里 DNS - INTERNAL_SUBNET=10.0.0.0/24 - ALLOWEDIPS=0.0.0.0/0 - LOG_CONFS=true volumes: - ./config:/config - /lib/modules:/lib/modules:ro ports: - "51820:51820/udp" sysctls: - net.ipv4.conf.all.src_valid_mark=1 - net.ipv4.ip_forward=1 restart: unless-stopped4. 启动服务# 启动容器 docker-compose up -d # 查看日志 docker-compose logs -f5. 修改服务器配置# 编辑服务器配置 nano ./config/wg0.conf关键修改：给 peer2 添加内网路由权限[Interface] Address = 10.0.0.1 ListenPort = 51820 PrivateKey = <服务器私钥> PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE [Peer] # peer1 PublicKey = <peer1公钥> PresharedKey = <peer1预共享密钥> AllowedIPs = 10.0.0.2/32 [Peer] # peer2 - 公司内网网关（⚠️ 重要：必须添加内网网段） PublicKey = <peer2公钥> PresharedKey = <peer2预共享密钥> AllowedIPs = 10.0.0.3/32, 192.168.3.0/24 # 添加内网网段 [Peer] # peer3 - Mac 客户端 PublicKey = <peer3公钥> PresharedKey = <peer3预共享密钥> AllowedIPs = 10.0.0.4/32 [Peer] # peer4 PublicKey = <peer4公钥> PresharedKey = <peer4预共享密钥> AllowedIPs = 10.0.0.5/32 [Peer] # peer5 PublicKey = <peer5公钥> PresharedKey = <peer5预共享密钥> AllowedIPs = 10.0.0.6/32⚠️ 核心配置说明：AllowedIPs = 10.0.0.3/32, 192.168.3.0/24 - 这一行至关重要！服务器需要知道 192.168.3.0/24 网段通过 peer2 (10.0.0.3) 转发没有这个配置，其他客户端无法访问公司内网6. 重启容器docker-compose restart # 验证配置 docker-compose exec wireguard wg show公司内网配置前提条件✅ CentOS 7 已升级到内核 6.6.12+✅ 服务器能访问外网✅ 能访问公司内网 192.168.3.0/241. 创建 WireGuard 目录mkdir -p /root/company-vpn cd /root/company-vpn2. 创建配置目录mkdir -p config/wg_confs3. 创建 WireGuard 配置文件nano config/wg_confs/wg0.conf[Interface] PrivateKey = <peer2的私钥> # 从云服务器 config/peer2/peer2.conf 获取 Address = 10.0.0.3/24 DNS = 223.5.5.5 # 重要：启用 IP 转发和 NAT PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = <服务器公钥> # 从云服务器配置获取 PresharedKey = <peer2预共享密钥> Endpoint = <云服务器公网IP>:51820 # 直接连接云服务器 AllowedIPs = 10.0.0.0/24 # 允许转发 VPN 网段流量 PersistentKeepalive = 25⚠️ 配置要点：Address = 10.0.0.3/24 - 使用 /24 而不是 /32Endpoint - 必须是云服务器的公网 IP:51820AllowedIPs = 10.0.0.0/24 - 允许接收和转发其他 peer 的流量PostUp/PostDown - 启用 NAT，让内网流量能转发4. 创建 docker-compose.ymlnano docker-compose.ymlversion: "3.8" services: wireguard: image: linuxserver/wireguard:latest container_name: wireguard-company cap_add: - NET_ADMIN - SYS_MODULE environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - ./config:/config - /lib/modules:/lib/modules:ro sysctls: - net.ipv4.conf.all.src_valid_mark=1 - net.ipv4.ip_forward=1 - net.ipv4.conf.all.forwarding=1 network_mode: host # 使用 host 网络模式，便于访问宿主机内网 restart: unless-stopped5. 设置配置文件权限chmod 600 config/wg_confs/wg0.conf6. 启动服务# 启动容器 docker-compose up -d # 查看日志 docker logs wireguard-company -f # 查看 WireGuard 状态 docker exec wireguard-company wg show7. 验证连接# 1. 检查 WireGuard 状态 docker exec wireguard-company wg show # 期望输出（关键部分）： # peer: <服务器公钥> # endpoint: <云服务器IP>:51820 # allowed ips: 10.0.0.0/24 # latest handshake: X seconds ago ← 必须有这个 # transfer: X KiB received, X KiB sent ← 双向有数据 # 2. 测试 ping 云服务器 docker exec wireguard-company ping -c 4 10.0.0.1 # 3. 测试访问本地内网 docker exec wireguard-company ping -c 4 192.168.3.168客户端配置（Mac）方法 1：使用 Homebrew 安装（命令行）1. 安装 WireGuard# 安装 WireGuard 工具 brew install wireguard-tools2. 创建配置文件# 创建配置目录 sudo mkdir -p /opt/homebrew/etc/wireguard # 创建配置文件 sudo nano /opt/homebrew/etc/wireguard/wg0.conf3. 配置内容[Interface] PrivateKey = <你的Mac私钥> # 从云服务器 config/peer3/peer3.conf 获取 Address = 10.0.0.4/32 DNS = 223.5.5.5 [Peer] PublicKey = <服务器公钥> PresharedKey = <peer3预共享密钥> Endpoint = <云服务器公网IP>:51820 AllowedIPs = 10.0.0.0/24, 192.168.3.0/24 # 只路由 VPN 和内网流量 PersistentKeepalive = 25⚠️ AllowedIPs 配置说明：10.0.0.0/24, 192.168.3.0/24 - 只路由 VPN 和公司内网（推荐）0.0.0.0/0 - 所有流量走 VPN（可能与 Surge 等代理冲突）4. 设置权限sudo chmod 600 /opt/homebrew/etc/wireguard/wg0.conf5. 连接 VPN# 启动 WireGuard sudo wg-quick up wg0 # 查看状态 sudo wg show # 断开连接 sudo wg-quick down wg0方法 2：使用 App Store 安装（图形界面）注：需要使用国外的APPID打开 App Store，搜索 "WireGuard"安装官方 WireGuard 应用打开应用，点击 "Add Tunnel" → "Add Empty Tunnel"粘贴上面的配置内容点击 "Activate" 激活连接验证与测试1. 检查连接状态在 Mac 上# 查看 WireGuard 状态 sudo wg show # 期望输出： # interface: utun7 # public key: <你的公钥> # private key: (hidden) # listening port: xxxxx # # peer: <服务器公钥> # preshared key: (hidden) # endpoint: <云服务器IP>:51820 # allowed ips: 10.0.0.0/24, 192.168.3.0/24 # latest handshake: 10 seconds ago ← 必须有 # transfer: 1.2 KiB received, 2.3 KiB sent ← 双向有数据在云服务器上# 查看所有 peer 状态 docker-compose exec wireguard wg show # 应该看到 peer2 和 peer3 都在线 # 都有 endpoint、latest handshake 和双向 transfer在公司内网服务器上# 查看连接状态 docker exec wireguard-company wg show # 应该显示与云服务器的连接正常2. 测试连通性从 Mac 测试# 1. 测试云服务器 ping 10.0.0.1 # 2. 测试公司内网网关 ping 10.0.0.3 # 3. 测试公司内网设备 ping 192.168.3.168 ping 192.168.3.1 # 4. 使用 traceroute 查看路径 traceroute 192.168.3.168 # 期望路径： # 1 10.0.0.1 (云服务器) # 2 10.0.0.3 (公司内网网关) # 3 192.168.3.168 (目标设备)3. 完整链路测试# === Mac 终端 === # 持续 ping 测试稳定性 ping 192.168.3.168 # === 同时在另一个终端监控 === watch -n 2 'sudo wg show'常见问题排查问题 1：Mac 无法连接云服务器症状：transfer: 0 B received, X KiB sent 没有 latest handshake解决方法：检查云服务器防火墙# 在云服务器上确认端口开放 firewall-cmd --list-all firewall-cmd --add-port=51820/udp --permanent firewall-cmd --reload检查配置文件中的 Endpoint# Mac 配置文件中 Endpoint = <云服务器公网IP>:51820 # 确保 IP 正确重启 WireGuardsudo wg-quick down wg0 sudo wg-quick up wg0问题 2：能连接 VPN 但无法访问内网症状：ping 10.0.0.1 成功 ping 10.0.0.3 成功 ping 192.168.3.168 失败排查步骤：检查云服务器配置# peer2 的 AllowedIPs 必须包含内网 cat ./config/wg0.conf | grep -A 3 "peer2" # 应该看到： # AllowedIPs = 10.0.0.3/32, 192.168.3.0/24检查 peer2 是否在线# 在云服务器上 docker-compose exec wireguard wg show | grep -A 6 "<peer2公钥>" # 必须有 endpoint 和 latest handshake检查公司内网服务器能否访问内网# 在公司内网服务器上 docker exec wireguard-company ping 192.168.3.168检查 Mac 的 AllowedIPs# Mac 配置文件中 AllowedIPs = 10.0.0.0/24, 192.168.3.0/24 # 必须包含内网网段问题 3：peer2 无法连接云服务器症状：# 在公司内网服务器上 docker exec wireguard-company wg show # 显示 0 B received 或没有 latest handshake解决方法：检查 Endpoint 配置cat config/wg_confs/wg0.conf | grep Endpoint # 应该是： Endpoint = <云服务器公网IP>:51820 # 不是 127.0.0.1检查公司防火墙# 测试能否连接云服务器 nc -vuz <云服务器IP> 51820重启容器docker restart wireguard-company docker logs wireguard-company --tail=30问题 4：Surge 代理干扰症状：时通时断路由冲突解决方法：完全退出 Surge（不是暂停，是退出应用）修改 Mac 配置，只路由内网AllowedIPs = 10.0.0.0/24, 192.168.3.0/24 # 不要用 0.0.0.0/0重启 WireGuardsudo wg-quick down wg0 sudo wg-quick up wg0问题 5：CentOS 7 内核模块加载失败症状：modprobe: FATAL: Module wireguard not found解决方法：确认内核版本uname -r # 必须是 5.6+ 或 6.6.12+重新安装内核和 devel 包yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y reboot检查模块modprobe wireguard lsmod | grep wireguard问题 6：Docker 容器网络问题症状：容器无法访问宿主机内网IP 转发不生效解决方法：使用 host 网络模式# docker-compose.yml network_mode: host启用 IP 转发sysctls: - net.ipv4.ip_forward=1 - net.ipv4.conf.all.forwarding=1重启容器docker-compose down docker-compose up -d监控和维护实时监控连接状态# Mac 上 watch -n 2 'sudo wg show' # 云服务器上 watch -n 2 'docker-compose exec wireguard wg show' # 公司内网服务器上 watch -n 2 'docker exec wireguard-company wg show'日志查看# 云服务器 docker-compose logs -f wireguard # 公司内网 docker logs -f wireguard-company定期检查# 检查所有 peer 状态 docker-compose exec wireguard wg show # 关注： # 1. 是否有 latest handshake（超过 3 分钟说明连接断了） # 2. transfer 数据是否在增长 # 3. endpoint 是否正确总结关键配置点CentOS 7 必须升级内核到 6.6.12+云服务器 peer2 的 AllowedIPs 必须包含内网网段公司内网 peer2 的 Endpoint 必须是云服务器公网 IPMac 的 AllowedIPs 必须包含内网网段避免 Surge 等代理软件干扰架构优势✅ 无需 FRP，配置简单✅ 延迟低，性能好✅ 点对点加密，安全性高✅ 易于维护和排查注意事项⚠️ 确保云服务器防火墙开放 UDP 51820⚠️ 定期检查内核模块加载状态⚠️ 监控 peer2 连接状态（它是内网网关）⚠️ 备份配置文件和密钥
远程访问方案（一）：FRP端口转发与内网穿透
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 (running) ...1.6 配置防火墙# 如果使用 firewalld firewall-cmd --permanent --add-port=7000/tcp # frp 通信端口 firewall-cmd --permanent --add-port=7500/tcp # Web 管理端口 firewall-cmd --permanent --add-port=7001-7010/tcp # 服务映射端口 firewall-cmd --reload # 如果使用 ufw ufw allow 7000/tcp ufw allow 7500/tcp ufw allow 7001:7010/tcp # 如果使用 iptables iptables -A INPUT -p tcp --dport 7000 -j ACCEPT iptables -A INPUT -p tcp --dport 7500 -j ACCEPT iptables -A INPUT -p tcp --dport 7001:7010 -j ACCEPT service iptables save⚠️ 重要：还需要在云服务器控制台的安全组中开放这些端口！阿里云：控制台 → ECS → 安全组 → 配置规则 → 添加 腾讯云：控制台 → 云服务器 → 安全组 → 入站规则 → 添加1.7 验证服务端# 检查端口监听 netstat -tlnp | grep frps # 或 ss -tlnp | grep frps # 预期输出： # tcp 0.0.0.0:7000 LISTEN xxx/frps # tcp 0.0.0.0:7500 LISTEN xxx/frps # 访问 Web 管理界面 curl http://127.0.0.1:7500浏览器访问：http://你的云服务器IP:7500用户名：admin密码：admin_password_123步骤二：公司内网部署 frp 客户端2.1 下载 frp 客户端在公司内网服务器/电脑上操作：Linux:cd /opt 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 frpc /usr/local/bin/ chmod +x /usr/local/bin/frpc mkdir -p /etc/frpWindows:下载： https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_windows_amd64.zip解压到 C:\frp\2.2 配置 frp 客户端Linux:vim /etc/frp/frpc.tomlWindows: 创建 C:\frp\frpc.toml粘贴以下内容（修改你的实际信息）：# frp 客户端配置 serverAddr = "你的云服务器IP" # ⚠️ 改成你的云服务器公网IP serverPort = 7000 auth.token = "your_secure_token_12345" # ⚠️ 与服务端一致 # 日志 log.to = "/var/log/frp/frpc.log" # Windows: C:\frp\frpc.log log.level = "info" # ===== 服务映射配置 ===== # MySQL 映射 proxies name = "mysql" type = "tcp" localIP = "192.168.1.100" # ⚠️ 改成你公司 MySQL 的内网IP localPort = 3306 remotePort = 7001 # 云服务器上的端口 # Redis 映射 proxies name = "redis" type = "tcp" localIP = "192.168.1.101" # ⚠️ 改成你公司 Redis 的内网IP localPort = 6379 remotePort = 7002 # Nacos 映射 proxies name = "nacos" type = "tcp" localIP = "192.168.1.102" # ⚠️ 改成你公司 Nacos 的内网IP localPort = 8848 remotePort = 7003 # Jenkins 映射（可选） proxies name = "jenkins" type = "tcp" localIP = "192.168.1.103" localPort = 8080 remotePort = 7004 # 如果本机就是服务器，localIP 可以填 127.0.0.12.3 启动客户端Linux (systemd):# 创建服务 cat > /etc/systemd/system/frpc.service <<'EOF' [Unit] Description=frp client After=network.target [Service] Type=simple ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml Restart=on-failure RestartSec=5s User=root [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start frpc systemctl enable frpc systemctl status frpcWindows:# 以管理员身份运行 PowerShell cd C:\frp .\frpc.exe -c frpc.toml # 或者注册为 Windows 服务（使用 NSSM 工具）2.4 验证连接在云服务器上检查：# 查看端口是否监听 netstat -tlnp | grep -E '7001|7002|7003' # 预期输出： # tcp 0.0.0.0:7001 0.0.0.0:* LISTEN xxx/frps # tcp 0.0.0.0:7002 0.0.0.0:* LISTEN xxx/frps # tcp 0.0.0.0:7003 0.0.0.0:* LISTEN xxx/frps # 测试连接 MySQL（如果映射了） telnet 127.0.0.1 7001 # 或 mysql -h 127.0.0.1 -P 7001 -u root -p查看 frp Web 管理界面： 访问 http://你的云服务器IP:7500，应该能看到客户端已连接，以及映射的服务列表。
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 命令） timeout 30 tcpdump -i eth0 -nn -w /tmp/capture.pcap # 按文件大小切割：每 10MB 生成新文件 tcpdump -i eth0 -nn -C 10 -w /tmp/cap.pcap7. 分析已有的 pcap 文件# 读取并显示 tcpdump -r /tmp/capture.pcap # 读取时加过滤 tcpdump -r /tmp/capture.pcap port 80 # 详细输出 tcpdump -r /tmp/capture.pcap -nn -vv实战：排查 TCP 连接问题以访问某服务（如 10.0.0.5:8080）失败为例：tcpdump -i eth0 -nn 'host 10.0.0.5 and port 8080'常见现象与含义：现象说明只有 SYN，没有 SYN-ACK服务端未监听该端口，或防火墙拦截有 SYN-ACK，但随即 RST服务端拒绝连接有 ACK，但数据迟迟不来服务端处理慢，可能是性能问题出现大量重传（Retransmission）网络丢包严重读懂 tcpdump 输出一行典型输出：14:23:01.234567 IP 192.168.1.10.52341 > 10.0.0.1.80: Flags [S], seq 1234567890, win 65535, length 0字段解释：14:23:01.234567 — 时间戳（精确到微秒）IP — 网络层协议192.168.1.10.52341 — 源 IP:端口10.0.0.1.80 — 目标 IP:端口Flags [S] — TCP 标志位seq — 序列号win — 窗口大小length — 数据载荷长度TCP Flags 对照表：标志含义[S]SYN（建立连接）[S.]SYN-ACK[.]ACK[P.]PSH+ACK（推送数据）[F.]FIN（正常关闭）[R]RST（强制重置）配合 Wireshark 深度分析命令行查看终究不够直观，生产环境通常的做法是：在服务器上用 tcpdump 将数据包保存为 .pcap 文件将文件传输到本地用 Wireshark 打开进行可视化分析# 服务器端抓包 tcpdump -i eth0 -nn -w /tmp/capture.pcap # 传输到本地（Mac/Linux） scp user@server:/tmp/capture.pcap ~/Downloads/Wireshark 有以下实用功能：Follow TCP Stream：还原完整 TCP 会话，一键查看完整 HTTP 请求响应Statistics → IO Graph：流量图，一眼看出流量波峰Expert Info：自动标注重传、乱序、连接拒绝等异常过滤语法：http.request.method == "POST" 等高级过滤权限说明tcpdump 默认需要 root 权限，因为需要访问原始套接字：sudo tcpdump -i eth0如果不想每次都用 sudo，可以将 tcpdump 二进制设置 capabilities：sudo setcap cap_net_raw,cap_net_admin=eip $(which tcpdump)之后普通用户即可直接运行 tcpdump（注意评估安全风险）。常用命令速查# 查看所有网卡 tcpdump -D # 抓取所有流量（不推荐在繁忙服务器用） tcpdump -i any -nn # 抓 HTTP 请求并显示内容 tcpdump -i eth0 -A -nn port 80 # 抓取与某 IP 的通信并保存 tcpdump -i eth0 -nn -w cap.pcap host 10.0.0.1 # 读取 pcap 文件 tcpdump -r cap.pcap -nn -v # 抓包同时输出到文件和终端 tcpdump -i eth0 -nn -l | tee /tmp/cap.txt小结tcpdump 是网络排查的瑞士军刀。掌握它的核心用法后，结合 Wireshark 做可视化分析，几乎能应对所有网络层面的问题定位。建议：日常先用 -nn 避免 DNS 解析拖慢输出线上抓包务必加 -w 保存文件，再离线分析过滤表达式越精确越好，减少无关噪音结合 ss、netstat、ping、traceroute 综合判断
Linux 网络三剑客：路由、防火墙与网卡管理实战
AI摘要 本文详细介绍了Linux网络管理的三个核心部分：网卡管理、路由管理和防火墙管理。文章从查看状态到实际配置，提供了详细的命令和配置示例，包括如何查看和配置网卡信息、管理路由表、设置IP转发、使用iptables和firewalld进行防火墙管理等。最后，文章还提供了一个实战案例，展示了如何搭建一个NAT网关，以及一些常用的网络诊断命令。 此内容根据文章生成，仅用于文章内容的解释与总结 掌控你的 Linux 网络：路由、防火墙与网卡深度实战配一台新服务器，大概率要碰这三件事：网卡没 IP、路由不通、端口被防火墙挡住。本文把这三块集中梳理一遍，从查看状态到实际配置，顺带捎上诊断思路。一、网卡管理查看网卡信息# 查看所有网卡（包含详细信息） ip addr show # 简写 ip a # 查看特定网卡 ip addr show eth0 # 传统命令（部分发行版已不预装） ifconfig ifconfig eth0输出示例解读：2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP link/ether 52:54:00:ab:cd:ef brd ff:ff:ff:ff:ff:ff inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0 inet6 fe80::5054:ff:feab:cdef/64 scope linkUP — 网卡已启用mtu 1500 — 最大传输单元，超出会分片inet — IPv4 地址及子网掩码link/ether — MAC 地址启用 / 禁用网卡# 启用 ip link set eth0 up # 禁用 ip link set eth0 down配置 IP 地址# 临时添加 IP（重启失效） ip addr add 192.168.1.200/24 dev eth0 # 删除 IP ip addr del 192.168.1.200/24 dev eth0持久化配置因发行版而异：# Ubuntu/Debian — 编辑 Netplan 配置 vim /etc/netplan/00-installer-config.yamlnetwork: ethernets: eth0: addresses: - 192.168.1.100/24 gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114] version: 2netplan apply# CentOS/RHEL — 编辑网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-eth0BOOTPROTO=static ONBOOT=yes IPADDR=192.168.1.100 PREFIX=24 GATEWAY=192.168.1.1 DNS1=8.8.8.8systemctl restart NetworkManager网卡统计信息# 查看收发包数量、错误、丢包 ip -s link show eth0 # 实时监控网卡流量 watch -n 1 cat /proc/net/dev # 使用 sar（需安装 sysstat） sar -n DEV 1 5网卡绑定（Bonding）多网卡绑定可实现链路冗余或带宽聚合：# 加载 bonding 模块 modprobe bonding # 查看绑定状态 cat /proc/net/bonding/bond0二、路由管理路由原理路由表决定数据包从哪个接口出去、下一跳是谁。匹配规则是最长前缀匹配——子网掩码越长越优先。查看路由表# 现代方式 ip route show # 简写 ip r # 传统方式 route -n netstat -rn输出示例：default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100 metric 100 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 10.0.0.0/8 via 10.0.0.1 dev eth1default — 默认路由（0.0.0.0/0），找不到匹配时走这里via — 下一跳网关dev — 出口网卡metric — 路由优先级，值越小优先级越高添加 / 删除路由# 添加静态路由 ip route add 10.10.0.0/16 via 192.168.1.254 dev eth0 # 添加默认路由 ip route add default via 192.168.1.1 # 删除路由 ip route del 10.10.0.0/16 # 修改路由（先删后加，或用 replace） ip route replace 10.10.0.0/16 via 192.168.1.1策略路由（多路由表）服务器有多块网卡、需要按来源地址选不同出口时，用策略路由。# 查看路由规则 ip rule show # 创建自定义路由表（编辑 /etc/iproute2/rt_tables 添加 200 custom） echo "200 custom" >> /etc/iproute2/rt_tables # 在自定义表中添加路由 ip route add default via 10.0.0.1 table custom # 添加策略：来自 10.0.0.0/24 的包走 custom 表 ip rule add from 10.0.0.0/24 table custom priority 100开启 IP 转发Linux 默认不转发数据包。让它当路由器，需要手动开启 IP 转发：# 临时开启 echo 1 > /proc/sys/net/ipv4/ip_forward # 或 sysctl -w net.ipv4.ip_forward=1 # 持久化（重启生效） echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p路由追踪诊断# 经典 traceroute traceroute 8.8.8.8 # 更现代，同时测试 ICMP/UDP/TCP mtr 8.8.8.8 # 查看数据包到目标会走哪条路由 ip route get 8.8.8.8三、防火墙管理Linux 防火墙的底层是内核的 Netfilter 框架，用户空间工具有三代：工具内核机制适用场景iptablesNetfilter (iptables)传统，兼容性最好nftablesNetfilter (nftables)新一代，替代 iptablesfirewalld封装 nftables/iptablesRHEL/CentOS 默认，zone 模型ufw封装 iptablesUbuntu 默认，更简洁iptables基本概念Table（表）：filter（默认）、nat、mangle、rawChain（链）：INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTINGRule（规则）：匹配条件 + 动作（ACCEPT/DROP/REJECT/LOG）数据包流向：入站：网卡 → PREROUTING → 路由判断 → INPUT → 本地进程 转发：网卡 → PREROUTING → 路由判断 → FORWARD → POSTROUTING → 出口网卡 出站：本地进程 → OUTPUT → POSTROUTING → 网卡常用命令# 查看规则（-n 不解析域名，-v 显示计数，--line-numbers 显示行号） iptables -L -n -v --line-numbers # 查看 NAT 表 iptables -t nat -L -n -v # 允许 SSH（端口 22） iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许本地回环 iptables -A INPUT -i lo -j ACCEPT # 丢弃其他所有入站 iptables -A INPUT -j DROP # 删除规则（按行号） iptables -D INPUT 3 # 插入规则到指定位置 iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT # 清空所有规则 iptables -F # 保存规则（Debian/Ubuntu） iptables-save > /etc/iptables/rules.v4 # 保存规则（CentOS） service iptables saveNAT 配置# SNAT：内网机器通过服务器访问外网（源地址转换） iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE # DNAT：外网访问内网服务（端口映射） # 将外网 8080 端口映射到内网 192.168.1.10:80 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80firewalld（CentOS/RHEL 系）firewalld 使用 zone（区域）概念管理信任级别：# 查看状态 firewall-cmd --state # 查看默认 zone firewall-cmd --get-default-zone # 查看所有 zone 配置 firewall-cmd --list-all-zones # 查看当前 zone 规则 firewall-cmd --list-all # 开放端口（临时） firewall-cmd --add-port=8080/tcp # 开放端口（永久） firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload # 开放服务（预定义服务） firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent # 查看支持的服务列表 firewall-cmd --get-services # 移除端口 firewall-cmd --remove-port=8080/tcp --permanent # 端口转发 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent # 允许特定 IP 访问 firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept' --permanentufw（Ubuntu 系）# 查看状态 ufw status verbose # 启用 / 禁用 ufw enable ufw disable # 允许端口 ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp # 允许应用（预定义） ufw allow 'Nginx Full' # 拒绝端口 ufw deny 23/tcp # 允许来自特定 IP ufw allow from 192.168.1.0/24 # 允许特定 IP 访问特定端口 ufw allow from 10.0.0.5 to any port 3306 # 删除规则 ufw delete allow 8080/tcp # 默认策略 ufw default deny incoming ufw default allow outgoing四、综合实战：搭建 NAT 网关场景：一台服务器有公网网卡 eth0（1.2.3.4）和内网网卡 eth1（192.168.1.1），让内网机器通过它上网。# 1. 开启转发 sysctl -w net.ipv4.ip_forward=1 # 2. 配置 MASQUERADE（动态 SNAT） iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 3. 允许转发 iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT # 内网机器配置： # 网关设为 192.168.1.1 # DNS 设为 8.8.8.8五、常用诊断命令速查# 查看监听端口与连接 ss -tlnp # TCP 监听端口 ss -tulnp # TCP + UDP 监听端口 ss -s # 连接统计摘要 # 测试连通性 ping -c 4 8.8.8.8 curl -v telnet://192.168.1.1:22 # DNS 查询 dig google.com nslookup google.com # 查看 ARP 缓存 ip neigh show arp -n # 检查路由 ip route get 8.8.8.8 # 查看当前连接数 ss -s cat /proc/net/sockstat小结场景命令查看网卡 IPip addr查看路由表ip route添加静态路由ip route add开启 IP 转发sysctl -w net.ipv4.ip_forward=1iptables 查看规则iptables -L -n -vfirewalld 开放端口firewall-cmd --add-port --permanentufw 允许端口ufw allow 80/tcp追踪路由mtr / traceroute查看连接状态ss -tulnp网络配置就三个问题：数据包从哪来、往哪走、能不能过。想清楚这三点，路由、防火墙、网卡的配置就都通了。