这是常见的“我想通过以太网桥接 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 桥,其中:
来自的数据包
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)
来自 的数据包
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)
来自的传入 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 都可以正常工作。