Linux 可以进行“基于源 MAC 的路由”吗?

Linux 可以进行“基于源 MAC 的路由”吗?

我正在寻找一种在 Linux 中执行基于源 MAC 的路由的方法。

我的目标是拥有一个具有以下路由的路由器:

echo 100 inbound >> /etc/iproute2/rt_tables
ip rule add iif eth0 priority 100 table inbound
ip route add default via <myproxy> dev eth1 table inbound

echo 200 returntosender >> /etc/iproute2/rt_tables
ip rule add iif eth1 priority 200 table returntosender
*use source MAC from the initial packet to find the next-hop through dev eth0*

到达路由器 eth0 的数据包将在 eth1 上发送到透明代理,该代理不会修改第 3 层或第 4 层源/目标,然后代理会将数据包发送回 eth1。然后路由器需要决定将数据包转发到哪里,这应该基于它在 eth0 上收到初始数据包的源 MAC。

Linux 有办法做到这一点吗?我可以使用 quagga/VyOS/frr 或任何可以实现这一点的东西。我只是还没有在 Linux 中找到“MAC 翻转”/“返回发送者”/“对称返回”机制。显然一些专有产品有它:https://www.kareemccie.com/2019/12/what-is-source-mac-address-based-routing.html

编辑

192.0.2.0/24 (TEST-NET-1)
198.51.100.0/25 (TEST-NET-2a)
198.51.100.128/25 (TEST-NET-2b)
203.0.113.0/25 (TEST-NET-3a)
203.0.113.128/25 (TEST-NET-3b)

client: 192.0.2.100/24 (TEST-NET-1)
routerA1: 192.0.2.1/24 (TEST-NET-1), 198.51.100.1/25 (TEST-NET-2a), and 203.0.113.1/24 (TEST-NET-3a)
routerA2: 192.0.2.2/24 (TEST-NET-1), 198.51.100.2/25 (TEST-NET-2a), and 203.0.113.2/24 (TEST-NET-3a)
routerAN: 192.0.2.N/24 (TEST-NET-1), 198.51.100.N/25 (TEST-NET-2a), and 203.0.113.N/24 (TEST-NET-3a) for 1<=N<=50
myrouter: 198.51.100.100/25 (TEST-NET-2a), 198.51.100.129/25 (TEST-NET-2b)
myproxy: 198.51.100.200/25 (TEST-NET-2b)
server: 203.0.113.222/25 (TEST-NET-3b)

L2 SRC | Client MAC     | RA1 MAC       | MyR MAC        | MyPrxy MAC     | MyR MAC        | RA1 MAC      
L2 DST | RA1 MAC        | MyR MAC       | MyPrxy MAC     | MyR MAC        | RA1 MAC        | NextHop MAC    
L3 SRC | 192.0.2.100    | 192.0.2.100   | 192.0.2.100*   | 192.0.2.100*   | 192.0.2.100    | 192.0.2.100  
L3 DST | 203.0.113.222  | 203.0.113.222 | 203.0.113.222* | 203.0.113.222* | 203.0.113.222  | 203.0.113.222
L4 SRC | 35555 (client) | 35555         | 35555*         | 35555*         | 35555          | 35555        
L4 DST | 80 (server)    | 80            | 80*            | 80*            | 80             | 80           
(* means maintaining L3/L4 at this point in the flow is not critical)

client      ->     routerA1     ->    myrouter   ->  myproxy   ->   myrouter   ->   routerA1      ->      server
       (TEST-NET-1)       (TEST-NET-2a)    (TEST-NET-2b)   (TEST-NET-2b)   (TEST-NET-2a)   (TEST-NET-3a,TEST-NET-3b)

myrouter从 接收数据包时routerA1,它将看不到路由器 A1 的 L3 地址,而只能看到客户端和服务器的 L3 地址。 myproxy将对数据包进行一些处理并将处理后的数据包返回到myrouter,后者必须将数据包返回给路由器 A1。 有多个实例routerA,必须使用正确的实例来处理出口流量,但识别哪个实例发送了数据包的唯一方法myrouter是通过源 MAC 地址。

在这个例子中,路由器 A 是一个黑盒子。当数据包从客户端到服务器时,它将处理两次看到同一个数据包,当数据包从服务器返回到客户端时,它将处理两次看到同一个数据包。也就是说,它不会不断地将进入的数据包循环回我的路由器。

为简单起见,myproxy 只是另一个具有 myrouter 默认网关的路由器。即,任何到达 myproxy 的东西都会返回到 myrouter。然后,myrouter 必须根据进入数据包的源 MAC 将数据包发送回 routerA 的正确实例。

相关内容