ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WatchYourLAN 高级 ARP 扫描配置指南:IFACES、ARP_ARGS 与 ARP_STRS 实战详解

WatchYourLAN 高级 ARP 扫描配置指南:IFACES、ARP_ARGS 与 ARP_STRS 实战详解 WatchYourLAN 高级 ARP 扫描配置指南IFACES、ARP_ARGS 与 ARP_STRS 实战详解【免费下载链接】WatchYourLANLightweight network IP scanner written in Go. With notifications, history, export to Grafana项目地址: https://gitcode.com/GitHub_Trending/wa/WatchYourLANWatchYourLAN 是一款用 Go 编写的轻量级局域网 IP 扫描器核心扫描引擎是系统自带的arp-scan命令行工具。本指南围绕 docs/VLAN_ARP_SCAN.md 展开系统讲解 WatchYourLAN 向arp-scan传递参数的三种途径——IFACES、ARP_ARGS、ARP_STRS以及用于环境变量的ARP_STRS_JOINED并结合 arpscan.go、conf/read.go 等源码深入说明参数解析、扫描执行与结果归属的底层原理。读完本文你将掌握通过 Web GUI、配置文件与环境变量三种方式配置复杂 VLAN、docker0 网桥等多网段扫描的完整实战方案。一、参数体系总览三类参数如何拼装 arp-scan 命令WatchYourLAN 本身不实现 ARP 探测而是封装系统命令arp-scan。所有扫描参数最终都会拼装成arp-scan的 CLI 命令并在后台执行。根据 docs/VLAN_ARP_SCAN.md 的说明参数分为三类作用域完全不同参数是否必需作用范围默认命令形态IFACES必需指定参与扫描的网络接口列表arp-scan -glNx -I $ONE_IFACEARP_ARGS可选追加到每一个接口的扫描命令中arp-scan -glNx ARP_ARGS -I $ONE_IFACEARP_STRS可选完全独立于IFACES的额外扫描串arp-scan $ONE_STRINGARP_STRS_JOINED可选仅限环境变量方式写入ARP_STRS同ARP_STRS其中-g表示生成随机源 MAC 地址与-l冲突时自动切换、-l使用本机 MAC、-N不做 DNS 反向解析、-x以制表符分隔输出、-I指定接口。扫描命令的实际拼装逻辑见 arpscan.go当ARP_ARGS非空时执行arp-scan -glNx args -I iface否则执行arp-scan -glNx -I iface。这三类参数都可以通过 GUI、配置文件或环境变量设置但存在一条关键限制详见后文ARP_STRS只能通过 GUI 或配置文件设置环境变量如 docker-compose必须使用ARP_STRS_JOINED。二、IFACES必需的基础接口列表2.1 参数格式与来源IFACES是 WatchYourLAN 正常运行必需的变量可来自 Web GUI、配置文件或环境变量。它是一个用空格分隔的网络接口列表IFACES: enp4s0 wlxf4ec3892dd51上例中enp4s0是有线网卡wlxf4ec3892dd51是无线网卡WatchYourLAN 会依次对列表中的每个接口发起一次独立扫描。获取本机接口列表的常用命令ip link show # 或 netstat -i在 docker-compose.yml 中该参数以环境变量形式注入并明确标注为requiredenvironment: TZ: Asia/Novosibirsk # required: needs your TZ for correct time IFACES: enp4s0 wlxf4ec3892dd51 # required: 1 or more interface2.2 源码实现逐接口循环扫描从 arpscan.go 的Scan函数可以看出IFACES字符串会先按空格切分为切片然后逐接口调用scanIfaceif ifaces ! { p strings.Split(ifaces, ) for _, iface : range p { slog.Debug(Scanning interface iface) text scanIface(iface) foundHosts append(foundHosts, parseOutput(text, iface)...) } }注意 conf/read.go 中IFACES的默认值为空字符串这意味着不配置该变量时 WatchYourLAN 不会扫描任何接口——这正是它在 docker-compose 中标记为 required 的原因。2.3 默认扫描命令对于每个接口默认生成的扫描命令为arp-scan -glNx -I $ONE_IFACE$ONE_IFACE即IFACES列表中的单个接口名。三、ARP_ARGS附加参数作用于每个接口3.1 参数格式ARP_ARGS是可选变量同样可通过 GUI、配置文件或环境变量设置。它是arp-scan的附加参数会被应用到IFACES中的每一个接口。例如ARP_ARGS: -r 1实际生成的命令为arp-scan -glNx -r 1 -I $ONE_IFACE其中-r 1表示只重试一次。arp-scan的全部可用参数请查阅man arp-scan。3.2 源码实现附加参数全局生效scanIface 中的逻辑非常直白var arpArgs string func scanIface(iface string) string { var cmd *exec.Cmd if arpArgs ! { cmd exec.Command(arp-scan, -glNx, arpArgs, -I, iface) } else { cmd exec.Command(arp-scan, -glNx, -I, iface) } out, err : cmd.Output() ... }arpArgs是包级变量在Scan入口处由参数args赋值因此一次扫描周期内对所有接口生效。一个使用技巧将日志级别设为debugWatchYourLAN 会通过slog.Debug(cmd.String())输出实际拼装好的完整命令见 arpscan.go便于你核对参数是否按预期生效。日志级别本身由 restart-scan.go 的setLogLevel在每次重启扫描协程时根据LOG_LEVEL重新设定。四、ARP_STRSVLAN、docker0 与复杂网段的独立扫描4.1 设计动机解决 IFACES 的局限仅靠IFACES只能覆盖本机直连的接口。对于 VLAN 子网如10.0.107.0/24、Docker 默认网桥docker0、虚拟网桥virbr0等需要额外指定网段甚至 VLAN ID 的场景IFACES无能为力。为此 WatchYourLAN 引入了ARP_STRS。ARP_STRS是一组完整的arp-scan命令字符串。只要设置了它WatchYourLAN 就会发起一组与IFACES完全独立的扫描对列表中的每个字符串各执行一次arp-scan $ONE_STRING每个字符串必须包含你要传递给arp-scan的全部信息。例如扫描 VLAN 107 对应的子网arp-scan -gNx 10.0.107.0/24 -Q 107 -I eth0其中-Q 107即 VLAN ID。[!WARNING] 字符串的最后一个元素上例中的eth0会被 WatchYourLAN 设置为该批发现主机的Interface字段。因此强烈建议把接口名放在字符串末尾否则数据库中主机的接口归属会错乱。4.2 通过配置文件设置在配置文件config_v2.yaml中ARP_STRS以 YAML 列表形式书写arp_strs: - -gNx 172.17.0.1/24 -I docker0 - -glNx -I virbr0第一个字符串扫描 Docker 网桥网段172.17.0.1/24第二个字符串扫描虚拟网桥virbr0。注意两处-I都位于字符串末尾符合上一节的接口归属约定。4.3 通过 Web GUI 设置在 Web 界面的 Scan settings 面板中找到 Arp Strings 输入框一次填入一个字符串点击Save保存后页面会自动追加一个空输入框供你继续填写下一个字符串。前端实现见 frontend/src/components/Config/Scan.tsx使用 SolidJS 的For循环渲染已有的每个arpstrs输入框并在末尾固定渲染一个空输入框用于新增。点击 Save 会 POST 到/api/config_settings/后端 api/config.go 通过c.PostFormArray(arpstrs)收集全部同名表单值过滤掉空字符串后写入conf.AppConfig.ArpStrs随后调用conf.Write落盘并触发routines.ScanRestart()立即重启扫描。4.4 源码实现独立执行与接口归属提取ARP_STRS的执行走的是与IFACES完全不同的分支。scanStr 将整个字符串按空格拆分成参数数组后直接传给arp-scanfunc scanStr(str string) string { args : strings.Split(str, ) cmd : exec.Command(arp-scan, args...) ... }在 Scan 中扫描完IFACES后紧接着遍历strsfor _, s : range strs { slog.Debug(Scanning string s) text scanStr(s) p strings.Split(s, ) foundHosts append(foundHosts, parseOutput(text, p[len(p)-1])...) }注意p[len(p)-1]——这正是最后一个元素被用作接口名这一约定的源码出处。parseOutputarpscan.go按制表符切分arp-scan -x的输出将 IP、MAC、厂商信息Hw与接口名一起封装进models.Host结构体定义见 models/models.go。五、ARP_STRS_JOINED在 docker-compose 中注入 ARP_STRS5.1 为什么需要它ARP_STRS是列表类型而环境变量是扁平字符串无法直接表达字符串列表。因此 WatchYourLAN 提供了ARP_STRS_JOINED作为从 ENV 注入ARP_STRS的唯一途径。5.2 格式要求ARP_STRS_JOINED是用逗号分隔的字符串列表逗号前后不能有空格ARP_STRS_JOINED: -gNx 172.17.0.1/24 -I docker0,-gNx 10.0.107.0/24 -Q 107 -I eth0解析逻辑见 conf/read.go读取ARP_STRS_JOINED后直接按逗号切分覆盖config.ArpStrsjoined : viper.Get(ARP_STRS_JOINED).(string) if joined ! { config.ArpStrs strings.Split(joined, ,) }因此如果逗号后误留空格切分结果会带有前导空格导致arp-scan收到一个非法的参数如 -I最终扫描失败。务必保证逗号紧贴前后字符串不加空格。5.3 配置优先级与回写保护注意 conf/write.go 中的一行特殊处理viper.Set(ARP_STRS_JOINED, ) // Can be set only with ENV每当配置被写回文件时ARP_STRS_JOINED都会被置空——因为该变量只在环境变量中有意义。如果配置文件中同时存在arp_strs和ARP_STRS_JOINED环境变量则环境变量的优先级更高会覆盖文件中的arp_strs列表。5.4 docker-compose 完整示例version: 3 services: wyl: image: aceberg/watchyourlan network_mode: host restart: unless-stopped volumes: - ~/.dockerdata/wyl:/data/WatchYourLAN environment: TZ: Asia/Novosibirsk # required IFACES: enp4s0 # required ARP_STRS_JOINED: -gNx 172.17.0.1/24 -I docker0,-gNx 10.0.107.0/24 -Q 107 -I eth0使用network_mode: host可确保容器能看到宿主机全部网络接口与路由表这是扫描 VLAN 与 docker0 的前提条件。配置文件config_v2.yaml存放在挂载卷/data/WatchYourLAN下由 conf/start.go 在启动时读取。六、实战示例汇总以下示例均来自 docs/VLAN_ARP_SCAN.md可直接用于ARP_STRS_JOINED或ARP_STRS。6.1 扫描 VLAN 107ARP_STRS_JOINED: -gNx 10.0.107.0/24 -Q 107 -I eth0含义扫描10.0.107.0/24网段-Q 107指定 VLAN ID 为 107接口为eth0置于末尾。6.2 扫描 docker0 网桥ARP_STRS_JOINED: -gNx 172.17.0.1/24 -I docker0含义扫描 Docker 默认网桥docker0所在的172.17.0.1/24网段接口docker0位于末尾。6.3 组合使用逗号分隔无空格ARP_STRS_JOINED: -gNx 172.17.0.1/24 -I docker0,-gNx 10.0.107.0/24 -Q 107 -I eth0七、扫描结果如何进入数据库与告警链路理解参数配置后再看一下扫描结果的处理闭环见 routines/scan-routine.gostartScan每TIMEOUT秒默认 120 秒见 conf/read.go调用一次arp.Scan将三类参数一并传入扫描结果以MAC 地址为键构建映射foundHostsMap[fHost.Mac] fHostcompareHosts与数据库中当前在线的主机逐条比对仍在线的更新 IP、接口与时间戳已掉线的标记Now 0新出现的未知主机会触发notify.Unknown(fHost)通过 Shoutrrr 发送上线通知每条记录同时写入 history 表供历史曲线展示若启用了 InfluxDB 或 Prometheus 输出还会同步导出对应 backend/internal/influx/influx.go 与 backend/internal/prometheus/prometheus.go。这意味着ARP_STRS配置的 VLAN 或 docker0 网段一旦发现新设备同样会进入完整的在线状态跟踪、历史记录与告警流程与IFACES扫描的设备无差别对待。八、配置建议与排查清单先确认接口存在配置IFACES前用ip link show或netstat -i核对接口名拼写避免手误导致整轮扫描为空。接口放末尾所有ARP_STRS/ARP_STRS_JOINED字符串都把接口名放在最后一个参数位置否则主机记录会被错误归属到其他接口。逗号后不要有空格环境变量注入ARP_STRS_JOINED时严格遵守逗号分隔、无空格格式。开启 debug 日志验证将LOG_LEVEL设为debug在日志中核对每条实际执行的arp-scan命令是否与预期一致日志级别改动后需触发一次扫描重启GUI 中保存任意扫描设置即可见 Scan.tsx 的 Pressing Save button will trigger rescan 提示。权限要求arp-scan发送原始 ARP 报文通常需要 root 或相应能力CAP_NET_RAW请确保运行 WatchYourLAN 的进程具备该权限否则扫描输出为空arp-scan报错会被 check.IfError 捕获并返回空结果。依赖安装WatchYourLAN 依赖系统提供arp-scan与tzdata两个外部程序缺失任一都会导致扫描异常。【免费下载链接】WatchYourLANLightweight network IP scanner written in Go. With notifications, history, export to Grafana项目地址: https://gitcode.com/GitHub_Trending/wa/WatchYourLAN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表