基本上,我正在构建一个连接到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
。我曾在Linux,Mac和Windows的Linux模式下尝试过此操作,但它们均因相同的错误而失败。 但是,在激烈的事件中,只有在使用LCOW(即选择了Windows容器的Windows Docker)运行此容器时,连接才能成功。
我已经尝试了一切。我已经尝试过--privileged
。我尝试从主机上挂载/dev/net/tun
。我已经在主机等上尝试过SNAT规则。没有任何反应。它仅适用于LCOW,我不知道为什么这是唯一成功创建接口且成功连接的场景。
有什么想法吗,朋友?
答案 0 :(得分:0)
问题似乎在于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
在那之后,它似乎工作正常。