除了在LCOW上,VPN适配器创建在Ubuntu Docker容器内失败?

问题描述 投票:-1回答:1

基本上,我正在构建一个连接到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连接语句的输出似乎在“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

因此,似乎可能存在无法正确创建AnyConnect客户端通常会创建的cscotun0的问题。我已在Windows上的Linux,Mac和Linux模式上尝试过这种方法,但它们都会因同样的错误而失败。但是,在一个残酷的事件发生时,只有当使用LCOW运行此容器时(即,选择了Windows容器的Docker for Windows),连接才会成功。

我尝试了一切。我试过--privileged。我试过从主机安装/dev/net/tun。我在主机等上尝试过SNAT规则。没有任何效果。它只适用于LCOW,我不知道为什么这是成功创建接口并且连接成功的唯一场景。

任何想法,朋友?

docker vpn cisco tunnel docker-for-windows
1个回答
-1
投票

似乎问题是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

在那之后,它似乎工作得很好。

© www.soinside.com 2019 - 2024. All rights reserved.