1

Задача

Я хочу сделать что-то вроде этого:

Где «мини-роутер» помогает контролировать и защищать устаревшую систему, которая не может быть обновлена по сложным причинам и находится где-то "на природе". Мы надеемся дооснастить системы дешевым маломощным (например, 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 для маршрутизации трафика с сервера Server1, предназначенного для компьютера, чтобы мы могли шифровать / дешифровать трафик SSL между ними и / или "потреблять" трафик между сервером Server2 и компьютером, поскольку он предназначен для настройки и управления «мини-маршрутизатором». ».

Поскольку я хотел бы, чтобы это был полностью прозрачный мост, я удалил адреса из 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 находится в сегменте локальной сети (например, на том же коммутаторе), работает метод, описанный ниже (попытки версии 1); однако пакеты TCP/IP имеют src или dst 169.254.1.2, которые не маршрутизируются и не могут пересекать границы маршрутизаторов или LAN, но Server1 и «мини-маршрутизатор», кажется, не заботятся. Как указано выше, я не могу просто получить DHCP на br0 (который также работает), потому что потенциально более тысячи «мини-маршрутизаторов» не смогут получить адрес DHCP.

Вопрос:

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

Попытки:

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

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

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

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

Получение кадров Ethernet между сервером Server1 и компьютером для "DROP" на сетевой уровень.

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 <-> на адрес 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

0