![发送具有不同‘发送方 MAC 地址’的数据包(帧)?](https://linux22.com/image/1442600/%E5%8F%91%E9%80%81%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%E2%80%98%E5%8F%91%E9%80%81%E6%96%B9%20MAC%20%E5%9C%B0%E5%9D%80%E2%80%99%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%EF%BC%88%E5%B8%A7%EF%BC%89%EF%BC%9F.png)
我刚刚在学习 Network+ 这本书,书中解释了帧的内容,使用块来表示一组位。接下来,它指出第一个“块”是收件人的 MAC 地址。之后的块是发送者的 MAC 地址。
我想知道是否有可能在发送帧之前拦截它,在发送帧之前将发送方的 MAC 地址清零(或者写入一个随机的 MAC 地址而不是实际的 MAC 地址)?
答案1
以太网
超过以太网– 是的,包括以太网头在内的整个帧都由您的操作系统发送,并且操作系统决定使用哪个源 MAC 地址。
事实上,虚拟机系统(如 VMware 或 Hyper-V)已经使用它将虚拟机连接到您的真实 LAN - 您可能有多个虚拟机连接到单个以太网卡,并且每个虚拟机都有独立于主机的 MAC 地址。
Linux、FreeBSD、Windows 甚至可以选择创建将多个物理以太网接口连接在一起的“桥梁”,其工作方式与真正的以太网交换机完全一样(甚至使用 VLAN 和 RSTP)。
方法
您可以更改网络接口的 MAC 地址(告诉操作系统使用新地址一切它传输),或者使用单个程序中的“原始套接字”来制作和发送任何你想要的东西,绕过 TCP/IP 堆栈。对于后者,使用现有的工具,如 libpcap,斯卡皮或称复仇女神。
在 Linux 上,
ip link
将更改 MAC 地址直到下次重启:# ip link set eth0 down # ip link set eth0 addr ab:cd:ef:ab:cd:ef # ip link set eth0 up
或者使用 scapy 发送单个数据包:
>>> send(Ether(src="ab:cd:ef:ab:cd:ef", dst="ff:ff:ff:ff:ff:ff")/IP(src="1.2.3.4", dst="3.4.5.6")/UDP(dport=9)/b"hello") Sent 1 packets.
Linux 甚至具有“macvlan”功能,可以在同一物理以太网卡上创建具有不同 MAC 的虚拟接口:
# ip link add fred0 link eth0 type macvlan mode private
无线上网
无线上网限制性更强——你不能发送带有欺骗源的单个数据包,因为 AP 会跟踪与其关联的所有站,并且(据我所知)会丢弃来自不在“关联站”列表中的任何 MAC 地址的数据包。
(这是从站点的角度来看的。AP 可以做任何它们想做的事情——毕竟,代表有线设备发送数据包是它们工作的一部分。)
然而,你仍然可以设置不同的 MAC 地址在无线接口上,并使用该新地址一切,从与 AP 的关联/身份验证开始。
但是与以太网不同的是,这样做的能力取决于特定的无线硬件和驱动程序(例如,Atheros 通常支持此功能,而某些 Realtek 卡可能不支持)。在 Linux 上,相同的ip link …
命令应该有效。
L2 桥接
也就是说,有办法使用 Wi-Fi 实现第 2 层桥接(例如,如果您需要通过定向无线电链路连接整个建筑物)。
(好吧,现在这有点题外,但为了完整性还是包括在内。)
它比以太网稍微复杂一些,因为有原始源(生成数据包的主机)和发送器(传输数据包的 Wi-Fi 无线电)的独立概念;同样,还有接收器(接收数据包的 Wi-Fi 无线电)和最终目的地(将读取/使用数据包的主机)。
例如,如果计算机 A(例如笔记本电脑)通过 WiFi 向计算机 B 发送数据包,则该数据包将具有这样的标头:
- 来自(原始来源):<计算机 A 的地址>
- 至(接收 Wi-Fi 无线电):<Wi-Fi 路由器的地址>
- 到(最终目的地):<计算机 B 的地址>
请注意,只有一个“发件人”地址,这是基于常规 Wi-Fi 站点永远不会代表其他设备发送数据包的假设。这样每个数据包可以节省 6 个字节。
从 AP 到站点则相反 - 有两个“来自”地址,“原始发送者”和“传输 AP”,但只有一个“到”地址。
因此,当你需要桥接两个以太网网络通过 Wi-Fi,您需要“WDS”又名“4addr”模式,这会导致所有四个地址(两个源地址和两个目标地址)随每个 Wi-Fi 帧一起发送。对此的支持各不相同。在 Linux 上,您可以通过 执行此操作iw
。
请注意,必须启用 WDS/4addr 模式两个都結束。
L2 NAT
某些系统(例如 VirtualBox 或 Ubiquiti airMAX 无线电(配置为没有 WDS 的站点时)或相同配置的 OpenWRT)支持 MAC 地址转换:在站点自己的 MAC 地址之间伪装多个客户端,类似于 IPv4 NAT,但级别较低。这无需任何配置即可工作,并且可能更有效;但是,如果像 DHCP 服务器这样的程序依赖于不同的客户端 MAC 地址,则会产生问题。
(这实际上与我们开始时的相反 - 一个 MAC 后面有多个设备,而不是一个设备有多个 MAC - 所以让我们在这里停下来。)
蓝牙
我不太清楚蓝牙。据我所知,大多数适配器不允许您更改或以其他方式伪造其 MAC 地址,因为它是所有通信使用的唯一寻址方法 - 设备通过其 MAC 地址相互识别,并根据 MAC 地址存储链接密钥...无论如何。不是我的领域。
答案2
确保内核中所有 CONFIG_NET_SCHED 相关选项都已启用。
tc qdisc 添加 dev eth0 根句柄 15:prio
由于重定向发生在最后,因此下面的序列可以更改源 IP 和源 MAC
MAC_ADDR_ETH1= cat /sys/class/net/eth1/address
IP_ADDR_ETH1=ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
tc 过滤器添加 dev eth0 父级 15:0 协议 ip prio 1 句柄 0x2 fw 操作 pedit ex munge eth src 设置 ${MAC_ADDR_ETH1} pipe \ 操作 pedit ex munge ip src 设置 ${IP_ADDR_ETH1} pipe \ 操作 mirred egress 重定向 dev eth1