null

Старая добрая проблема с mtu ... и в сетях docker

Очень много интересных особенностей с сетями  docker, которые доставляют множество интересных проблем уважаемым разработчикам,  для которых сети... да  нет у них даже  сетевого интерфейса на их макбуках :)

Но  в этой заметке мы посмотрим на одну из тысячи возможных проблем)

Исходные данные -  дев-окружение в сервисах docker compose "вдруг" в окружении VPN в платформу заказчика перестает отправлять даже HTTP/HTTPS запросы на удаленные системы, при этом симптомы - неуспешные SSL - соединения (с последующим бесконечным SSL - handshake-ом ), при всей видимости работающей "сетевой доступности" ресурса -  icmp, устанавливающиеся сетевые соединения и тп. 

Диагностика, на первый взгляд неочевидная, сводится  к простому - "данные"  запросов просто теряются при отправке и виной тому фрагментация в рамках несоразмерных mtu бриджа  docker который по умолчанию (ни смотря ни на что и без попыток проверки конфигурации хоста) устанавливается в "дефолтные"  1500  и интерфейса VPN (в данном случае WireGuard- базирующийся wt адаптер без возможности (пока) конфигурации на стороне оркестрации VPN - решения (Netbird)) c "дефолтным" mtu 1280.

Как определить, что это ваш случай - 

 $ ip a |grep -e wt -e docker

4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
87: wt0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 100.100.100.100/16 brd 100.100.255.255 scope global wt0

Как исправить (варианты) :
1.  compose файл (вместо default может быть и именнованный bridge для конкретного окружения сервисов)

networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1280

2.  dockerd systemd-сервис ( /lib/systemd/system/docker.service, глобальная настройка)

ExecStart=/usr/bin/dockerd --mtu 1280 -H fd:// --containerd=/run/containerd/containerd.sock

3.  /etc/docker/daemon.json

{
  "mtu": 1280
}

...

Незабываем перечитать unit файлы и рестарт dockerd или сервиса :

1.

$ docker compose down && docker-compose up  

2.

# systemctl daemon-reload && systemctl restart docker.service 

3.

# systemctl restart docker.service

 

Коротко о себе:

Работаю в компании TUNE-IT в качестве инженера и преподавателя.

В сферу профессиональных интересов входит все,  что связано с "большими" и не очень серверами и СХД от Sun Microsystems/Oracle и кластерами на их основе, но по долгу службы занимаюсь чаще всего их диагностикой и ремонтом... 

Делюсь опытом и  наработанными навыками в рамках курсов по  соответствующим направлениям.