Объединение двух интерфейсов с одновременным перекачиванием части трафика

Объединение двух интерфейсов с одновременным перекачиванием части трафика

Цель

Я собираюсь сделать что-то вроде этого:

введите описание изображения здесь

Где "мини-маршрутизатор" помогает контролировать и защищать устаревшую систему, которую нельзя обновить по сложным причинам и которая находится где-то "в дикой природе". Мы надеемся модернизировать системы с помощью дешевого, маломощного (например, 0,5 В и < 100 мА). Повсюду разбросано несколько тысяч таких систем SCADA. Нам нужно провести белую модернизацию, но примерно в 15%-30% сред мы не можем получить IP-адрес (без DHCP) для "мини-маршрутизатора" и должны совместно использовать IP-адрес компьютера/системы SCADA. Я подумал, что мы могли бы настроить прозрачный мост (br0 ниже работает как мост):

root% ip link add name br0 type bridge
root% ip link set dev br0 up
root% ip link set dev eth0 master br0
root% ip link set dev eth1 master br0
root% ip address add 10.253.252.2 dev br0
root% sysctl -w net.ipv4.conf.all.forwarding=1

А затем использовать ebtables / iptables / iproute2 для маршрутизации трафика с Сервера 1, предназначенного для Компьютера, чтобы мы могли шифровать/расшифровывать SSL-трафик между ними и/или «потреблять» трафик между Сервером 2 и Компьютером, поскольку он предназначен для настройки и управления «мини-маршрутизатором».

Поскольку я хотел бы, чтобы это был полностью прозрачный мост, я удалил адреса из eth0 и eth1:

root% ip address flush dev eth0
root% ip address flush dev eth1
root% ip address add 0.0.0.0 dev eth0
root% ip address add 0.0.0.0 dev eth1
root% ip link set dev eth0 up
root% ip link set dev eth1 up
root% ip link set dev eth0 promisc on
root% ip link set dev eth1 promisc on
root% ip link set dev br0 promisc on # Not sure if needed

К сожалению, я не могу перенаправить трафик на/из сервиса, который будет обрабатывать управляющие сообщения.

ПРИМЕЧАНИЕ: Фактически я могу назначить немаршрутизируемый адрес для br0 (например, 169.254.1.2), и если Server1 находится в локальном сегменте LAN (например, на том же коммутаторе), то метод, описанный ниже (Попытки Версия 1) работает; однако пакеты TCP/IP имеют src или dst 169.254.1.2, которые не маршрутизируются и не могут пересекать маршрутизаторы или границы LAN, но Server1 и "мини-маршрутизатор", похоже, не обращают на это внимания. Как и выше, я не могу просто получить DHCP на br0 (который тоже работает), потому что потенциально более тысячи "мини-маршрутизаторов" не смогут получить адрес DHCP.

Вопрос:

Как я могу это сделать? Ниже перечислены вещи, которые я пробовал.

Попытки:

Я искал несколько решений, но безуспешно. Например,«iptables — цель маршрутизации пакета на определенный интерфейс?», предполагает, что маркировка пакетов и использование другой таблицы маршрутизации могут работать; однако, примеры не через мост. Я потратил довольно много времени, пробираясь черезДокументация Netfilterи интуитивно кажется, что я смогу поставитьСетевой фильтр NATмежду br0 и eth1, но опять же, я не понимаю как.IPsec LAN-to-LANили прямое решение VPN требует постоянных соединений между конечными точками, которых у нас не будет. Компьютеру просто нужно периодически звонить домой или получать push-информацию, но ему не нужно постоянное защищенное соединение. Поскольку компьютер/система SCADA также должны взаимодействовать с другими системами, мини-маршрутизатор не должен мешать существующему трафику между компьютером и локальной сетью/маршрутизатором.

Попытки Версия 1

Сначала я прояснил правила:

root% ip rule flush
root% ip rule add lookup default priority 32767
root% ip rule add lookup main priority 32766

Передача кадров Ethernet между Сервером1 и Компьютером на сетевой уровень.

root% ebtables -t broute -A BROUTING -p IPv4 \
      --ip-source 5.6.7.1 --ip-destination 10.0.0.1 \
  -j redirect --redirect-target DROP
root% ebtables -t broute -A BROUTING -p IPv4 \
      --ip-source 10.0.0.1 --ip-destination 5.6.7.1 \
  -j redirect --redirect-target DROP

Перенаправление трафика Server1<-->Computer на адрес br0

root% iptables -t nat -A PREROUTING -p tcp \
      -s 5.6.7.1 -d 10.0.0.1 \
  -j DNAT --to-destination 10.253.252.2
root% iptables -t nat -A POSTROUTING -p tcp \
      -d 10.253.252.2 \
  -j SNAT --to-source 10.0.0.1
root% iptables -t nat -A POSTROUTING -j MASQUERADE

Добавление маршрута к Server1 через br0

root% ip route add 5.6.7.2 via 10.253.252.2 dev br0

И держите пальцы скрещенными, но это не работает. Пробовал много разных вариантов этого.

Попытки Версия 2

Совсем недавно я попробовал версию, более близкую к упомянутой выше, с -j MARK для маршрутизации пакетов, но безрезультатно:

root% ip rule add fwmark 2 priority 1000 table 3
root% ip route add default via 10.0.0.1 table 3
root% ip route flush cache
root% ip route flush table 3
root% iptables -t mangle -A OUTPUT -p tcp -s 5.6.7.1 -j MARK --set-mark 2
root% iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
root% ip route add 0.0.0.0/1 via 10.253.252.2 dev br0 table 3

Связанный контент