Повторное использование IP-адреса на устройствах Macvlan
Я пытаюсь создать простую в использовании и, возможно, простую среду тестирования для какого-либо продукта и получаю странное поведение macvlan.
Чего я пытаюсь добиться: создать набор инструментов для однострочного запуска / остановки контейнеров lxc (через докер), привязанных к внешнему ip (мне этого достаточно на хост-машине).
Итак, я делаю что-то вроде этого:
docker run -d -name= имя_ контейнера имя_ контейнера конвейер eth1 имя_ контейнера ip/prefix_len@gateway
и трубопровод здесь делает это:
GUEST_IFNAME = фот $ NSPID $ eth1 ip link добавить ссылку eth1 dev $GUEST_IFNAME тип мост режима macvlan IP-ссылка настроила eth1 вверх ip link set $ GUEST_IFNAME netns $ NSPID ip netns exec $NSPID ip link set $ GUEST_IFNAME name eth1 ip netns exec $ NSPID ip addr add $ IPADDR dev eth1 ip netns exec $NSPID ip route удалить по умолчанию ip netns exec $NSPID ip link установил eth1 ip netns exec $NSPID ip route заменяет значение по умолчанию через $ GATEWAY ip netns exec $ NSPID arping -c 1 -A -I eth1 $ IPADDR
И это работает впервые на IP. Но во второй и более поздние пакеты для контейнеров IP не попадает в контейнер, в то время как вся конфигурация кажется хорошей.
Так это выглядит так:
Внешняя машина
➤ пинг 212.76.131.212 .... тишина....
Хост-машина
root@ubuntu:~# ip link show eth1 2: eth1: mtu 1500 qdisc pfifo_fast состояние UP qlen 1000 ссылка / эфир 00: 15: 17: c9: e1: c9 brd ff: ff: ff: ff: ff: ff root @ ubuntu: ~ # ip addr show eth1 2: eth1: mtu 1500 qdisc pfifo_fast состояние UP qlen 1000 ссылка / эфир 00: 15: 17: c9: e1: c9 brd ff: ff: ff: ff: ff: ff root @ ubuntu: ~ # tcpdump -v -i eth1 icmp tcpdump: ПРЕДУПРЕЖДЕНИЕ: eth1: IPv4-адрес не назначен tcpdump: прослушивание по eth1, тип канала EN10MB (Ethernet), размер захвата 65535 байт 00:00:46.542042 IP (tos 0x0, ttl 60, id 9623, смещение 0, флаги [DF], протокол ICMP (1), длина 84) 5.134.221.98 > 212.76.131.212: эхо-запрос ICMP, id 6718, seq 2345, длина 64 00:00:47.549969 IP (tos 0x0, ttl 60, id 9624, смещение 0, флаги [DF], протокол ICMP (1), длина 84) 5.134.221.98 > 212.76.131.212: эхо-запрос ICMP, id 6718, seq 2346, длина 64 00:00:48.558143 IP (tos 0x0, ttl 60, id 9625, смещение 0, флаги [DF], протокол ICMP (1), длина 84) 5.134.221.98 > 212.76.131.212: эхо-запрос ICMP, id 6718, seq 2347, длина 64 00:00:49.566319 IP (tos 0x0, ttl 60, id 9626, смещение 0, флаги [DF], протокол ICMP (1), длина 84) 5.134.221.98 > 212.76.131.212: эхо-запрос ICMP, id 6718, seq 2348, длина 64 00:00:50.573999 IP (tos 0x0, ttl 60, id 9627, смещение 0, флаги [DF], протокол ICMP (1), длина 84) 5.134.221.98 > 212.76.131.212: эхо-запрос ICMP, id 6718, seq 2349, длина 64 ^C 5 захваченных пакетов 5 пакетов, полученных фильтром 0 пакетов отброшено ядром 1 пакет отброшен интерфейсом
Хост машина, нетнс контейнера
root@ubuntu:~# ip netns exec 32053 ip ссылка показать eth1 48: eth1@if2: mtu 1500 qdisc noqueue state НЕИЗВЕСТНО ссылка / эфир b2:12:f7:cc:a1:9d brd ff:ff:ff:ff:ff:ff root@ubuntu:~# ip netns exec 32053 ip addr show eth1 48: eth1@if2: mtu 1500 qdisc noqueue state НЕИЗВЕСТНО ссылка / эфир b2:12:f7:cc:a1:9d brd ff:ff:ff:ff:ff:ff inet 212.76.131.212/29 scope global eth1 inet6 fe80::b012:f7ff:fecc:a19d/64 ссылка области valid_lft forever предпочитаемый_lft forever root@ubuntu:~# ip netns exec 32053 tcpdump -v -i eth1 icmp tcpdump: прослушивание по eth1, тип канала EN10MB (Ethernet), размер захвата 65535 байт.... тишина.... ^C 0 перехваченных пакетов 0 пакетов, полученных фильтром 0 пакетов отброшено ядром
Итак, кто-нибудь может сказать, что это может быть? Может ли это быть вызвано не ошибкой в реализации macvlan? Могу ли я использовать какие-либо инструменты для отладки этой конфигурации?
1 ответ
Это была проблема с кэшем ARP.
Кэш ARP на шлюзе содержал запись для IP с MAC уже мертвого macvlan и не обновлялась просто arping
,
Решено добавлением
ip netns exec $NSPID ping -c 1 -I eth1 $ Шлюз
до конца pipework
скрипт. Этот пинг заставляет шлюз обновлять запись кэша ARP /