История
У меня есть следующая конфигурация виртуальной сети 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