内容提要
文章介绍在Docker Desktop中部署多个UniVPN容器,使多套VPN连接共存。每个容器拥有独立网卡和路由,通过不同本地端口转发内网SSH服务,避免额外开虚拟机。文中给出镜像构建、环境变量配置、启动命令及日志、网卡、路由排查方法,并提醒容器隔离不能绕过VPN服务端并发限制。
延伸解读
容器隔离的边界与前提
文章强调每个 UniVPN 容器必须使用默认 bridge 网络,不能加 --network=host 或共享网络命名空间,否则 cnem_vnic 网卡和路由会暴露在宿主机上,失去隔离。这种隔离让两个容器可以使用相同网卡名和内网 IP,但前提是 Docker Desktop 已切换为 Linux 容器,且 Linux 客户端适配网关。隔离仅作用于网络层,不改变 VPN 服务端的账号并发策略。
端口转发是访问内网服务的唯一通道
容器内的 VPN 不会自动接管 Windows 应用,文章通过 socat 在容器内监听 2222,将连接转发到 FORWARD_TARGET 的 SSH 端口,再映射到宿主机不同本地端口。读者需注意,这仅转发单个 TCP 服务;若要访问数据库等其他端口,需增加 socat 监听和端口映射。若想让浏览器按代理访问更多内网地址,需另配 SOCKS/HTTP 代理,仅启动容器不会提供代理服务。
凭据管理与排查顺序
env 文件包含 VPN 密码,文章提醒只保存在本机、不提交 Git,且环境变量可被有 Docker 管理权限的人查看。排查时应按顺序:先看日志确认登录成功,再检查 cnem_vnic 网卡是否存在,然后用 ip route get 确认目标 IP 走 VPN 路由,最后测试本地 SSH 入口。端口已监听不代表 VPN 已连通。若提示密码错误,需先停止容器再核对认证信息。
Q&A
为什么在 Docker 里跑多个 UniVPN 容器能同时连不同的 VPN 而不冲突?
因为每个容器有独立的网络命名空间,UniVPN 创建的 cnem_vnic 网卡和下发的内网路由都留在各自容器内,所以即使网卡名相同、内网 IP 重复,也能通过不同本地端口区分入口。注意不要给容器加 --network=host 或共享其他容器的网络命名空间,否则会失去隔离。
怎么构建一个能跑 UniVPN 并转发内网 SSH 的 Docker 镜像?
在空目录新建 Dockerfile,基于第三方镜像 jesusdf/huawei-vpn(固定摘要),安装 socat,修改 connect.exp 兼容登录成功提示大小写并关闭回显;再写 vpn-forward.sh,用 socat 监听容器内 2222 端口并转发到 FORWARD_TARGET:FORWARD_PORT,最后执行 docker build -t univpn-forward:local . 构建。
启动两个 UniVPN 容器的 docker run 命令需要哪些关键参数?
需要 --cap-add=NET_ADMIN 和 --device=/dev/net/tun 来建立 VPN 网卡,用 --env-file 传入各自的 VPN 配置,并用 -p 127.0.0.1:22221:2222 和 -p 127.0.0.1:22222:2222 把容器内 2222 映射到不同本地端口。两条命令都使用默认 bridge 网络,容器名和认证文件独立。
Windows 上的 SSH 工具如何访问不同 VPN 后面的内网服务器?
SSH 工具直接连接 127.0.0.1:22221 或 127.0.0.1:22222,登录身份用目标服务器的账号或密钥(不是 VPN 账号)。也可以在 ~/.ssh/config 中为两个入口写别名,之后用 ssh vpn-a-node 或 ssh vpn-b-node 访问,VS Code Remote SSH、SFTP 等工具同样可用。
UniVPN 容器启动后连不上内网,应该按什么顺序排查?
先用 docker logs 确认登录成功,再用 docker exec 查看 cnem_vnic 网卡是否存在,然后用 ip route get 检查目标 IP 是否走 VPN 路由,最后测试本地 SSH 入口。端口已监听不代表 VPN 已连通;若提示密码错误,先停止容器再核对认证信息。
用 Docker 隔离多个 UniVPN 容器,能绕过 VPN 服务端的并发登录限制吗?
不能。容器隔离只解决本地网卡和路由冲突,同账号能否多端在线仍取决于 VPN 网关的策略,容器隔离无法绕过服务端的账号并发限制。
除了 SSH,还能通过这个 UniVPN 容器访问数据库或让浏览器走代理吗?
可以增加 socat 监听和 Docker 端口映射来转发数据库等其他 TCP 端口;但仅启动 UniVPN 容器不会自动提供 SOCKS/HTTP 代理,若要让浏览器按代理访问更多内网地址,需要另外配置代理服务。