Соединение двух интерфейсов и пропуск трафика

258
Gabe

Задача

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

enter image description here

Где «мини-роутер» помогает контролировать и защищать устаревшую систему, которая не может быть обновлена ​​по сложным причинам и находится где-то «на природе». Мы надеемся дооснастить системы дешевым маломощным (например, 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, но, опять же, я не понимаю, как это сделать. LAN-to-LAN 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 
1

0 ответов на вопрос