По сути, я создаю контейнер, который подключается к 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, и я понятия не имею, почему это единственный сценарий, в котором интерфейс создается успешно и соединение успешно.
Есть идеи, друзья?