Сбой создания VPN-адаптера внутри контейнера Ubuntu Docker, кроме как в LCOW? - PullRequest
0 голосов
/ 30 марта 2019

По сути, я создаю контейнер, который подключается к VPN. Это происходит с использованием AnyConnect, но я не думаю, что это имеет значение.

Мой dockerfile выглядит следующим образом.

FROM ubuntu

COPY anyconnect/ /anyconnect/

WORKDIR /anyconnect/vpn
RUN echo y | ./vpn_install.sh

WORKDIR /
COPY start.sh .
RUN chmod 777 start.sh

EXPOSE 1080

ENTRYPOINT [ "/start.sh" ]

Этот стартовый скрипт выглядит следующим образом.

#!/bin/bash

# Allow tunneling.
mkdir -p /dev/net
mknod /dev/net/tun c 10 200

# Start services.
/opt/cisco/anyconnect/bin/vpnagentd -d > agent-stdout.txt 2> agent-stderr.txt &

# Connect to VPN.
/opt/cisco/anyconnect/bin/vpn connect $1

# Run a daemon here that keeps the container alive.

Наконец, я скину контейнер вот так.

docker run -it --rm --cap-add=NET_ADMIN vpn-connector uri.to.vpn.com

В выводе оператора VPN connect, похоже, возникла ошибка "Драйвер клиента VPN обнаружил ошибку. Пожалуйста, перезагрузите компьютер или устройство и повторите попытку."

  >> state: Connecting
  >> notice: Establishing VPN session...
  >> notice: Establishing VPN - Initiating connection...
  >> notice: Establishing VPN - Examining system...
  >> notice: Establishing VPN - Activating VPN adapter...
  >> state: Disconnecting
  >> notice: Disconnect in progress, please wait...
  >> error: The VPN client driver encountered an error.  Please restart your computer or device, then try again.
  >> state: Disconnected

Таким образом, возможно, существует проблема, из-за которой cscotun0, которую обычно создает клиент AnyConnect, не может быть создан должным образом. Я пробовал это на Linux, Mac и Linux-режиме на Windows, и все они терпят неудачу с той же ошибкой. Однако при жестоком повороте событий соединение устанавливается только тогда, когда этот контейнер запускается с использованием LCOW (то есть Docker для Windows с выбранными контейнерами Windows).

Я попробовал все. Я пытался --privileged. Я попытался смонтировать /dev/net/tun с хоста. Я пробовал правила SNAT на хосте и т. Д. Ничего не помогло. Он работает только на LCOW, и я понятия не имею, почему это единственный сценарий, в котором интерфейс создается успешно и соединение успешно.

Есть идеи, друзья?

1 Ответ

0 голосов
/ 23 апреля 2019

Похоже, проблема в том, что Docker монтирует определенные файлы, такие как /etc/resolv.conf, чтобы поддерживать их в актуальном состоянии с изменениями в хост-системе.

Исправление, которое я обнаружил, заключалось в добавлении --cap-add=SYS_ADMIN к docker run команда (чтобы разрешить размонтирование).Затем мне пришлось физически размонтировать файл в сценарии запуска.

cp /etc/resolv.conf /etc/resolv.conf.bak
umount /etc/resolv.conf
cp /etc/resolv.conf.bak /etc/resolv.conf

После этого он, казалось, работал просто отлично.

...