WedX - журнал о программировании и компьютерных науках

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

История

У меня есть следующая конфигурация виртуальной сети Docker:

 ...10.2        ...10.3 ...100.3        ...100.2
+------+            +-------+            +------+
| so_A +--so_net_a--+ so_AB +--so_net_b--+ so_B |
+------+ ...10.0/24 +-------+ ..100.0/24 +------+

Сборка со сценарием установки в конце вопроса. Здесь so_A, so_AB и so_B — это контейнеры Debian; so_net_a и so_net_b — это сети Docker (недавно добавленная функция).

Хочу сделать роутер из среднего контейнера so_AB. Для этого я заменяю шлюз по умолчанию в so_A на ip so_AB:

docker exec --privileged so_A ip route del default
docker exec --privileged so_A ip route add default via $AB_A_IP dev eth0

Затем я запускаю tcpdump на so_AB (в дополнительном окне терминала):

docker attach so_AB
/# tcpdump -i eth0 -n

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

docker attach so_A
/# ping 192.168.200.2

so_AB получает ICMP-пакеты (правда, почему-то от дефолтного шлюза 192.168.10.1, в то время как я ожидал, что они придут с so_A ip 192.168.10.2), бубнится при пинге любого адреса из подсети so_net_b, например:

/# ping 192.168.100.15

so_AB получает только запросы ARP, например ARP, Request who-has 192.168.10.3 tell 192.168.10.2, length 28.

ip route get показывает, что so_A использует so_AB в качестве первого перехода для обоих адресов.

Вопрос

Почему ping-пакеты для релевантных IP-адресов не достигают шлюза по умолчанию, настроенного пользователем, а нерелевантные — достигают?

Настраивать

Я использую последнюю версию Docker: 1.9.1, build a34a1d5 на моей 64-битной Ubuntu 14.04.

Вот сценарий установки для воспроизведения проблемы:

docker network create --driver=bridge --subnet=192.168.10.0/24 so_net_a
docker network create --driver=bridge --subnet=192.168.100.0/24 so_net_b

# Network topology:
# +------+            +-------+            +------+
# | so_A +--so_net_a--+ so_AB +--so_net_b--+ so_B |
# +------+            +-------+            +------+

docker run -itd --name=so_A --net=so_net_a debian /bin/bash
docker run -itd --name=so_B --net=so_net_b debian /bin/bash
docker run -itd --name=so_AB --net=so_net_a debian /bin/bash
docker network connect so_net_b so_AB

docker exec so_AB sh -c 'apt-get update && apt-get install -y tcpdump'

AB_A_IP=`docker inspect -f '{{.NetworkSettings.Networks.so_net_a.IPAddress}}' so_AB`
B_IP=`docker inspect -f '{{.NetworkSettings.Networks.so_net_b.IPAddress}}' so_B`

# Change the default gateway to so_AB
docker exec --privileged so_A ip route del default
docker exec --privileged so_A ip route add default via $AB_A_IP dev eth0

# Normally should be 192.168.100.2
echo $B_IP

  • Мне просто интересно... если AB должен работать как шлюз, можете ли вы убедиться, что переадресация пакетов включена? Что-то вроде sysctl -w net.ipv4.ip_forward=1 . Не уверен, должен ли он выполняться на хосте, госте или на обоих. 06.01.2016
  • @Sjlver, он включен на хосте и всех трех клиентах. 07.01.2016

Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

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

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]