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,表示的是本地的所有路由器。

路由器回复router advertisement
路由器收到前面的请求后,就会回复,就把自己从电信那边拿到的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服务器地址啥的。

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