openwrt利用arp获取局域网设备IP

本文介绍了如何在OpenWRT系统中利用ARP协议来获取局域网内设备的IP地址。首先解释了ARP协议的基本概念,然后提供了一段Go语言代码示例,展示了如何清除ARP缓存并获取当前网络中的ARP信息,以此判断设备是否在线。需要注意的是,ARP信息可能存在缓存,因此在获取之前应先清除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

openwrt利用arp获取局域网设备IP


1. 前言

目前我们通过arp协议搜索局域网设备,根据局域网设备地址判断子设备是否在线(子设备ip为静态ip地址),所以这里简单总结一下arp的使用。

2. ARP概念

以下内容来自维基百科:

ARP:地址解析协议(英语:Address Resolution Protocol,缩写:ARP)是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议,它在IPv4中极其重要。ARP最初在1982年的RFC 826(征求意见稿)[1]中提出并纳入互联网标准STD 37。ARP也可能指是在多数操作系统中管理其相关地址的一个进程。

ARP是通过网络地址来定位MAC地址。 ARP已经在很多网路层和数据链接层之间得以实现,包括IPv4,Chaosnet, DECnet和Xerox PARC Universal Packet(PUP)使用IEEE 802标准, 光纤分布式数据接口, X.25, 帧中继异步传输模式(ATM),IEEE 802.3IEEE 802.11标准上IPv4占了多数流量。

IPv6邻居发现协议(NDP)用于代替地址解析协议(ARP)。

3. arp局域网搜索设备实现思路和代码

上面我们已经说过主要是通过配置子设备为静态ip,没有静态ip的话知晓设备mac地址也可以(这也是设备不要轻易泄露mac地址的原因,容易被嗅探)。然后通过arp信息对照ip或mac来确认设备是否在线,这里有个问题时arp的信息存在2分钟左右的缓存,所以为了防止查找出的信息为缓存信息,我们可以清除缓存之后等待一段时间再获取arp信息,代码如下(不同系统和设备可能有差异,这里以openwrt为主):

package main

import (
	"bufio"
	"os/exec"
	"strings"
	"time"

	"github.com/wonderivan/logger"
)

func main() {
	//这里的设备名称可通过ifconfig查找
	GetLANDevIP("eth0")
}

func GetLANDevIP(devName string) ([]string, error) {
	//清除对应设备的arp缓存
	cmd := exec.Command("ip", "neigh", "flush", "dev", devName)
	output, err := cmd.CombinedOutput()
	if err != nil {
		logger.Error(err)
		return nil, err
	}

	time.Sleep(time.Second * time.Duration(5))
	//目前openwrt上似乎不是安装的arp命令,而是软链接的查看该文件,所以arp命令实际上应该是如下内容
	cmd = exec.Command("cat", "/proc/1/net/arp")
	output, err = cmd.Output()
	if err != nil {
		logger.Error(err)
		return nil, err
	}
	logger.Debug(string(output))

	var res []string
	scanner := bufio.NewScanner(strings.NewReader(string(output)))
	for scanner.Scan() {
		logger.Debug(scanner.Text())
		if strings.Contains(scanner.Text(), devName) {
			tmp := strings.Split(scanner.Text(), " ")
			res = append(res, tmp[0])
		}
	}
	return res, nil
}

编译运行于openwrt后结果如下:

在这里插入图片描述

