在帖子中将 Docker 容器隐藏在 游戏手游加速器 后面我曾介绍过如何建立一个隔离的 Docker 网络,以容纳并为不带身份验证的 Docker 容器添加身份验证。 就身份验证而言,从你的机器到 VPN 和其他容器所在的子网之间都是安全的。

但是,我们只能使用 VPN 内的容器 IP 访问它们,因为外部 DNS 服务不知道 VPN 内的情况。 这对于习惯于使用完全合格域名访问网站的我们来说,既违反直觉又麻烦。 因此,这次我将介绍如何在 VPN 内托管域名服务(DNS),以便在启动新容器时自动提供名称解析。
不过,在向你展示如何操作之前,我应该先了解一下这种基于 DNS 的方法与它的替代方法,即在 VPN 内使用带有 HTTPS 的 Nginx 反向代理的比较。
游戏手游加速器
你可能会问,为什么要使用 DNS? 您可以使用Nginx反向代理,根据请求的域名重定向流量,然后将您想用于内部容器的域名指向Nginx反向代理的公开访问DNS。 即使访问者可以看到 Nginx 服务器的 IP,他们也只能在连接到 VPN 时才能访问 Nginx 服务器,而你应该是唯一可以访问的人。
none

人都是懒惰的,我就是懒惰。
坦率地说,使用 Nginx 反向代理可能是最合适的方法,因为可以同时获得 VPN 和 HTTPS 的安全优势。 不过,我比较懒,我宁愿牺牲 VPN 的安全性,因为只有我一个人在使用它。 不过,如果你与其他人共享 VPN 访问权,我强烈建议你在 VPN 内也使用 HTTPS。
但如果只有你一个人,那么 VPN 网络内部的安全性就不那么重要了,即使凭证可能会被记录下来,并通过外部日志聚合服务/Docker 卷逃出 VPN 的控制范围。
游戏手游加速器
- 1GB 内存的 Linode 实例
- Ubuntu 18.04
- Docker 18.06.1-ce
- Docker 映像
- 虛擬專用網絡:hwdsl2/ipsec-vpn-server
- 域名系统:defreitas/dns-proxy-server
- 网络服务:nginx:1.13.8-alpine
游戏手游加速器
假设您已经阅读并遵循了最后发表none

我们的目标是为 VPN 添加一个 DNS,它可以解析 VPN 内服务的主机名,并能在容器启动/停止时自动添加/删除 DNS 条目。 VPN 用户应使用内部 DNS 作为主 DNS,外部 DNS(如 1.1.1.1 或 8.8.8.8)作为二级和三级 DNS。

游戏手游加速器
假设存在一个 Docker 桥接网络172.20.0.0/16
叫做虚拟专用网络
让我们使用固定 IP 启动一个容器172.20.0.4
none
none
DNS 的一个好处是,除了启动它,我们不需要做任何事情。 该服务将监听容器的启动/停止,并重新配置自己以解析这些服务的主机名。
游戏手游加速器
回顾none
none
# vpn.游戏手游加速器_IPSEC_PSK=your_ipsec_pre_shared_游戏手游加速器_USER=your_vpn_游戏手游加速器_PASSWORD=your_vpn_password
现在有了新的 VPN,我们应该对 VPN 进行配置,使其使用内部 DNS 而不是系统默认的 DNS 进行域名解析。
# vpn.游戏手游加速器_IPSEC_PSK=your_ipsec_pre_shared_游戏手游加速器_USER=your_vpn_游戏手游加速器_PASSWORD=your_vpn_游戏手游加速器_DNS_SRV1=172.20.0.游戏手游加速器_DNS_SRV2=1.1.1.1
让我们重新创建容器。
docker stop ipsec-vpn-server docker rm ipsec-vpn-server docker run \ --name ipsec-vpn-server \ --env-file ./vpn.env \ --restart=always \ 游戏手游加速器 \ -p 500:500/udp \ -p 4500:4500/udp \ -v /lib/modules:/lib/modules:ro \ -d --privileged \ hwdsl2/ipsec-vpn-server
游戏手游加速器
我们需要重新创建上次的蜥蜴人网站,为其添加一个主机名。 这次没有指定 IP,因为一旦我们通过 DNS 解析了主机名,容器的 IP 就不再重要了。
docker stop test-web docker rm test-web docker run\ --name test-web\ -v `pwd`:/usr/share/nginx/html:ro\ 游戏手游加速器\ --hostname test.lan\ --restart=always\ -d nginx:1.13.8-alpine
游戏手游加速器
您可以参考本指南用于从个人电脑或移动设备连接到 VPN。
在安卓系统上,您可以选择使用172.20.0.4
作为您的 DNS。 即使您不这样做,VPN 本身也会使用我们的内部 DNS 服务作为主 DNS。
连接到 VPN 并导航到网络服务器的 IP 将通过内部 DNS 解析。

正如我之前所说,使用这种方法,你只能通过 HTTP 访问容器。 你可以多走一步,获得自签名证书,或在 HTTP/DNS 挑战中欺骗 Let's encrypt,以获得合法证书。 我从未尝试过这种方法,所以不能保证一定有效。
尽管浏览器是通过 HTTP 与网络服务器通信的,但流量实际上是通过 VPN 隧道传输的,因此在我的电脑和服务器之间不会被嗅探到。 流量从 VPN 服务器传到同一子网中的容器,这意味着流量无需离开托管这些服务的机器。 在我看来,这已经足够安全方便了。
游戏手游加速器
我遇到的一件事是,许多服务往往使用 80 端口以外的端口。 最有名的是 3000 和 8080,还有一些服务开发人员决定监听的神奇数字。
nonevcs.lan
我很难记住 Git 服务器的端口号 6003。
在 VPN+DNS 设置中,解决这个问题的一个可行方法是运行内部链接缩短器服务。 例如,您可以通过导航到g/vcs
将您重定向到网络内的版本控制站点vcs.lan:6003
其中g
是链接缩短器服务的主机名。
none
nonetommyku/golk到目前为止,它仍处于起步阶段。 它能完成工作,为什么不呢?