Как отразить AWS traffi c из контейнера A в контейнер B - PullRequest
2 голосов
/ 31 января 2020

У меня есть сеанс зеркального отображения AWS traffi c, который собирает трафик c из ENI контейнера A (elasti c сетевой интерфейс) и отправляет его в ENI контейнера B.

Внутри A, / sys / class / net / eth0 / iflink выводит '8', а / sys / class / net / eni123 / ifindex на хосте также выводит '8', поэтому eth0 из контейнера A является eni123 на хосте.

Я могу перехватить зеркальный трафик HTTP c, направленный к A, используя tcpdump -i eni123 с хоста. Но tcpdump на eth0 из B не захватывает никаких пакетов. Он захватывает эхо-запросы, которые я вручную отправляю из A в B.

Я создал контейнер B с securityContext: privileged: true.

Ограничены ли интерфейсы контейнера eth для захвата зеркальных пакетов? Должен ли я использовать что-то кроме обычного ENI в качестве цели зеркала?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

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

Таким образом, при использовании VP C traffi c зеркальное отображение traffi c из одного ENI будет отражено в другой ENI, присоединенный к экземпляру EC2, но целевой ENI зеркала не будет pu sh те сети к виртуальным интерфейсам POD, которые находятся в разных пространствах имен.

В качестве обходного пути, в случае EKS, я развернул модуль с параметром hostNetwork: true для контейнера, и модуль смог получить доступ ко всем Интерфейсы хоста и tcpdump также отображают весь трафик pod c.

Пожалуйста, попробуйте этот подход и проверьте, подходит ли этот подход вашему варианту использования.

Образец Pod манифеста yaml для справки

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  hostNetwork: true
  containers:
    - name: nginx
      image: nginx
0 голосов
/ 04 февраля 2020

Сетевым режимом docker по умолчанию является Docker Мост , который изолирует контейнер от сети.

Запустите контейнер B с помощью --net=host, и он сможет захватывать трафик. c между сетью и хостом при необходимости.

...