Цель: развернуть на роу докеров набор сервисов, одна из которых доступна мне только тогда, когда я подключен к серверу OpenVPN, который также был развернут в рое докеров.
Общая идея заключалась бы в том, чтобы, скажем, внутренне выполнялись kibana и elasticsearch, к которым можно было получить доступ только в VPN (скорее, как в корпоративной сети), при этом другие службы работают нормально публично, как обычно. Все они будут на разных узлах, поэтому я использую наложенную сеть..
У меня действительно есть OpenVPN, работающий на docker swarm вместе с кто я контейнера, и я могу подключиться к VPN, однако не похоже, что IP-адрес меняется, и я не знаю, как сделать так, чтобы контейнер whoami был доступен только при подключении к VPN, особенно учитывая, что я использую оверлейная сеть который является мульти-хостом. Я также использую Traefik, обратный прокси, который предоставляет мне в основном автоматическую настройку letsencrypt (через запрос DNS) для доменов с подстановочными знаками. Благодаря этому я могу получить:
Но я также хочу подключиться к vpn.mydomain.com
(что я могу сделать прямо сейчас), а затем смогу посетить:
... чего я не могу. Все же. Я разместил свой конфигурация traefik в другом месте на случай, если вы захотите взглянуть, так как эта ветка станет слишком большой, если я опубликую ее здесь.
Начнем с того, где я сейчас нахожусь.
Во-первых, интересная особенность 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, как я предлагаю ниже? Какие есть лучшие альтернативы?
Некоторые соображения:
Могу иметь домены, в том числе частный whoami.mydomain.com
общественность. Это означает, что у меня будет https и я легко получу для них подстановочные сертификаты? Но я не понимаю, как я могу получить эти домены только через VPN, но также иметь для них сертификаты tls без использования самозаверяющего сертификата?
Я также могу запустить свой собственный DNS-сервер для разрешения. Я пробовал это, но у меня просто не получалось заставить его работать, вероятно, потому, что часть VPN еще не работает должным образом. я нашел dnsmasq для этого мне пришлось добавить вышеупомянутый локальный IP-адрес в resolve.conf
чтобы что-нибудь работало для этого локально. Но домены по-прежнему не разрешаются при подключении к VPN, поэтому не похоже, что трафик DNS проходил через VPN (даже если я установил его как таковой - мой клиент вязкость.
Некоторые упоминают использование мостовой сети, но мостовая сеть не работает для нескольких хостов.
- Использование swarm-launcher для развертывания OpenVPN
- Совершенно необъяснимый ответ на stackexchange я видел, как многие люди в других потоках Github ссылаются на него как на бесполезный, и одна из ссылок мертва