Траблшутинг конфликтов MTU в сетях Docker: настройка daemon.json и VPN
- Контейнер успешно пингует удаленные хосты (ICMP проходит), но зависает на этапе выполнения
curl,apt-get updateили установки TLS-соединения. - Разрыв TCP-сессий при передаче крупных пакетов через туннели VPN (WireGuard, OpenVPN, IPsec, GRE).
- Внутренние пакеты Docker Swarm Overlay-сетей дропаются коммутаторами из-за накладных расходов заголовка VXLAN (50 байт).
1. Проверка текущего MTU на хосте и в сетях Docker
# MTU физического или VPN интерфейса хоста
ip link show
# MTU интерфейсов Docker bridge
ip link show docker02. Глобальная настройка MTU в /etc/docker/daemon.json
Если хост использует VPN (например, WireGuard с MTU 1420), значение MTU для Docker должно быть равно или меньше (например, 1420):
{
"mtu": 1420
}systemctl daemon-reload && systemctl restart docker3. Настройка MTU для пользовательских сетей в Docker Compose
version: "3.8"
networks:
custom_vpn_net:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 14204. Корректировка MTU для Docker Swarm Overlay сетей
Для оверлейных сетей VXLAN уменьшите MTU минимум на 50 байт от физического интерфейса (1500 - 50 = 1450):
docker network create \
--driver overlay \
--opt mtu=1450 \
swarm_overlay_net Частые вопросы (FAQ)
Почему ICMP (ping) работает, а HTTP/HTTPS трафик зависает при ошибках MTU?
Пакеты ICMP ping имеют маленький размер (обычно 64 байта) и не превышают MTU. При TLS Handshake размер сертификата превышает MTU, а флаг DF (Don't Fragment) запрещает фрагментацию, что приводит к молчаливому отбрасыванию пакетов (Black Hole Router).
Как вычислить оптимальный MTU с помощью утилиты ping?
Выполните тест ping с запретом фрагментации: ping -M do -s 1472 <ip_адрес>. Уменьшайте размер нагрузки (-s), пока пакеты не перестанут дропаться, затем прибавьте 28 байт (заголовки IP+ICMP).