docker - 在 Ubuntu Docker 容器内创建 VPN 适配器失败,LCOW 除外?
问题描述
基本上,我正在构建一个连接到 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
因此,似乎可能存在cscotun0
无法正确创建 AnyConnect 客户端通常创建的问题。我已经在 Linux、Mac 和 Windows 上的 Linux 模式上尝试过这个,但它们都失败并出现相同的错误。 然而,在一个残酷的事件中,只有当这个容器使用 LCOW 运行(即,Docker for Windows 并选择了 Windows 容器)时,连接才会成功。
我已经尝试了一切。我试过了--privileged
。我已经尝试/dev/net/tun
从主机安装。我已经在主机等上尝试了 SNAT 规则。没有任何效果。它仅适用于 LCOW,我不知道为什么这是成功创建接口并且连接成功的唯一场景。
有什么想法吗朋友们
解决方案
似乎问题在于 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
在那之后,它似乎工作得很好。
推荐阅读
- c# - 加载资源失败:服务器响应状态为 404 ()...在我右键单击并单击查看页面上的“INSPECT”后,我收到此错误
- python - 如何更改pyglet中的pixel_ratio?
- angular - 启用 ChangeDetectionStrategy.OnPush 后 UI 不更新
- java - 在Custom Adapter的getView函数中添加Buttons
- html - 单击时在两个活动选项卡之间来回切换 - jQuery
- angular - 如何从支付网站重定向回我的 ionic 应用程序
- ffmpeg - ffmpeg 将 mp4 视频转换为 rgba 流
- tensorflow2.0 - 如何使用 tensorflow 的 FFT?
- c - fprintf 的堆缓冲区溢出
- javascript - 在我的 express API 项目的其他文件夹中使用时,特定文件夹中的 sqlite3 sql 查询函数不起作用