immortalWrt路由器上抓包查看电脑联网如何获取ip

immortalWrt如何抓包

网上查了下,一开始说在里面安装一个插件:port-mirroring,结果发现不行。后来发现可以直接ssh登录后,安装tcpdump。

像我刷的这个immortalWrt,属于openwrt的分支,而openwrt则属于linux,只不过是属于嵌入式linux领域,也算是一个linux发行版。

但是路由器内存较小,所以这种系统和服务器端的linux有些不一样,比如包管理器,服务器端,我们一般就是yum、dnf啥的,而在openwrt上,主流版本是用:opkg,新版本则开始切换到apk。

一个入门介绍:

安装bash

默认的bash是/bin/ash

shell 复制代码
root@ImmortalWrt:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/ash

这个ash也是嵌入式系统常用,主要就是轻量。

/bin/ash 是 ‌Almquist Shell‌ 的可执行文件路径,一种轻量级、POSIX 兼容的命令行解释器,常用于嵌入式系统(如 BusyBox)或资源受限环境 。‌‌

我用了一阵,发现history都不支持,每次重新登录,之前的历史命令都看不到了,我这边改成:

shell 复制代码
root@ImmortalWrt:~# opkg install bash
Package bash (5.2.37-r1) installed in root is up to date.

// 登录后自动进入bash
echo '[ -z "$BASH" ] && exec bash' >> /root/.profile

安装tcpdump、lrzsz

shell 复制代码
root@ImmortalWrt:~# opkg install tcpdump
Package tcpdump (4.99.5-r1) installed in root is up to date.

root@ImmortalWrt:~# opkg install lrzsz  ------方便用rz、sz传文件,不用winscp了
Package lrzsz (0.12.21-r1) installed in root is up to date.

dhcp服务端(面向lan端)

shell 复制代码
root@ImmortalWrt:~# netstat -nltup |grep dhcpd
udp        0      0 :::547                  :::*                                3411/odhcpd

路由器上启动了odhcpd,默认监听547端口,udp协议。

其他手机电脑连wifi时,就需要来请求这个547端口,应用层协议也就是我们之前提到的dhcpv6、dhcp(v4)等。

dhcp客户端

其实路由器也是一个客户端,因为它作为dhcp客户端,是去电信等运营商侧,通过dhcp去获取ip地址。

shell 复制代码
root@ImmortalWrt:~# ps -ef|grep dhcp
 2902 root      1104 S    odhcp6c -s /lib/netifd/dhcpv6.script -P0 -t120 pppoe-wan

odhcp6c 是一个专为嵌入式 Linux 系统(尤其是路由器)设计的轻量级 ‌DHCPv6 ‌ 和 ‌**路由器通告(RA)**‌ 客户端程序。它体积小巧(编译后约 35KB),主要用于在 OpenWrt 等系统中获取 IPv6 地址、前缀及 DNS 信息。

核心功能与特点

  • 协议支持 ‌:同时支持 ‌DHCPv6 ‌ 状态ful/stateless 模式以及 ‌SLAAC‌(无状态地址自动配置),能够处理 IPv6 前缀代理(DHCPv6-PD)。
  • 应用场景 ‌:主要作为 OpenWrt 路由器的 WAN6 接口客户端,从上游 ISP 获取 IPv6 网络配置,并可配合 odhcpd 向局域网设备分发 IPv6 地址。
  • 配置灵活‌:支持通过 UCI 配置文件或命令行参数自定义请求选项(如请求地址、前缀长度、FQDN 等)。

但是,作为一个客户端,它也是监听了端口的,端口为546.我也不太理解,客户端一般作为请求发起方,是不需要监听端口的。

shell 复制代码
root@ImmortalWrt:~# netstat -nltup |grep dhcp
udp        0      0 :::546                  :::*                                2902/odhcp6c

具体看下面的解释吧:

抓包分析

由于是抓电脑连接wifi时,是如何与路由器交互的。肯定要连547端口(dhcp部分),另外,网上查了下:还涉及icmpv6协议。所以:

抓包命令:

shell 复制代码
tcpdump -i any 'icmp6 or udp port 547' -w icmp6-1.pcap

电脑发给路由器:router solicitation

下图中,左边是源,右边地址是目标。红框是我的电脑,给ff02::2发送了报文:

注意,这个就是icmpv6报文,里面包含啥呢:

就一个type,值为133.

这个报文发给谁的呢,ff02::2,表示的是本地的所有路由器。

路由器收到前面的请求后,就会回复,就把自己从电信那边拿到的ipv6前缀,传给下游的这些设备:

下图的红框都是很重要的部分,flags里面的前两个flag,第一个flag为0时,设备不从dhcpd获取ipv6地址;为1时,从dhcpd获取地址。

第二个flag,为1时,从dhcpd获取dns等各类信息;为0时,不从dhcpd获取。

另外,后面的三个红框,就是下发的ipv6前缀之类的,240e开头,就是电信的地址。

电脑再次请求路由器--dhcpv6

电脑会根据前面路由器返回的flags,来决定自己的行为,看看是完全走dhcpv6,还是走slaac来自己生成ipv6地址。

下面可以看到,就是客户端把自己的各种信息传给路由器了,包括自己的id啥的(我打码的部分)

路由器返回dhcpv6响应

下面就是路由器返回的,包括dns服务器地址啥的。

总结

大概过程就是这样,暂时到这了。