使用 MAC NAT 盲目桥接无线客户端

使用 MAC NAT 盲目桥接无线客户端

这是常见的“我想通过以太网桥接 wifi”的问题,但这里我需要一些具体的东西。

我的 Linux 机器有一个wlan0处于站点模式的接口,带有 MAC 地址aa:aa:aa:aa:aa:aa,还有一个 VLAN 接口 ( vlan0),带有 MAC 地址bb:bb:bb:bb:bb:bb。只有特定主机正在通过 VLAN 与我通信,因此从该 VLAN 到达的所有数据包都将具有源 MAC 地址cc:cc:cc:cc:cc:cc

而且由于 WiFi 中的三地址框架,所有来自的数据包都wlan0将具有目标 MAC 地址aa:aa:aa:aa:aa:aa。这是正确的吗,还是我过于简单化了?


我想要做的是一个简单的 MAC NAT 桥,其中:

  1. 来自的数据包wlan0将其目标 MAC 更改为cc:cc:cc:cc:cc:cc并通过 VLAN 盲目发送。

    Got from wlan0                       Sent through vlan0
    SRC: whatever it is                  SRC: whatever it is
    DST: aa:aa:aa:aa:aa:aa      -->      DST: cc:cc:cc:cc:cc:cc
    (payload)                            (payload)
    
  2. 来自 的数据包vlan0会将其源 MAC 更改为aa:aa:aa:aa:aa:aa并盲目发送wlan0

    Sent through wlan0                   Got from vlan0
    SRC: aa:aa:aa:aa:aa:aa               SRC: cc:cc:cc:cc:cc:cc
    DST: whatever it is         <--      DST: whatever it is
    (payload)                            (payload)
    
  3. 来自的传入 ARP 回复vlan0也会更新 ARP MAC。示例:

    Sent through wlan0                   Got from vlan0
    SRC: aa:aa:aa:aa:aa:aa               SRC: cc:cc:cc:cc:cc:cc
    DST: whatever it is         <--      DST: whatever it is
    1.2.3.4 can be found at              1.2.3.4 can be found at
    aa:aa:aa:aa:aa:aa                    cc:cc:cc:cc:cc:cc
    

ebtables听起来这是实现此目的的完美方式……如果我能将两个接口连接在一起就好了。
有什么想法吗?我听说过relayd,这有帮助吗?

答案1

我知道这是一个老问题,但我需要解决这个问题,而且不得不花几天时间找出解决它的最佳方法。https://xkcd.com/979/

我们将 Linux 机器上的接口命名为 A (wlan0)、B (vlan0) 和客户端主机 C (vlan0)。因此,您需要类似 A 和 B (wlan0 和 vlan0) 的桥接器,但您无法在 Linux 中桥接这些接口(而且 WiFi STA 无论如何也无法使 C 工作)。

我最终做了什么并确认它有效:

  • 将 C(客户端 vlan0)的 MAC 地址更改为与 A(主机 wlan0)相同的地址
  • 清除 A、B 和 C 的 IP 地址
  • 编写了一个守护进程来在 A 和 B 之间移动以太网帧

守护进程打开原始套接字以从 A 和 B 读取数据,过滤并推送到其他接口。关键在于根据源 MAC 地址进行过滤以避免循环(传出必须与 wlan0 相同,传入不能是 wlan0 的)。

就是这样。ARP、DHCP、ping 和 HTTP 都可以正常工作。

相关内容