Сокрытие docker контейнера за OpenVPN, в docker рое, с оверлейной сетью - PullRequest
5 голосов
/ 15 апреля 2020

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

Как я могу, шаг за шагом , подключаться только к контейнеру примера whoami с доменом в браузере, когда я подключен к VPN?

Справочная информация

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

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

https://traefik.mydomain.com

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

https://whoami.mydomain.com

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

Давайте начнем с того, где я я сейчас.

OpenVPN

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

Вот мой docker -компонент для 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. Даже если я проверю «отправить все трафики c через VPN», похоже, что IP не изменяется, и я все еще не могу скрыть контейнер за ним.


Whoami

Этот простой контейнер может быть развернут с помощью 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, как я предлагаю ниже? Какие есть лучшие альтернативы?


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

  • Я могу иметь домены, включая частный whoami.mydomain.com publi c. Это значит, что у меня будет https и я легко получу сертификаты подстановки для них, я полагаю? Но моя путаница заключается в том, как я могу получить эти домены только через VPN, но при этом иметь сертификаты tls для них без использования самозаверяющего сертификата?

  • Я также могу запустить свой собственный DNS сервер для разрешения. Я пробовал это, но я просто не мог заставить его работать, вероятно, потому что часть VPN еще не работает должным образом. Я нашел dnsmasq для этого, и мне пришлось добавить вышеупомянутый локальный ip к resolve.conf, чтобы все работало локально для этого. Но домены по-прежнему не разрешаются при подключении к VPN, поэтому не похоже, чтобы трафик DNS c проходил через VPN (даже если я настроил его так - мой клиент вязкость .

  • Некоторые упоминают использование мостовой сети, но мостовая сеть не работает для нескольких хостов

Ресурсы до сих пор (я обновлю с подробнее)

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

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

...