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

Проблемы arp с прозрачным мостом в Linux

Я пытался защитить свои виртуальные машины на моем сервере esx, разместив их за прозрачным мостом с двумя интерфейсами: один спереди, другой сзади.

Я намерен разместить все правила брандмауэра в одном месте (а не на каждом виртуальном сервере).

Я использовал в качестве моста новую пустую виртуальную машину на основе Arch Linux (но подозреваю, что это не имеет значения, какой это бренд).

У меня есть 2 виртуальных коммутатора (таким образом, две виртуальные сети, VN_front и VN_back), каждый с 2 ​​типами портов (коммутируемый / разделенный или случайный / где машина может видеть все пакеты).

На моем мостовом компьютере я установил 2 виртуальных сетевых адаптера, один на VN_front, один на VN_back, оба в режиме promisc.

Я создал мост br0 с обоими сетевыми адаптерами в нем:

brctl addbr br0
brctl stp br0 off
brctl addif br0 front_if
brctl addif br0 back_if

Потом их поднял:

ifconfig front_if 0.0.0.0 promisc
ifconfig back_if 0.0.0.0 promisc
ifconfig br0 0.0.0.0

(Я использую промисковый режим, потому что не уверен, что смогу обойтись без него, думая, что, возможно, пакеты не доходят до сетевых адаптеров)

Затем я взял один из моих виртуальных серверов, сидящих на VN_front, и вместо этого подключил его к VN_back (это отличный вариант использования, о котором я думаю, возможность перемещать свои серверы, просто изменив VN, к которому они подключены, ничего не меняя в комплектации).

Затем я заглянул в Mac, "видимые" моим безадресным мостом, используя brctl showmacs br0 и он показал мой сервер с обеих сторон:

Я получаю что-то вроде этого:

port no mac addr                is local?       ageing timer
  2     00:0c:29:e1:54:75       no                 9.27
  1     00:0c:29:fd:86:0c       no                 9.27
  2     00:50:56:90:05:86       no                73.38
  1     00:50:56:90:05:88       no                 0.10
  2     00:50:56:90:05:8b       yes                0.00  << FRONT VN
  1     00:50:56:90:05:8c       yes                0.00  << BACK  VN
  2     00:50:56:90:19:18       no                13.55
  2     00:50:56:90:3c:cf       no                13.57

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

Я подозреваю, что в мире ARP происходит что-то ужасное ...: - /

Если я пингую с переднего виртуального сервера на задний виртуальный сервер, я могу видеть только заднюю машину, если эта задняя машина пингует что-то спереди. Как только я прекращаю пинг с задней машины, пинг с передней машины перестает проходить ...

Я заметил, что если задний компьютер пингует, значит, его порт на мосту правильный ...

Я пытался поиграть с переключателем arp_ в / proc / sys, но без явного влияния на конечный результат ... / proc / sys / net / ipv4 / ip_forward, похоже, бесполезен при использовании мост (кажется, brctl позаботился обо всем) / proc / sys / net / ipv4 / conf // arp_ похоже, тоже не сильно меняются ... (пробовал arp_announce на 2 или 8 - как предлагалось в другом месте - и arp_ignore на 0 или 1)

Все примеры, которые я видел, имеют разные подсети с обеих сторон, например 10.0.1.0/24 и 10.0.2.0/24 ... В моем случае я хочу 10.0.1.0/24 с обеих сторон (точно так же, как прозрачный переключатель, за исключением это скрытая прошивка).

Включение / выключение stp, похоже, не повлияло на мою проблему.

Это как если бы пакеты arp проходили через мост, искажая другую сторону ложными данными ... Я пытался использовать -arp на каждом интерфейсе, br0, спереди, сзади ... это вообще ломает дело ... Я подозреваю, что это как-то связано с тем, что обе стороны находятся в одной подсети ...

Я думал о том, чтобы поместить всю мою машину за fw, чтобы иметь всю ту же подсеть сзади ... но я застрял с шлюзом моего провайдера, стоящим спереди, с частью моей подсети (на самом деле 3 устройства для маршрутизации всей подсети), поэтому у меня всегда будут IP-адреса из одной и той же подсети с обеих сторон, что бы я ни делал ... (я использую фиксированные передние IP-адреса в моей делегированной подсети).

Я в растерянности ... -_- «Спасибо за вашу помощь.

(Как кто-нибудь пробовал что-то подобное? Изнутри ESXi?)

(Это не просто трюк, идея состоит в том, чтобы на некоторых серверах работало что-то вроде fail2ban, отправляющее их заблокированный IP-адрес на мост / fw, чтобы он тоже мог их забанить - спасая все остальные серверы от того же злоумышленника за один раз, допуская некоторые приманки, которые запускали бы fw при любом подходящем ответе, и тому подобное ...

Я знаю, что могу использовать что-то вроде snort, но он решает совсем другие проблемы, совершенно по-другому ...)

Если я правильно понимаю, ваша желаемая сеть:

         +----------+  +-----+  +---------+
<--inet--+ VN_front +--+ br0 +--+ VN_back |
         +--+-------+  +-----+  +------+--+
            |                          |       
            |                          |       
         +--+----------+    +----------+--+
         | VM          |    | VM          |
         | 10.0.1.2/24 |    | 10.0.1.3/24 |
         +-------------+    +-------------+

С интернет-шлюзом по стрелке слева?

И вы используете ebtables или iptables на мосту к межсетевому экрану, что находится в "задней" части сети?

Я уверен, что это можно заставить работать, но я бы так не поступил. Это сложная и необычная установка. Как говорят программисты, всегда есть два человека, которые будут отлаживать все, что вы создаете - вы и вы через шесть месяцев, когда вы все это забудете.

Все примеры, которые вы видели с двумя подсетями (и, предположительно, с гораздо более простым брандмауэром), являются обычной практикой по какой-то причине - они работают с первого раза, их легко настроить, изменить, поддерживать и устранять неполадки.

Простота - это все в сети. Избегайте построения сложной сети. Гордитесь своей простой и стабильной сетью, которую может запустить хорошо обученная обезьяна (или даже MCSE). Попросите вашего начальника дать вам KPI по количеству билетов, которые вы не генерировать, чтобы доказать и дать стимулы для этой стабильности.

(Если ваши MAC-адреса выглядят как находящиеся за неправильным мостом, это будет потому, что вы создали сетевой цикл и запросы ARP передаются на оба интерфейса моста, а последний полученный интерфейс узнает, где находится MAC. более поздние комментарии, похоже, вы сделали именно это.)