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

Пакеты в мосте попадают в пространство пользователя без перенаправления туда

Я установил мостовой интерфейс (br0) на ПК-A (Linux Ubunutu 14.04)

Вдобавок я создал приложение с TCP Listener на порту 80 в пользовательском пространстве на PC-A.

Как я понял из документации Netfilter и bridge-utils, мост предполагает маршрутизировать пакеты через ядро, не поднимая их в пространство пользователя, но когда я подключаю проводной (p2p) ПК-B к ПК-мосту ( PC-A) и перейдите в сеть HTTP. Я вижу, что пакеты принимаются слушателем, что означает, что пакеты попали в пользовательское пространство.

Я должен сказать, что в любой цепочке нет правил ebtables, которые сообщают пакету о перенаправлении в пользовательское пространство.

Самое странное здесь то, что у меня такая же конфигурация в другом месте, и пакеты не попадают туда в пользовательское пространство, если я не добавлю правило broute (что, как я полагаю, является ожидаемым поведением)

Любое изменение знает, что может вызвать странное поведение?

Указание IP-адреса на мосту Означает, что пакеты предназначены для MAC-адреса моста и, таким образом, запускается нормальный процесс приема пакетов локальной доставки.

Два разных пути выглядят примерно так. Допустим, у нас есть eth1 и eth2, подключенные через br1

1) пакет прибывает на eth1 Предназначен для нелокального MAC, пакет пересылается ядром через мост и выходит на eth2. Обработка пользовательского пространства или уровня IP не выполняется. (Если для его перехвата не используется конкретное правило netfilter - см. Другой ответ)

2) пакет прибывает на eth1, предназначенный для MAC моста. Здесь пакет не покидает мост, а вместо этого принимается стеком IP как обычный входящий пакет на br1. Затем этот пакет обрабатывается, а затем данные пересылаются процессу, прослушивающему порт 80 интерфейса br1.

«Возврат» к пользовательскому пространству разрешен прослушивающим портом. Это не совсем связано с типом интерфейса.

размещение IP-адреса на мосту очень полезно, если вы хотите соединить 2 интерфейса и общаться с хостами по обе стороны моста.

Чего вы на самом деле пытаетесь здесь достичь? Почему такое поведение вызывает проблемы?

Это не ответ, но существует ограничение на длину комментария, поэтому я написал этот текст как ответ.

Чтобы перенаправить коммутируемые кадры на локальный порт, вы можете сделать следующие шаги: Установите переменную sysctl bridge-nf-call-iptables = 1 (модуль ядра br_netfilter должен быть загружен). Добавьте правило перенаправления для коммутируемых пакетов. Что-то вроде этого:

iptables -t nat -A PREROUTING \ -m physdev --physdev-is-in br0 \ -p tcp --dport 80 -j REDIRECT --to-ports 80

Связанные чтения:

  1. документация ip-sysctl
  2. iptables -m <match-name> --help - краткая справка по использованию матча
  3. iptables -j <TARGET-NAME> --help - краткая справка по целевому использованию

Чтобы устранить проблему, вы можете:

  1. Проверьте свои наборы правил iptables и ebtables.
  2. Сбросьте трафик с помощью tcpdump / wirehark и проверьте адреса назначения (mac и ip) этих пакетов (если приложение пользовательского пространства получает эти пакеты, то пакеты направляются на ваш хост PC-A).