基于Openwrt虚拟路由MAC地址
上传开发板执行程序
scp传输文件
将生成好的可执行文件放到开发板上,文件传输方式 SCP。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
基本用法为
scp 本地文件 目标系统同户名@目标IP地址:目标系统路径
,在回车之后输入密码,用法如图所示。
虚拟机网络相关设置
在使用本命令之前,要保证开发板与PC机处于同一网段之下,如果Linux使用的是虚拟机,需进行如下设置:
- 点击虚拟机的虚拟网络编辑器
- 添加如下桥接网络
- 点击虚拟机选择设置,选择设置好的网络
- 重启网络服务,获得新的IP地址,可以尝试使用以下命令:
service network-manager restart
Kali Linux(Debian),则需要用以下命令:
service networking restart
Centos 8,则需要用以下命令:
nmcli c reload
切换到串口控制台,运行可执行文件
如果工具链不对,生成的可执行文件也是不能在开发板上执行的。
开机自启动
启动脚本
更改有线MAC端口地址
启动脚本存放在开发板/etc/init.d/目录中,将编写好的脚本文件放置在该路径下可实现开机自启动。
实现有线端口自启动脚本如下,输入ifconfig
查看自己需要更改的Wan口,在interface="eth0.2"
更改端口名。
#MAC address changer script
#MAKE SURE the OUI of the MAC address matches a client side wireless NIC vendor
#Place this script in /etc/init.d/
START=94
STOP=20
start() {
interface="eth0.2"
current_mac=$(ifconfig ${interface} | grep "HWaddr" | awk '{print$5}')
new_mac=$(dd if=/dev/random bs=1 count=3 2>/dev/null | hexdump -C | head -1 |
if [ $? -eq 0 ]; then
ifconfig $interface down
ifconfig $interface hw ether $new_mac
ifconfig $interface up
if [ $? -eq 0 ]; then
logger "MAC address successfully changed for $interface from $curren
current_mac=$(ifconfig ${interface} | grep "HWaddr" | awk '{print$5}
logger "New MAC address: $current_mac"
exit 0
else
logger "MAC address changing scriped failed"
exit 1
fi
else
logger "Failed to generate MAC address. Perhaps you are missing certain sy
exit 1
fi
}
stop() {
echo "Stopping MAC changer script.."
}
修改文件权限,启用该文件
$ chmod +x /etc/init.d/mac-change.sh
$ /etc/init.d/mac-change.sh enable
测试是否生效
$ /etc/init.d/mac-change.sh enabled && echo on
$ /etc/init.d/mac-change.sh start
更改无线MAC端口地址--尚未实现自启动
-
在openwrt里面一般把整个flash分为几个分区,uboot、kernel、rootfs、rootfs_data、art/factory。
root@Widora:~# cat /proc/mtd dev: size erasesize name mtd0: 00030000 00010000 "u-boot" mtd1: 00010000 00010000 "u-boot-env" mtd2: 00010000 00010000 "factory" mtd3: 01fb0000 00010000 "firmware" mtd4: 00118da1 00010000 "kernel" mtd5: 01e9725f 00010000 "rootfs" mtd6: 019e0000 00010000 "rootfs_data"
-
具体分区知识后期再做了解,查看无线MAC在FLANSH存储值,可通过命令查看
dd if=/dev/mtdblock2 of=/dev/factory hexdump -C /dev/factory root@Widora:~# ifconfig ra0
-
由上可知,无线端口MAC值以十六进制形式存储在factory文件中,因此可以通过更改factory文件实现更改MAC值,但是还可以通过
iwpriv
命令查看修改MAC值。
iwpriv ra0 e2p
-
由上可知mac值存储在[0x0004]、[0x0006]、[0x0008]三个寄存器中,可通过如下命令修改。经过测试,更改该值需要通过重启路由器才能实现更改MAC值。
iwpriv ra0 e2p 04=0C0F
iwpriv ra0 e2p 06=020F
iwpriv ra0 e2p 08=8FAB
附MAC值命名规则
MAC 地址第二位数字必须是偶数,以下是详细介绍。
MAC地址通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如:08:00:20:0A:8C:6D 就是一个MAC 地址,其中前6 位16 进制数 08:00:20 代表网络硬件制造商的编号,它由IEEE 分配,而后3 位16 进制数0A:8C:6D 代表该制造商所制造的某个网络产品(如网卡)的系列 号。
每个网络制造商必须确保它所制造的每个以太网设备都具有相同的前三字节以及不同的后三个字节。这样就可保证世界上每个以太网设备都具有唯一的MAC 地 址。
我们需要注意的是以太网地址的第32 位是组播地址的标志位:
47 ~33 制造厂商标识
32 组播标识位
31 ~24 制造厂商标识
23 ~0 系列号
当组播标识位为1 时表示该MAC 地址是一个组播地址。
对于网卡MAC ,这一位必须是0 ,表示一个单播MAC 地址。以下:
X0:XX:XX:XX:XX:XX
X2:XX:XX:XX:XX:XX
X4:XX:XX:XX:XX:XX
X6:XX:XX:XX:XX:XX
X8:XX:XX:XX:XX:XX
XA:XX:XX:XX:XX:XX
XC:XX:XX:XX:XX:XX
XE:XX:XX:XX:XX:XX
为合法的以太网网卡地址。上面的X 代表0 -F 中的任一个。如果你不是购买网卡,而是自己购买芯片制造,那么地址怎么办?可以自己使用一个还没有被ieee 分配的厂商编号就可以了。就算是使用已经分配的厂商编号也没有不可,只要你能保证在你使用的局域网内,任何两个网卡的地址不一样就可以了。地址 FF:FF:FF:FF:FF:FF 为广播地址,只能用在目的地址段,不能作为源地址段。目的地址为广播地址的数据包,可以被一个局域网内的所有网卡接收 到。 地址:
X1:XX:XX:XX:XX:XX
X3:XX:XX:XX:XX:XX
X5:XX:XX:XX:XX:XX
X7:XX:XX:XX:XX:XX
X9:XX:XX:XX:XX:XX
XB:XX:XX:XX:XX:XX
XD:XX:XX:XX:XX:XX
XF:XX:XX:XX:XX:XX
为组播地址,只能作为目的地址,不能作为源地址。组播地址可以被支持该组播地址的一组网卡接收到。组播地址主要用在视频广播,远程唤醒(通过发一个特殊的 数据包使网卡产生一个中断信号,启动电脑),游戏(多个人在局域网里联机打游戏)里等。下面是一些具体的组播地址,其他组播地址跟TCP/IP 无关,不做 介绍: 地址 范围 01:00:5E:00:00:00 ~ 01:00:5E:7F:FF:FF 用于ip 地址的组播 网卡可以接收以下3 种地址的数据包:
- 目的地址跟自己的网卡地址是一样的数据包
- 目的地址为FF:FF:FF:FF:FF:FF 广播地址的数据包
- 目的地址为跟自己的组播地址范围相同的数据包
那么在以太网的应用当中,如果你希望你的数据包只发给一个网卡,目的地址用对方的网卡地址;如果你想把数据包发给所有的网卡,目的地址用广播地址;如果你想把数据包发给一组网卡,目的地址用组播地址。
组播IP 与组播MAC 的映射
二层组播MAC 定义为:01:00:5e:xx:xx:xx ,其中 xx 由三层的IP 组播组确定。组播地址:组播流使用的 IP 是D 类IP 地址(二进制1110 开始),从224.0.0.0 ~239.255.255.255 。由于组播MAC 地址是一个虚拟的地址,并不是真实网卡的MAC 地址,那么网卡在发送报文时二层MAC 地址怎么确定呢?答案是采用地址映射的方法将三层IP 地址映射到MAC 地址。映射关系如下: 从上面的映射关系可以看出IP 地址的五个bit 无法映射到MAC 层,因为MAC 层的这五个bit 已经确定。也就是说有32 个IP 组播组会被映射为同一个MAC 地址。