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

Почему пакеты nping с правильным MAC и неправильным IP не достигают другого контейнера в той же сети?

У меня есть сеть Docker с двумя контейнерами. Когда я бегу nping с поддельным целевым IP-адресом и реальным MAC-адресом второго контейнера пакеты появляются в tcpdump -eni eth0 вывод с разными адресами источника (MAC и IP) и со значительной задержкой (~ 10 с).

Это ошибка Docker или я что-то упустил?


Вот как можно воспроизвести проблему.

Запустите этот скрипт:

docker network create --driver=bridge --subnet=10.16.17.0/24 so_con

docker run -itd --name=con_A --net=so_con debian /bin/bash
docker run -itd --name=con_B --net=so_con debian /bin/bash

docker exec con_A sh -c 'apt-get update && apt-get install -y tcpdump'
docker exec con_B sh -c 'apt-get update && apt-get install -y nmap'

export A_MAC=`docker inspect -f '{{.NetworkSettings.Networks.so_con.MacAddress}}' con_A`

docker exec con_B nping -c 100 --rate 1 --dest-mac $A_MAC 2.15.9.20 &
docker exec con_A tcpdump -eni eth0

После apt-get завершит установку пакетов, вы увидите смешанный вывод из nping и tcpdump:

Starting Nping 0.6.47 ( http://nmap.org/nping ) at 2016-01-07 16:35 UTC
SENT (0.0331s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=1] IP [ttl=64 id=3571 iplen=28 ]
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
SENT (1.0336s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=3] IP [ttl=64 id=3571 iplen=28 ]
SENT (2.0351s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=3] IP [ttl=64 id=3571 iplen=28 ]
SENT (3.0366s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=4] IP [ttl=64 id=3571 iplen=28 ]
SENT (4.0381s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=5] IP [ttl=64 id=3571 iplen=28 ]
SENT (5.0396s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=6] IP [ttl=64 id=3571 iplen=28 ]
SENT (6.0410s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=7] IP [ttl=64 id=3571 iplen=28 ]
SENT (7.0419s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=8] IP [ttl=64 id=3571 iplen=28 ]
SENT (8.0433s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=9] IP [ttl=64 id=3571 iplen=28 ]
SENT (9.0447s) ICMP [10.16.17.3 > 2.15.9.20 Echo request (type=8/code=0) id=6585 seq=10] IP [ttl=64 id=3571 iplen=28 ]
16:36:00.699670 02:42:0a:10:11:03 > 02:42:0a:10:11:02, ethertype IPv4 (0x0800), length 42: 10.16.17.1 > 2.15.9.20: ICMP echo request, id 6585, seq 3, length 8
16:36:00.699764 02:42:0a:10:11:02 > 02:42:1b:a1:db:5a, ethertype IPv4 (0x0800), length 70: 10.16.17.2 > 10.16.17.1: ICMP redirect 2.15.9.20 to host 10.16.17.1, length 36
16:36:00.699809 02:42:0a:10:11:02 > 02:42:1b:a1:db:5a, ethertype IPv4 (0x0800), length 42: 10.16.17.1 > 2.15.9.20: ICMP echo request, id 6585, seq 3, length 8
16:36:01.701244 02:42:0a:10:11:03 > 02:42:0a:10:11:02, ethertype IPv4 (0x0800), length 42: 10.16.17.1 > 2.15.9.20: ICMP echo request, id 6585, seq 3, length 8

Здесь два наблюдения:

  1. tcpdump получает первую посылку только через некоторое время (9 сек).
  2. Полученный пакет исходит из специального интерфейса моста Docker, который прикреплен к хосту, в моем случае это:

    br-436234216b46 Link encap:Ethernet  HWaddr 02:42:1b:a1:db:5a  
          inet addr:10.16.17.1  Bcast:0.0.0.0  Mask:255.255.255.0
    

Кроме того, если вы запустите tcpdump в упомянутом интерфейсе, привязанном к хосту br-436234216b46, он покажет оригинал nping пакеты, поступающие из con_B по какой-то причине вместо con_A.

я использую Докер 1.9.1 на 64 бит Ubuntu 14.04.