Назад | Перейти на главную страницу

Скрытие контейнера докеров за OpenVPN, в рое докеров, с наложенной сетью

Цель: развернуть на роу докеров набор сервисов, одна из которых доступна мне только тогда, когда я подключен к серверу OpenVPN, который также был развернут в рое докеров.

Задний план

Общая идея заключалась бы в том, чтобы, скажем, внутренне выполнялись kibana и elasticsearch, к которым можно было получить доступ только в VPN (скорее, как в корпоративной сети), при этом другие службы работают нормально публично, как обычно. Все они будут на разных узлах, поэтому я использую наложенную сеть..

У меня действительно есть OpenVPN, работающий на docker swarm вместе с кто я контейнера, и я могу подключиться к VPN, однако не похоже, что IP-адрес меняется, и я не знаю, как сделать так, чтобы контейнер whoami был доступен только при подключении к VPN, особенно учитывая, что я использую оверлейная сеть который является мульти-хостом. Я также использую Traefik, обратный прокси, который предоставляет мне в основном автоматическую настройку letsencrypt (через запрос DNS) для доменов с подстановочными знаками. Благодаря этому я могу получить:

https://traefik.mydomain.com

Но я также хочу подключиться к vpn.mydomain.com (что я могу сделать прямо сейчас), а затем смогу посетить:

https://whoami.mydomain.com

... чего я не могу. Все же. Я разместил свой конфигурация traefik в другом месте на случай, если вы захотите взглянуть, так как эта ветка станет слишком большой, если я опубликую ее здесь.

Начнем с того, где я сейчас нахожусь.

OpenVPN

Во-первых, интересная особенность OpenVPN и роя докеров заключается в том, что OpenVPN должен работать в привилегированном режиме, потому что он должен, среди прочего, вносить изменения в сетевые интерфейсы и рой не имеет CAP_ADD возможностей пока нет. Итак, идея состоит в том, чтобы запустить контейнер через своего рода 'прокси-контейнер' который запустит контейнер вручную с этими привилегиями, добавленными за вас. На данный момент это обходной путь, но это означает, что вы можете развернуть службу с помощью swarm.

Вот мой docker-compose для OpenVPN:

    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 --with-registry-auth --compose-file docker/docker-compose.prod.yml my-app-name и это то, что я использую для остальных. Важно отметить, что я не могу просто развернуть это, так как он еще не загружается. Конфигурация 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 и увидеть его, но это не достигает моей цели - иметь whoami.mydomain.com разрешается только при подключении к OpenVPN.


Я могу пинговать 192.168 адрес при подключении к vpn

Я выполнил на хост-узле следующее:

ip -4 адрес добавить 192.168.146.16/24 dev eth0

Тогда при подключении к VPN я могу разрешить этот адрес! Так похоже что-то работает по крайней мере.

Как я могу достичь цели, указанной вверху? Что требуется? Какая конфигурация OpenVPN должна существовать, какая конфигурация сети и какая конфигурация контейнера? Нужно ли мне настраиваемое решение DNS, как я предлагаю ниже? Какие есть лучшие альтернативы?


Некоторые соображения:

Ресурсы на данный момент (я буду обновлять больше)

- Использование swarm-launcher для развертывания OpenVPN

- Совершенно необъяснимый ответ на stackexchange я видел, как многие люди в других потоках Github ссылаются на него как на бесполезный, и одна из ссылок мертва