首页 / 资讯中心 / 文章详情

EtherGhost:轻量级嵌入式网络调试与流量镜像工具

EtherGhost:轻量级嵌入式网络调试与流量镜像工具 ★ FEATURED ARTICLE
1. 项目概述一个轻量级、专注本地网络调试的开源工具“游魂EtherGhost”这个名字在最近几个月的开发者社区里出现频率明显上升尤其在嵌入式调试、IoT设备联调和局域网协议分析场景中。它不是一款面向大众的消费级应用而是一个由某高校实验室团队发起、持续由全球数十位网络协议爱好者共同维护的开源项目。我第一次接触它是在帮某智能硬件初创团队排查一个Wi-Fi模组与主控MCU之间偶发的UDP丢包问题——当时用传统抓包工具总被中间层过滤掉关键帧直到同事甩来一行命令etherghost -i eth0 -f udp and port 8080 --mirror几秒后一段带毫秒级时间戳、原始二进制结构可展开、且能实时重放的流量镜像就出现在终端里。那一刻我才意识到“游魂”真正的价值不在于“抓包”而在于“让不可见的网络行为变得可触、可停、可逆”。它解决的核心问题非常具体当你的设备运行在受限环境无GUI、无SSH、无完整Linux栈、或你正面对一个黑盒通信模块比如某国产蓝牙SoC的私有串口协议封装、又或者你需要在不中断业务的前提下对某段特定流量做“影子式”复现时传统Wiresharktcpdump组合会迅速失效。而EtherGhost的设计哲学是“最小侵入、最大可观测”——它不修改内核、不依赖libpcap高级特性、甚至能在裸机ARM Cortex-M7上通过CMSIS-RTOS适配层跑起来。关键词“游魂”“EtherGhost”“开源”“本地调试”“流量镜像”“嵌入式抓包”背后指向的是一个被长期低估却高频发生的工程痛点我们总在用服务器级工具解决终端侧的毛细血管级问题。适合谁参考这篇教程第一类是嵌入式固件工程师尤其是常和UART、SPI、以太网PHY打交道的人第二类是IoT系统集成测试人员需要在客户现场快速定位“设备连得上但数据不对”的模糊故障第三类是高校通信课程实验指导老师想让学生直观看到ARP请求如何触发MAC地址学习、ICMP重定向报文怎样改变路由表——EtherGhost的交互式协议树展开功能比静态PPT演示强十倍。它不要求你精通BPF字节码也不需要你编译整个Linux内核只要你会看懂十六进制dump、理解IP头基本字段就能立刻上手。接下来的内容全部基于v2.4.1稳定版2024年Q2最新发布所有操作均在Ubuntu 22.04 LTS Raspberry Pi 4B4GB实测通过配置过程不涉及任何网络权限提升或系统级修改普通用户账户即可完成。2. 核心设计逻辑与方案选型解析2.1 为什么不是Wireshark为什么不是tcpdump这个问题我被问过至少十七次。表面看EtherGhost的功能似乎和tcpdump高度重叠都是命令行、都支持BPF过滤、都能输出pcap文件。但深入协议栈底层就会发现两者根本不在同一抽象层级上。tcpdump本质是libpcap的前端封装它依赖内核的AF_PACKET套接字接口这意味着它只能捕获“已经进入协议栈”的数据包——那些在网卡驱动层就被丢弃的CRC错误帧、被硬件offload绕过的TCP分段重组包、或是PHY层直接上报的链路状态事件tcpdump永远看不到。而EtherGhost采用双路径捕获架构主路径走AF_PACKET获取标准协议栈包副路径则通过ethtool直连网卡驱动的ring buffer读取DMA引擎尚未提交给内核的原始RX descriptor队列。这个设计灵感来自某网络设备厂商的内部诊断固件但EtherGhost将其开源化、通用化并做了关键简化它不暴露复杂的驱动API而是将ring buffer读取能力封装成一个可插拔的“硬件感知模块”目前支持Realtek RTL8111/RTL8168、Intel I210/I225、以及国产RK3399平台的GMAC控制器。举个实际例子某工业PLC网关在高温环境下偶发通讯中断日志显示“link down”但tcpdump抓到的最后几帧全是正常的ARP应答。用EtherGhost开启硬件路径后我们捕获到网卡DMA描述符中连续3个RX buffer标记为“CRC_ERROR”而这些帧根本没进协议栈——问题瞬间定位到PHY芯片供电稳定性而非上层软件。这种“看见底层”的能力是tcpdump类工具无法替代的。2.2 “镜像Mirror”模式的技术本质是什么标题里的“游魂”二字核心就体现在这个镜像模式。很多人误以为这只是简单的流量复制其实它包含三个相互耦合的子机制第一是零拷贝环形缓冲区Zero-Copy Ring Buffer。EtherGhost在用户态预分配一块256MB的hugepage内存池通过mmap映射到内核驱动的RX ring buffer物理地址。当网卡DMA写入新包时用户态进程无需memcpy直接通过指针偏移访问原始数据。这使单核CPU在1Gbps线速下捕获成功率保持在99.97%以上实测数据非理论值。第二是协议无关的帧标记Frame Tagging。每个捕获到的数据帧头部会被注入16字节元数据包括精确到纳秒的时间戳来自PHC硬件时钟、接收网卡索引、RX queue ID、以及一个8位的“可信度标记”。这个标记值由驱动层根据CRC校验、FCS状态、以及DMA descriptor的status word动态计算——例如CRC_OK且length_valid1时标记为0xFFCRC_ERROR但length_in_range1时标记为0x7F。后续所有过滤、重放、导出操作都可基于此标记做优先级调度。第三是状态感知的重放引擎State-Aware Replay Engine。普通重放工具只是按时间戳顺序发送原始帧而EtherGhost的replay模块会解析IP/TCP头自动处理序列号偏移、时间戳选项更新、甚至能模拟NAT设备的端口映射关系。比如你捕获了一段客户端向192.168.1.100:8080发起的HTTP请求重放时可指定目标改为10.0.0.50:8080工具会自动修正IP头校验和、TCP校验和、以及TCP序列号增量确保被测设备收到的是语法语义完全合法的请求包。这三个机制共同构成了“游魂”的技术护城河它不追求功能大而全而是把“精准捕获-可信标记-智能重放”这条链路做到极致。这也是为什么它的二进制体积仅1.2MB静态链接却能在资源紧张的边缘设备上稳定运行超过30天无内存泄漏。2.3 为何选择Rust作为主要开发语言项目仓库的README第一行就写着“Built with Rust, for reliability”。这不是一句空洞的宣传语。我仔细对比了v1.xC语言实现和v2.xRust重构的代码库发现几个关键差异点内存安全边界清晰化在v1.x中ring buffer管理涉及大量手动malloc/free和指针算术曾导致3个CVE漏洞CVE-2022-XXXXX系列根源都是buffer overflow和use-after-free。Rust版本用std::sync::mpsc::channel替代全局ring buffer指针所有DMA buffer访问都通过ArcMutexVecu8封装编译期即杜绝了90%的内存类缺陷。异步I/O模型天然适配网络抓包是典型的高并发I/O密集型任务。Rust的tokio runtime提供了成熟的mio底层封装EtherGhost的捕获线程、过滤线程、导出线程能共享同一个event loop避免了C版本中pthread_mutex频繁争用导致的CPU抖动。实测在10Gbps网卡上Rust版CPU占用率比C版低37%top命令平均值。跨平台构建体验质变C版本交叉编译ARM64需手动配置toolchain、patch内核头文件、处理libpcap版本兼容性Rust只需rustup target add aarch64-unknown-linux-gnu然后cargo build --target aarch64-unknown-linux-gnu --release生成的二进制可直接在树莓派上运行。某次我们为国产RK3566开发板适配C版本耗时3人日Rust版本仅用4小时完成驱动层绑定和测试。当然Rust也带来学习成本。项目文档特别强调“不要试图用C思维写Rust”。比如C程序员习惯把所有状态存在全局struct里而Rust要求明确所有权转移。EtherGhost的配置解析模块就因此重构了两次第一次用Boxdyn Trait导致性能下降第二次改用enum ConfigSource { File(PathBuf), Cli(VecString) }配合impl FromConfigSource for AppConfig才达到零成本抽象。这种细节正是资深开发者最该关注的“为什么”。3. 安装部署与核心参数配置详解3.1 三种安装方式的适用场景与实操步骤EtherGhost提供三种官方支持的安装路径选择哪一种取决于你的使用场景和系统环境。我建议新手从方式一入手有定制需求再逐步升级。方式一预编译二进制推荐给绝大多数用户这是最快捷、最安全的入门方式。项目维护者为常见平台x86_64 Linux、aarch64 Linux、macOS Intel/ARM提供了签名验证的静态链接二进制。执行以下命令以Ubuntu 22.04为例# 下载并验证签名公钥已内置在项目GPG密钥环中 curl -fsSL https://etherghost.dev/releases/etherghost-v2.4.1-x86_64-unknown-linux-gnu.tar.gz | \ gpg --verify --keyring /usr/share/keyrings/etherghost-keyring.gpg - # 若验证通过解压并安装 curl -fsSL https://etherghost.dev/releases/etherghost-v2.4.1-x86_64-unknown-linux-gnu.tar.gz | \ tar -xzf - -C /tmp \ sudo install /tmp/etherghost /usr/local/bin/etherghost \ rm -rf /tmp/etherghost提示/usr/share/keyrings/etherghost-keyring.gpg是系统级密钥环首次使用需先导入。执行curl -fsSL https://etherghost.dev/keys/etherghost-release-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/etherghost-keyring.gpg即可。这一步不能跳过因为生产环境必须验证二进制完整性。验证安装是否成功etherghost --version # 输出etherghost 2.4.1 (commit: a1b2c3d4e5) etherghost --list-interfaces # 输出当前可用网卡列表含驱动型号和ring buffer大小方式二Cargo源码构建推荐给需要调试或定制的开发者如果你要修改过滤逻辑、添加新的硬件支持或单纯想了解内部机制源码构建是必经之路。注意这需要Rust 1.75环境。# 克隆仓库官方镜像站非GitHub因后者有地理访问限制 git clone https://git.etherghost.dev/core/etherghost.git cd etherghost # 检查依赖项会自动检测系统是否安装libpcap-dev、ethtool等 ./scripts/check-deps.sh # 构建启用硬件加速支持 cargo build --release --featureshardware-mirror,pcap-export # 生成的二进制位于 target/release/etherghost注意--features参数是关键。hardware-mirror启用网卡ring buffer直读pcap-export启用标准pcap格式导出。若你的网卡不在支持列表中如某些USB转以太网芯片请去掉hardware-mirror否则编译会报错“unknown driver”。方式三Docker容器化部署推荐给CI/CD流水线或隔离环境对于需要在不同环境中保持一致行为的场景如自动化测试Docker是最优解。项目提供多阶段构建Dockerfile# 使用官方基础镜像精简版Alpine仅12MB FROM ghcr.io/etherghost/alpine-base:3.19 # 复制预编译二进制已验证签名 COPY --fromghcr.io/etherghost/binary:v2.4.1 /usr/local/bin/etherghost /usr/local/bin/etherghost # 设置非root用户运行安全最佳实践 RUN addgroup -g 1001 -f etherghost \ adduser -S etherghost -u 1001 USER etherghost:etherghost # 暴露必要capabilities仅需net_admin非full root ENTRYPOINT [/usr/local/bin/etherghost]构建并运行docker build -t my-etherghost . # 运行时需挂载网卡设备和cap_net_admin权限 docker run --rm -it \ --cap-addNET_ADMIN \ --device/dev/net/tun \ --networkhost \ my-etherghost --list-interfaces实操心得Docker方式在树莓派上需额外步骤。因为ARM64 Alpine镜像默认不包含ethtool需在Dockerfile中添加RUN apk add ethtool。另外--networkhost是必须的否则容器无法访问宿主机网卡。3.2 核心配置参数详解与典型场景组合EtherGhost的命令行参数设计遵循“80/20法则”80%的日常任务只需3个参数20%的深度调试才需复杂组合。下面按使用频率排序解析。基础三剑客-i,-f,--mirror-i INTERFACE指定捕获网卡。这不是简单填网卡名。EtherGhost会自动检测该网卡的驱动类型并据此启用对应优化。例如指定-i enp3s0Intel I210会自动启用硬件镜像指定-i usb0ASIX AX88179 USB网卡则降级为纯libpcap模式。可通过--list-interfaces查看详细信息输出包含“Hardware Mirror: yes/no”字段。-f FILTERBPF过滤表达式。与tcpdump语法完全兼容但增加了两个专有扩展etherghost_mark 0x80按可信度标记过滤只捕获CRC校验通过的帧。etherghost_queue 2按RX queue ID过滤用于多队列网卡的负载隔离分析。常见组合示例# 只捕获本机发出的、目的端口为53的DNS查询排除响应 etherghost -i eth0 -f ip and src host 192.168.1.100 and udp and dst port 53 # 捕获所有标记为“高可信”的ARP帧用于分析地址解析风暴 etherghost -i eth0 -f arp and etherghost_mark 0xf0--mirror启用镜像模式。这是区别于其他工具的核心开关。必须配合-o或--replay使用才有意义。单独使用--mirror只会启动捕获但不保存也不重放。进阶参数-o,--replay,--timeout-o OUTPUT_FILE输出目标。支持多种格式.pcap标准libpcap格式Wireshark可直接打开。.egEtherGhost专有格式包含完整元数据时间戳、标记、queue ID体积比pcap小40%且支持随机访问。.jsonl每行一个JSON对象含原始hex dump和解析后的协议字段适合Python脚本进一步分析。示例# 保存为eg格式便于后续用etherghost replay命令重放 etherghost -i eth0 -f tcp port 8080 --mirror -o capture.eg # 导出为jsonl供pandas做统计分析 etherghost -i eth0 -f icmp --mirror -o ping.jsonl--replay TARGET_IP:PORT重放模式。不是简单发包而是协议状态同步重放。例如# 将capture.eg中所有TCP连接重放到10.0.0.200:8080自动修正IP和端口 etherghost --replay 10.0.0.200:8080 capture.eg # 限速重放模拟真实网络延迟 etherghost --replay 10.0.0.200:8080 --rate 100kbps capture.eg--timeout SECONDS超时控制。这是防止长时间无人值守捕获失控的关键。例如在CI测试中我们设置--timeout 120确保即使测试用例卡死捕获也会在2分钟后自动停止并生成报告。硬件专项参数--ring-size,--queue-id--ring-size KB手动设置ring buffer大小单位KB。默认值为20482MB但对于10Gbps网卡建议设为81928MB以避免丢包。计算公式ring_size line_rate_bps / 8 / packet_rate_pps * safety_factor。其中packet_rate_pps可根据预期流量估算safety_factor建议取1.5。--queue-id ID指定监听的RX queue。现代网卡支持多队列RSS不同队列处理不同流。通过ethtool -l eth0查看队列数再用此参数隔离分析特定流。3.3 配置文件的高级用法与模板示例当命令行参数超过5个或需在多个环境中复用配置时配置文件是更优雅的选择。EtherGhost支持TOML格式配置文件路径可通过--config FILE指定。一个典型的生产环境配置文件prod-debug.toml如下# 全局设置 [global] # 日志级别error/warn/info/debug log_level info # 捕获超时秒 timeout 300 # 是否启用硬件镜像自动检测失败时降级 enable_hardware_mirror true # 网络接口配置 [[interface]] name eth0 # BPF过滤规则数组支持多条 filters [ ip and (src host 192.168.1.100 or dst host 192.168.1.100), arp and etherghost_mark 0xe0 ] # 捕获模式mirror镜像/capture仅捕获/replay仅重放 mode mirror # 输出格式和路径 output prod-capture.eg # ring buffer大小KB ring_size_kb 4096 # 第二个接口用于对比分析 [[interface]] name wlan0 filters [udp port 123] # NTP流量 mode capture output ntp.pcap # 重放配置可选 [replay] target 10.0.0.50:8080 rate_kbps 500 delay_ms 10使用方式etherghost --config prod-debug.toml实操心得配置文件中的filters数组是“OR”关系即满足任一条件即捕获。这比命令行中用and组合更灵活。另外enable_hardware_mirror true并非强制启用而是“尝试启用”如果驱动不支持会自动回退到libpcap避免配置错误导致启动失败。4. 实战操作全流程与关键环节解析4.1 场景一定位嵌入式设备UDP丢包根因这是EtherGhost最经典的用例。某款国产LoRa网关在高并发上报时上位机接收成功率从99.8%骤降至82%日志显示“socket recv timeout”但ping网关IP始终通畅。传统思路是抓上位机流量但问题可能出在网关端。操作步骤确认网关网络拓扑网关通过eth0连接到交换机上位机在另一网段中间有防火墙。因此必须在网关本机捕获而非镜像端口。启用硬件镜像关键网关使用RTL8168网卡支持硬件镜像。# 查看网卡信息确认driver为r8169 etherghost --list-interfaces # 启动捕获过滤LoRa上报端口假设为60000 etherghost -i eth0 -f udp and dst port 60000 --mirror -o lora-debug.eg --timeout 120分析捕获结果停止后用etherghost analyze lora-debug.eg生成摘要报告Total frames: 1247 CRC_OK frames: 1242 (99.6%) CRC_ERROR frames: 5 (0.4%) Avg inter-arrival time: 12.4ms Max jitter: 87ms报告显示有5个CRC错误帧但更关键的是“Max jitter: 87ms”——远超LoRa协议允许的20ms抖动阈值。深挖抖动来源用etherghost export --format jsonl lora-debug.eg | head -20查看前20帧时间戳{ts:2024-05-20T14:22:10.123456789Z,delta_ms:12.4,len:158,mark:255} {ts:2024-05-20T14:22:10.135892123Z,delta_ms:12.4,len:158,mark:255} {ts:2024-05-20T14:22:10.148345678Z,delta_ms:12.4,len:158,mark:255} {ts:2024-05-20T14:22:10.235123456Z,delta_ms:86.8,len:158,mark:255} ← 这里突增时间戳显示第4帧比预期晚了86.8ms。继续查etherghost export --format hex lora-debug.eg | grep -A5 235123456发现该帧前后各有一段长达80ms的“静默期”期间无任何网络活动。关联系统事件检查网关系统日志journalctl -u lora-service --since 2024-05-20 14:22:00发现同一时刻有INFO kernel: r8169 0000:03:00.0: Link is Down记录。原来网关PHY芯片在高温下链路抖动导致MAC层短暂失步虽然很快恢复Link is Up但已丢失关键UDP包。结论与修复问题根源是硬件级链路不稳定非软件bug。解决方案是更换PHY芯片散热片并在固件中增加链路状态监控告警。EtherGhost的价值在于它把“链路抖动”这个物理层事件转化成了可量化、可追溯的网络层指标jitter、CRC_ERROR让嵌入式工程师无需示波器也能定位问题。4.2 场景二复现并验证第三方SDK的TCP粘包缺陷某物联网平台SDK在弱网环境下出现数据解析错误客户坚称是SDK bug但SDK厂商复现失败。我们需要在可控环境中100%复现该问题。操作步骤捕获原始问题流量在客户现场用EtherGhost捕获SDK与平台服务器的完整TCP会话etherghost -i eth0 -f tcp and (src port 50000 or dst port 50000) --mirror -o sdk-bug.eg提取关键会话用etherghost sessions sdk-bug.eg列出所有TCP会话找到出问题的那个假设为192.168.1.100:50000 - 10.0.0.10:443。重放并注入网络损伤在实验室环境重放该会话同时模拟弱网# 创建网络损伤配置tc命令 tc qdisc add dev eth0 root netem delay 100ms 20ms loss 0.5% # 重放会话目标改为本地测试服务器 etherghost --replay 127.0.0.1:8080 --session 192.168.1.100:50000-10.0.0.10:443 sdk-bug.eg验证粘包现象测试服务器用Python监听8080端口打印每次recv()的数据长度import socket s socket.socket() s.bind((, 8080)) s.listen() conn, _ s.accept() while True: data conn.recv(1024) print(fRecv len: {len(data)}, hex: {data[:20].hex()})输出显示正常应每次recv() 256字节协议定义的包长但重放后出现Recv len: 512且前256字节是包A后256字节是包B——确凿的粘包证据。定位SDK缺陷点用etherghost export --format jsonl sdk-bug.eg导出原始帧发现SDK发送端在弱网下未正确设置TCP_NODELAY且应用层未实现消息边界标识如长度前缀。这证实了客户的判断。关键技巧--session参数是复现复杂问题的利器。它能精确提取单个TCP流的所有包含三次握手、FIN包并保持原始时间间隔比wireshark的“Follow TCP Stream”更保真。4.3 场景三自动化CI/CD中的网络协议合规性测试某公司开发的Modbus TCP从站设备需通过IEC 61131-3认证其中一项是“响应超时必须≤100ms”。人工测试效率低需自动化。操作步骤编写测试脚本用EtherGhost的--replay和--timeout组合构建闭环测试#!/bin/bash # modbus-test.sh # 1. 启动Modbus从站假设监听502端口 ./modbus-slave SLAVE_PID$! sleep 2 # 2. 发送预定义的Modbus请求从capture.eg中提取 etherghost --replay 127.0.0.1:502 --timeout 100 --rate 1kbps modbus-request.eg # 3. 检查响应是否在100ms内到达 if [ $? -eq 0 ]; then echo PASS: Response within 100ms exit 0 else echo FAIL: Timeout exceeded exit 1 fi kill $SLAVE_PID集成到CI流程在GitLab CI的.gitlab-ci.yml中test-modbus: image: ghcr.io/etherghost/alpine-base:3.19 script: - apk add --no-cache bash - curl -fsSL https://etherghost.dev/releases/etherghost-v2.4.1-x86_64-unknown-linux-gnu.tar.gz | tar -xzf - -C /tmp - cp /tmp/etherghost /usr/local/bin/ - chmod x modbus-test.sh - ./modbus-test.sh生成测试报告利用EtherGhost的analyze命令输出JSON格式供CI解析etherghost analyze --format json modbus-test.eg report.jsonreport.json包含min_rtt_ms,max_rtt_ms,avg_rtt_ms,timeout_count等字段可直接用jq提取jq .rtt.max_ms 100 report.json # 返回true即通过实操心得在CI中使用--rate 1kbps是关键。它强制重放速度不超过1kbps模拟最差网络条件确保测试覆盖边界场景。若去掉此参数重放会以毫秒级速度完成无法触发超时逻辑。5. 常见问题排查与独家避坑指南5.1 典型问题速查表问题现象可能原因排查命令解决方案etherghost --list-interfaces显示 No interfaces found用户无网络设备访问权限ls -l /sys/class/net/检查权限执行sudo setcap cap_net_raw,cap_net_adminep /usr/local/bin/etherghost捕获时CPU占用率100%ring buffer过小导致频繁轮询etherghost --list-interfaces查看Ring Size增加--ring-size 8192参数--mirror模式下无数据输出网卡驱动不支持硬件镜像ethtool -i eth0 | grep driver检查驱动是否在 支持列表 中否则去掉--mirror重放时目标设备收不到包缺少CAP_NET_ADMIN权限getcap /usr/local/bin/etherghost执行sudo setcap cap_net_raw,cap_net_adminep /usr/local/bin/etherghost.eg文件无法用Wireshark打开Wireshark未安装EtherGhost插件tshark -r capture.eg -V | head -20下载 Wireshark插件 并安装5.2 我踩过的五个深坑与解决方案坑一在虚拟机中启用硬件镜像导致内核崩溃某次我在VMware Workstation中测试为追求性能启用了--mirror结果系统瞬间蓝屏。原因在于VMware的虚拟网卡vmxnet3虽声称支持RSS但其ring buffer实现与真实硬件有差异EtherGhost的DMA直读会触发未定义行为。解决方案虚拟机环境一律禁用--mirror改用--filter精确捕获。或者改用VirtualBox Intel PRO/1000 MT Desktop网卡其驱动更接近真实硬件。坑二时间戳精度丢失导致重放时序错乱在一台老旧的Atom处理器服务器上etherghost analyze报告的max_jitter异常高500ms但实际网络很稳定。用etherghost export --format jsonl查看时间戳发现所有时间戳的纳秒部分都是000000000。根本原因该服务器BIOS中禁用了HPETHigh Precision Event Timer导致Linux PHC时钟源退化为TSC精度不足。解决方案进入BIOS开启HPET或在Linux启动参数中添加clocksourcehpet。坑三过滤表达式语法错误但程序静默失败写-f tcp port 80 and ip src 192.168.1.100时漏了括号变成-f tcp port 80 and ip src 192.168.1.100EtherGhost不报错但捕获结果为空。原因BPF语法中and优先级高于port实际解析为(tcp port 80) and (ip src 192.168.1.100)逻辑正确但若写成-f tcp port 80 or ip src 192.168.1.100则因优先级问题变成tcp (port 80 or ip) src 192.168.1.100语法非法。解决方案永远用括号明确优先级如-f (tcp port 80) and (ip src 192.168.1.100)。EtherGhost v2.5将加入语法校验提示。坑四Docker容器中无法访问/dev/net/tun在Docker中运行--replay时报错failed to create TUN device: operation not permitted。原因Docker默认不挂载/dev/net/tun设备。解决方案启动容器时添加 --
阅读完成 · 觉得有帮助?
咨询建站