Загрузка...

Docker и VPN: конфликт MTU и как его решить

docker

Симптомы проблемы

При запуске Docker на машине с активным VPN (Cisco AnyConnect, OpenVPN, WireGuard и др.):

  • VPN постоянно переподключается или падает
  • Docker контейнеры не стартуют корректно
  • Nginx/другие сервисы отдают 504 Gateway Timeout
  • Наблюдаются таймауты и потеря пакетов

Диагностика

Проверьте MTU интерфейсов:

# Docker bridge
docker network inspect bridge | grep MTU
# "mtu": 1500

# VPN интерфейс
ip a show cscotun0
# mtu 1406

Проблема: Docker создаёт сети с MTU 1500, но VPN туннель имеет MTU 1406. Пакеты размером 1500 байт не проходят через туннель → фрагментация/потеря → VPN падает.

Решение

Настройте Docker на использование MTU вашего VPN.

Шаг 1. Узнайте MTU VPN

ip a show <vpn-interface> | grep mtu
# Обычно: 1400-1500, в зависимости от провайдера

Шаг 2. Отредактируйте /etc/docker/daemon.json

{
  "mtu": 1406,
  "bip": "172.17.0.1/16",
  "default-address-pools": [
    {"base": "172.28.0.0/16", "size": 24}
  ]
}

Пояснение параметров:

  • mtu — MTU для всех Docker сетей (должен совпадать с VPN)
  • bip — фиксированный IP для docker0 bridge
  • default-address-pools — пулы для новых сетей (избегаем пересечения с VPN)

Шаг 3. Перезапустите Docker

sudo systemctl restart docker
# или перезапустите Docker Desktop

Шаг 4. Подключите VPN

VPN и Docker теперь должны работать корректно.

Дополнительно

Проверка маршрутизации

ip route show | grep -E "docker|cscotun0"

Убедитесь, что нет перекрытия подсетей:

  • Docker: 172.17.0.0/16, 172.28.0.0/16
  • VPN: 172.26.16.0/20 (пример)

Docker Compose

Если используете Docker Compose, можно указать MTU для конкретной сети:

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

Полезные команды

# Посмотреть все Docker сети
docker network ls

# Инспекция сети
docker network inspect bridge

# Статус VPN
ip a show <vpn-interface>

# Тест MTU
ping -M do -s 1472 -c 1 8.8.8.8  # для MTU 1500
ping -M do -s 1378 -c 1 8.8.8.8  # для MTU 1406

TL;DR

Docker (MTU 1500) + VPN (MTU 1406) = конфликт. Установите MTU Docker равным MTU VPN в /etc/docker/daemon.json и перезапустите сервис.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *