Назад | Перейти на главную страницу

Таблица маршрутизации с двумя одинаковыми статическими IP-адресами в сети

Нам нужен способ вставить устройство между целевым устройством и сетью, в идеале без необходимости изменять какие-либо 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

Таким образом, вы можете использовать разные адреса внутри для идентификации интерфейсов вашего среднего блока, но они не отображаются снаружи. Процесс будет выглядеть так:

  • x.x.x.5 выполняет прямой ARP-запрос для x.x.x.10. Этот запрос поступает в средний ящик на eth0.
  • среднее поле замечает, что x.x.x.10 маршрутизируется на eth1, поэтому отвечает своим собственным MAC-адресом
  • IP-пакет для x.x.x.10 доставляется в средний ящик на eth0
  • Правило DNAT в PREROUTING eth0 срабатывает и перезаписывает пункт назначения на x.x.x.6
  • локальное приложение обрабатывает запрос к x.x.x.6, выдает отдельный запрос к x.x.x.10, запрос направляется на eth1
  • Правило SNAT в POSTROUTING eth1 срабатывает, меняет исходный адрес на x.x.x.5
  • x.x.x.10 видит запрос среднего блока, поступающий от x.x.x.5.
  • x.x.x.10 хочет ответить, выдает ARP-запрос для x.x.x.5
  • proxy-arp срабатывает на eth1, поскольку x.x.x.5 маршрутизируется на eth0
  • ответ переходит в среднее поле, срабатывает правило DNAT в eth1, адрес назначения переписывается на x.x.x.11
  • локальное приложение обрабатывает ответ, исходный процесс выдает ответ от x.x.x.6 на x.x.x.5
  • Срабатывает правило SNAT для eth0, изменяет адрес источника на x.x.x.10
  • окончательный ответ выдается на x.x.x.5