Может ли 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. Затем маршрутизатору необходимо решить, куда пересылать пакеты, что должно быть основано на исходном MAC-адресе, откуда он получил исходный пакет на eth0.
Есть ли в Linux способ сделать это? Меня устраивает использование quagga/VyOS/frr или чего-либо еще, что позволит добиться этой цели. Я просто не нашел «переключение MAC»/«возврат отправителю»/«симметричный возврат»; механизма в Linux пока нет. Очевидно, он есть в некоторых проприетарных продуктах: 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)
Когда получает пакеты отrouterA1
, он не увидит адрес L3 маршрутизатора A1, а только адрес L3 клиента и сервера.myproxy
выполнит некоторую обработку пакетов и вернет обработанные пакеты в , который должен вернуть пакеты маршрутизатору A1. Есть несколько случаевrouterA
и правильный экземпляр должен использоваться для исходящего трафика, но единственный способ определить, какой экземпляр отправилmyrouter
пакет находится по MAC-адресу источника.
RouterA в этом примере является «черным ящиком». Он будет обрабатывать один и тот же пакет дважды, когда пакеты передаются от клиента к серверу, и дважды, когда пакеты возвращаются с сервера на клиент. Т.е. он не будет постоянно зацикливать входящие пакеты обратно на мой маршрутизатор.
Проще говоря, myproxy — это просто еще один маршрутизатор со шлюзом по умолчанию myrouter. Т.е. все, что попадает на мой прокси, возвращается на мой маршрутизатор. Затем myrouter должен отправить пакеты обратно правильному экземпляру routerA на основе исходного MAC-адреса входящего пакета.