<think>好的,用户之前已经检了UPnP、LLDP和ICMP检测服务,发现它们都没有开启,甚至DHCP也没开。现在用户想知道,除了这些之外,OpenWrt还可能主动与其他设备通信的原因是什么。我需要帮他找出其他可能的原因。 首先,我得回忆一下OpenWrt有哪些常见的服务或功能可能导致主动通信。用户提到的DHCP没开,可能是指DHCP服务器未开启,但可能还有其他服务。比如,mDNS(Avahi)服务,用于局域网内的服务发现,默认情况下可能运行。还有NTP客户端,用来同步时间,可能会向外部服务器发送请求。另外,DNS转发器如dnsmasq即使没有DHCP,也可能进行DNS询。 然后,用户可能还安装了其他插件,比如DDNS(动态DNS)客户端,定期更新IP地址。或者有软件包自动更新检,虽然这可能不会直接与其他设备通信,但会连接外部服务器。还有像Samba或FTP这样的文件共享服务,如果开启的话,会主动广播自己的存在。 另外,考虑默认的防火墙规则是否允许某些通信。比如,OpenWrt默认允许来自局域网的某些流量,可能设备在响应ARP请求或者其他二层协议。还有可能是有流氓设备伪装成网关,但这种情况可能性较低,属于安全威胁。 用户之前检了crontab,但可能还有其他定时任务或者脚本在运行,比如备份脚本或者自定义的监控脚本。此外,检系统日志(logread)可能会发现一些线索,比如未知的连接尝试或服务活动。 还要考虑IPv6相关的服务,比如路由器通告(RA)或者DHCPv6,即使用户关闭了IPv4的DHCP,IPv6可能仍然活跃。另外,像SSH或HTTP管理界面如果暴露在局域网,可能会有心跳包或保持活动的连接。 最后,用户可能没有提到的其他服务,比如UPnP的IPv6版本,或者某些厂商特定的服务。此外,检进程列表(ps命令)可能会发现一些后台进程,比如dropbear(SSH)、uhttpd(Web服务器)等,这些服务虽然不主动通信,但会响应请求,但如果是主动通信的话,可能需要进一步排。 总结下来,可能的点包括:mDNS/NTP/DNS转发、DDNS、软件包更新、IPv6服务、已安装的插件或服务、定时任务、系统日志中的异常、防火墙规则、以及ARP等二层通信。需要逐一检这些方面,帮助用户定位问题。</think>--- ### **OpenWrt 主动通信的潜在原因分析** 即使 UPnP、LLDP、ICMP 检测和 DHCP 均未启用,OpenWrt 仍可能因以下原因主动与其他设备通信: --- #### **1. 服务发现协议** - **mDNS/Avahi**(多播 DNS): 用于局域网设备发现(如打印机、智能家居设备)。 **检测方法**: ```bash ps | grep avahi # 检进程 uci get avahi-daemon.enabled # 看配置状态 ``` **关闭方法**: ```bash /etc/init.d/avahi-daemon stop uci set avahi-daemon.enabled=0 uci commit ``` - **SSDP**(简单服务发现协议): 部分插件可能依赖此协议,即使 UPnP 关闭也可能残留。 **检测方法**: ```bash tcpdump -i br-lan udp port 1900 # 抓取 SSDP 广播流量 ``` --- #### **2. 系统维护行为** - **NTP 时间同步**: OpenWrt 默认通过 NTP 同步时间,可能向外部服务器发送请求。 **检测方法**: ```bash cat /etc/ntp.conf # 看 NTP 服务器配置 logread | grep ntp # 检时间同步日志 ``` **关闭方法**: ```bash /etc/init.d/sysntpd stop uci set system.ntp.enabled=0 uci commit ``` - **DNS 转发询**: 即使 DHCP 关闭,`dnsmasq` 仍可能响应 DNS 请求并向上游服务器询。 **检测方法**: ```bash netstat -nulp | grep :53 # 检 DNS 服务端口 ``` **关闭方法**: ```bash uci set dhcp.@dnsmasq[0].port=0 # 禁用 DNS 服务 uci commit /etc/init.d/dnsmasq restart ``` --- #### **3. 已安装插件或后台服务** - **动态 DNS (DDNS)**: 若安装了 `luci-app-ddns`,会定期向 DDNS 提供商发送更新请求。 **检测方法**: ```bash opkg list-installed | grep ddns crontab -l | grep ddns ``` **关闭方法**: ```bash /etc/init.d/ddns stop uci set ddns.@service[0].enabled=0 uci commit ``` - **流量监控插件**(如 `nlbwmon`): 可能通过 SNMP 或自定义协议收集数据。 **检测方法**: ```bash ps | grep nlbwmon uci get nlbwmon.@collector[0].enabled ``` --- #### **4. 底层网络协议** - **IPv6 相关服务**: - **路由器通告 (RA)**: IPv6 默认发送 RA 报文,用于地址自动配置。 **检测方法**: ```bash uci get network.lan.ra ``` **关闭方法**: ```bash uci set network.lan.ra='disabled' uci commit /etc/init.d/network restart ``` - **DHCPv6**: 独立于 DHCPv4,需单独关闭。 ```bash uci set dhcp.lan.dhcpv6=disabled ``` - **ARP 协议**: OpenWrt 作为网关会主动发送 ARP 响应,维护局域网 ARP 表。 **特性**:此为正常二层通信,无法禁用。 --- #### **5. 隐蔽后台进程** - **厂商定制服务**: ImmortalWrt 等改版可能集成额外服务(如 `omcproxy` 用于组播代理)。 **检测方法**: ```bash ps | grep -E "omcproxy|uqmi|modemmanager" # 检冷门进程 ``` - **恶意软件**: 若设备曾暴露于公网,可能被植入后门程序。 **检测方法**: ```bash netstat -tulpn | grep ESTABLISHED # 检异常连接 top -b -n 1 | grep -E "100% CPU|可疑进程名" ``` --- ### **排流程图** ```plaintext 1. 检运行中的服务 └─ ps aux | grep -Ev "grep|lighttpd|dropbear" # 过滤常见进程 2. 分析网络流量 └─ tcpdump -i br-lan -n -c 50 # 捕获 LAN 口流量 3. 审计划任务和启动项 └─ crontab -l └─ ls /etc/rc.local /etc/init.d/ 4. 验证防火墙规则 └─ iptables -nvL # 检是否有放行未知流量 ``` --- ### **总结与建议** | **类别** | **潜在原因示例** | **验证命令** | |----------------|--------------------------|----------------------------------| | 服务发现 | mDNS/SSDP | `ps \| grep avahi` | | 系统维护 | NTP/DNS 转发 | `logread \| grep ntp` | | 插件行为 | DDNS/流量监控 | `opkg list-installed \| grep -E "ddns|nlbwmon"` | | 网络协议 | IPv6 RA/DHCPv6 | `uci get network.lan.ra` | | 安全风险 | 恶意软件/后门 | `netstat -tulpn \| grep ESTABLISHED` | **推荐操作**: 1. 使用 `tcpdump` 抓包定位具体通信内容和目标 IP。 2. 检 `/etc/config/` 下所有配置文件,确认无隐藏服务启用。 3. 更新到最新固件,避免因漏洞导致的异常通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值