Нам нужен способ вставить устройство между целевым устройством и сетью, в идеале без необходимости изменять какие-либо IP-адреса.
В настоящее время ситуация такова (прошу прощения за искусство ASCII)
----------- -------------
| x.x.x.5 | ----- | x.x.x.10 |
----------- -------------
Что мы пытаемся сделать, так это вставить устройство с двумя сетевыми интерфейсами, и что нам ХОЧЕТСЯ сделать, так это расположить IP-адреса так, чтобы каждая сторона думала, что она разговаривает с исходным устройством. Мы позаботимся о переносе данных из одного интерфейса в другой.
----------- -------------------------------- ------------
| x.x.x.5 | --- | eth0 x.x.x.10 x.x.x.5 eth1 |--- | x.x.x.10 |
----------- -------------------------------- ------------
Есть ли способ настроить таблицу маршрутизации таким образом, чтобы запрос x.x.x.10, поступающий от eth0, отправлялся через eth1, а запросы на x.x.x.5, поступающие через eth1, отправлялись через eth0?
Средний ящик работает под управлением Linux.
Вы можете сделать это с помощью VPN, которая может работать на уровне 2, например, с помощью Ethernet-моста OpenVPN. Видеть https://openvpn.net/index.php/open-source/documentation/miscellaneous/76-ethernet-bridging.html
Другой способ сделать это - использовать туннель MPLS. Видеть: http://blog.ine.com/2010/08/26/mpls-tunnels-explained/
Если вам нужна только проверка пакетов, например IDS, вы можете использовать, например, фырканье. Видеть: http://sublimerobots.com/2016/02/snort-ips-inline-mode-on-ubuntu/
Возможно, вы сможете настроить мост с помощью bridge-utils. Таким образом, вам даже не нужно настраивать эти IP-адреса в среднем поле.
Это, конечно, зависит от того, зачем вам нужен этот ящик между ними.
Непонятно, почему вы хотите указывать эти конкретные адреса своему среднему ящику. Если вам просто нужно передать пакеты на другой конец, в этом нет необходимости, вы можете использовать мост (или, возможно, proxy-arp).
Один допустимый вариант использования, если вы хотите, чтобы трафик направлялся с любого конца в приложение, работающее локально в среднем поле, при необходимости генерируя новый запрос приложения на другой стороне, поднимаясь и опускаясь по всему сетевому стеку (например, например, прокси-сервер HTTP в пользовательском пространстве). Если это то, что вы хотите, продолжайте читать.
Вы не можете настроить средний блок таким образом, как есть, потому что средний блок не сможет отличить свой локальный интерфейс с одной стороны от удаленного интерфейса с другой стороны.
Я бы попытался настроить это сначала, выбрав два новых адреса для среднего блока, разделив одну сторону на отдельную подсеть. например x.x.x.6/30
(который блокирует .4 и .7 как сетевые адреса из среднего поля и допускает .5 для удаленной стороны) и x.x.x.11
для другой стороны.
Затем включите proxy-ARP для двух соответствующих интерфейсов, добавив следующее в сценарии запуска интерфейса:
echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp
для eth0 и
echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp
для eth1. Вы также можете использовать all
вместо имени интерфейса, если на коробке нет других интерфейсов. Это приведет к тому, что ваш средний ящик теперь будет отвечать своим собственным MAC-адресом на запросы arp, направленные на известные маршрутизируемые адреса на другой стороне.
Затем используйте эти четыре правила NAT, чтобы сделать окно невидимым:
iptables -t nat -A PREROUTING -i eth0 -s x.x.x.5 -d x.x.x.10 -j DNAT --to-destination x.x.x.6
iptables -t nat -A POSTROUTING -o eth0 -d x.x.x.5 -s x.x.x.6 -j SNAT --to-source x.x.x.10
iptables -t nat -A PREROUTING -i eth1 -s x.x.x.10 -d x.x.x.5 -j DNAT --to-destination x.x.x.11
iptables -t nat -A POSTROUTING -o eth1 -d x.x.x.10 -s x.x.x.11 -j SNAT --to-source x.x.x.5
Таким образом, вы можете использовать разные адреса внутри для идентификации интерфейсов вашего среднего блока, но они не отображаются снаружи. Процесс будет выглядеть так: