在docker swarm中,使用覆盖网络将docker容器隐藏在OpenVPN后面

在docker swarm中,使用覆盖网络将docker容器隐藏在OpenVPN后面,docker,dns,docker-swarm,traefik,openvpn,Docker,Dns,Docker Swarm,Traefik,Openvpn,目标是:在docker swarm上部署一组服务,其中一个服务仅在我连接到OpenVPN服务器时可用,OpenVPN服务器也已在docker swarm上启动 当我连接到VPN时,如何一步一步地只连接到浏览器中有域的whoami示例容器 背景 一般的想法是,比如说,kibana和elasticsearch在内部运行,只有在VPN上(更像是企业网络)才能访问,其他服务正常地公开运行。这些都将在单独的节点上,所以我使用的是覆盖网络 我确实在docker swarm上运行OpenVPN以及一个容器,我

目标是:在docker swarm上部署一组服务,其中一个服务仅在我连接到OpenVPN服务器时可用,OpenVPN服务器也已在docker swarm上启动

当我连接到VPN时,如何一步一步地只连接到浏览器中有域的whoami示例容器

背景 一般的想法是,比如说,kibana和elasticsearch在内部运行,只有在VPN上(更像是企业网络)才能访问,其他服务正常地公开运行。这些都将在单独的节点上,所以我使用的是覆盖网络

我确实在docker swarm上运行OpenVPN以及一个容器,我可以连接到VPN,但是看起来IP并没有变化,我不知道如何使它只在VPN上可用,特别是考虑到我使用的是多主机。我还使用了一个反向代理,为通配符域提供了一个几乎自动的letsencrypt设置(通过DNS挑战)。有了这个,我可以得到:

但我还想连接到
vpn.mydomain.com
(我现在可以这样做),然后可以访问:

…我不能。然而我已经在不同的地方发布了我的帖子,以防你想看一看,因为如果我在这里发布,这个帖子会变得太大

让我们从我现在的位置开始

OpenVPN 首先,OpenVPN和docker swarm的有趣之处在于OpenVPN需要在特权模式下运行,因为它必须改变网络接口和其他功能。因此,我们的想法是通过一种方式来启动容器,该方式将手动运行容器,并为您添加这些权限。目前这是一个解决方案,但这意味着您可以使用swarm部署服务

以下是我为OpenVPN编写的docker:

    vpn-udp:
        image: ixdotai/swarm-launcher:latest
        hostname: mainnode
        environment:
            LAUNCH_IMAGE: ixdotai/openvpn:latest
            LAUNCH_PULL: 'true'
            LAUNCH_EXT_NETWORKS: 'app-net'
            LAUNCH_PROJECT_NAME: 'vpn'
            LAUNCH_SERVICE_NAME: 'vpn-udp'
            LAUNCH_CAP_ADD: 'NET_ADMIN'
            LAUNCH_PRIVILEGED: 'true'
            LAUNCH_ENVIRONMENTS: 'OVPN_NATDEVICE=eth1'
            LAUNCH_VOLUMES: '/etc/openvpn:/etc/openvpn:rw'
        volumes:
            - '/var/run/docker.sock:/var/run/docker.sock:rw'
        networks:
            - my-net
        deploy:
            placement:
                constraints:
                    - node.hostname==mainnode
我可以使用:
docker stack deploy——使用registry auth——编写文件docker/docker-compose.prod.yml我的应用程序名
,这就是我在其余部分中使用的。重要的是,我不能仅仅部署它,因为它还不能加载。OpenVPN配置需要存在于节点上的
/etc/OpenVPN
中,然后将其装入容器中,我在设置过程中执行此操作:

// Note that you have to create the overlay network with --attachable for standalone containers
docker network create -d overlay app-net --attachable

// Create the config
docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm ixdotai/openvpn ovpn_genconfig -u udp://vpn.mydomain.com:1194 -b

// Generate all the vpn files, setup etc
docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm ixdotai/openvpn bash -c 'yes yes | EASYRSA_REQ_CN=vpn.mydomain.com ovpn_initpki nopass'

// Setup a client config and grab the .ovpn file used for connecting
docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm ixdotai/openvpn easyrsa build-client-full client nopass

docker run -v /etc/openvpn:/etc/openvpn --log-driver=none --rm ixdotai/openvpn ovpn_getclient client > client.ovpn
现在,我有了一个可连接的覆盖网络,当我部署它时,OpenVPN已经启动并在第一个节点上运行。我可以获取
client.ovpn
的副本并连接到VPN。即使我勾选了“通过VPN发送所有流量”,看起来IP并没有被改变,我仍然远没有在它后面隐藏一个容器


哇 此简单容器可以在docker compose中部署以下组件:

    whoami:
        image: "containous/whoami"
        hostname: mainnode
        networks:
            - ${DOCKER_NETWORK_NAME}
        ports:
            - 1337:80
        deploy:
            placement:
                constraints:
                    - node.hostname==mainnode
我将端口
1337
放在那里进行测试,因为我可以访问我的IP:1337并查看它,但这并没有实现我的目标,即只有连接到OpenVPN时才能解析
whoami.mydomain.com


连接到vpn时,我可以ping一个
192.168
地址 我在主机节点上运行了以下操作:

ip-4地址添加192.168.146.16/24 dev eth0

然后当连接到VPN时,我可以解析这个地址!所以看起来至少有些东西在起作用

我怎样才能实现上面提到的目标?需要什么?需要存在什么OpenVPN配置、什么网络配置和什么容器配置?我是否需要下面建议的自定义DNS解决方案?还有什么更好的选择


一些考虑:

  • 我可以拥有域名,包括私有域名
    whoami.mydomain.com
    public。我想这意味着我可以使用https并轻松获得通配符证书?但我的困惑是——如何在不使用自签名证书的情况下,仅在VPN上获取这些域,同时为它们提供tls证书

  • 我还可以运行自己的DNS服务器进行解析。我已经试过了,但我就是不能让它工作,可能是因为VPN部分还没有正常工作。为此,我找到了,我必须将前面提到的本地ip添加到
    resolve.conf
    ,以使任何东西在本地工作。但是域在连接到VPN时仍然无法解析,因此看起来DNS流量也不会通过VPN(即使我将其设置为这样-我的客户端是这样)

  • 有人提到使用网桥网络,但网桥网络不适用于多主机

到目前为止的资源(我将更新更多) -


-我看到其他Github线程中的多人引用了它,认为它基本上没有帮助,其中一个链接已经失效了。

旁注:如果这转到serverfault,我在那里总共有123个代表,考虑到绝对缺乏任何核心知识,我无法提供我期望的奖励我唯一的希望可能是stackoverflow:/看来你完成了网络设置(部分原因是你拥有共享网络并在客户端上添加了静态路由)。现在,您可能需要为您的私有子域设置非常短的公共DNS SOA,并拥有自己的DNS服务器,以便它可以解析
whoami
容器。您可能可以重用Traefik生成通配符证书,并将其复制到您的私有容器中(Traefik面向公众,我认为您不应该使用它访问隐藏的容器),但您可能会发现在那里不使用ssl更容易,因为vpn已经对您的连接进行了加密。@帖木儿,我想这最后一个谜题是我不理解的。用traefik设置dnsmasq并让所有内容都路由是我无法理解的,因此获得了奖金。奖金在这里过期,所以200个代表消失了。我尝试过他re,reddit,其他地方,但看起来真的不可能。。。。