Цель: развернуть на 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, и одна из ссылок не работает