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

OpenVPN не создает маршруты внутри докера

Я пытаюсь запустить клиент OpenVPN внутри контейнера Docker с --up/--down параметры для запуска приложения. Соединение устанавливается, но весь трафик от приложения по-прежнему проходит через шлюз по умолчанию.

Сервер OpenVPN нажимает "redirect-gateway def1", когда соединение установлено, но клиент OpenVPN не создает дополнительных маршрутов для переопределения шлюза по умолчанию.

Я попытался настроить приложение для набора номера через туннельное устройство, но время ожидания истекло. Это работало, когда я пытался с хост-машины.

Поэтому вместо этого я попытался установить маршруты вручную (1 статический маршрут к серверу openvpn и два маршрута 0.0.0.0/1, 128.0.0.0/1 для всего остального трафика, точно так же, как он создавался при попытке на хост-машине), и вернул приложение, чтобы оно следовало маршрутам по умолчанию, и время ожидания все еще истекало.

Когда я использую тот же файл конфигурации ovpn для подключения с хост-машины, устанавливаются дополнительные маршруты. Весь трафик проходит через VPN-туннель без таймаутов.

Я пробовал те же конфигурации докеров на Fedora: latest, ubuntu: latest, alpine: latest.

Как заставить туннель работать внутри Docker?

Обновить: Я понял, что отсутствующие маршруты связаны с тем, что я запускал openvpn с --up/--down параметры. После их удаления и запуска openvpn в качестве демона и моей программы в качестве процесса блокировки маршруты создаются, но запросы по-прежнему истекают. Я тестировал то же самое на виртуальной машине, и там он работает.

Контейнеры, в отличие от виртуальной машины, используют одно и то же ядро. Из-за этого root внутри контейнера не имеет такого же доступа, как root за пределами контейнера. В противном случае пользователь root может выйти из контейнера, смонтировать устройства, изменить его пространство имен и т. Д. Сеть с контейнерами - одна из тех возможностей, которые удалены у пользователя root. Чтобы снять все эти ограничения, вы можете протестировать свой код с помощью docker run --privileged ... вариант. Если это сработает, вы можете выполнить точную настройку с помощью различных параметров, чтобы --cap-add. Независимо от того, получаете ли вы минимальные разрешения или нет, ваш хост не будет защищен от мошеннического приложения, запущенного в контейнере с этими настройками.