Тем временем я нашел причину моей проблемы (не уверен, что является лучшим решением). На случай, если кому-то интересно, я постараюсь объяснить.
У меня Рой из трех узлов, в сети prod.company.de
Мой клиент находится в другой сети intranet.comnpany.de
Мой менеджер роя обращен к docker-manager.prod.company.de. На этом хосте я развернул службу traefik, доступ к которой я хочу получить через https://docker -manager.prod.company.de (Это порт 443 и из-за конфигурации traefik, перенаправленной на панель мониторинга traefik на 8080 внутри контейнера).
Если я отслеживаю свой сетевой трафик, я вижу, что запрос https (https://docker -manager.prod.company.de ) от моего клиентского браузера достигает сервера, а затем трафик перенаправляется на адрес docker_gwbridge 17.18.0.2. Но ответ не находит пути к моему клиенту из-за конфигурации NAT докера.
iptables -t nat -L -v
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
8 504 MASQUERADE all -- any docker_gwbridge anywhere anywhere ADDRTYPE match src-type LOCAL
0 0 MASQUERADE all -- any !docker0 172.17.0.0/16 anywhere
0 0 MASQUERADE all -- any !docker_gwbridge 172.18.0.0/16 anywhere
MASQERADE говорит, что исходный IP-адрес запроса должен быть заменен на IP-адрес моста (в моем случае 172.18.0.1), чтобы ответы направлялись обратно на этот IP-адрес. В приведенном выше случае правило 8 504 MASQUERADE all -- any docker_gwbridge anywhere anywhere
будет делать это, но оно ограничено запросами от LOCAL ADDRTYPE match src-type LOCAL
, что означает, что использование браузера на хосте докера будет работать, но мои подключения от клиента не будут работать, потому что ответ не найдет пути к моему адресу клиента.
В настоящее время я добавил еще одно правило NAT в свои iptables:
iptables -t nat -A POSTROUTING -o docker_gwbridge -j MASQUERADE
, что приводит к
1 52 MASQUERADE all -- any docker_gwbridge anywhere anywhere
После этого я вижу трафик Dashboard при открытии https://docker -manager.prod.company.de в моем браузере на клиенте.
Но я не понимаю, зачем мне это делать, потому что я ничего не нашел об этом ни в одной документации, и я не думаю, что мой случай использования действительно редок. Вот почему я был бы счастлив, если бы кто-то мог взглянуть на этот пост и, возможно, проверить, сделал ли я что-то другое неправильно или объяснить, почему я должен делать такие вещи, чтобы заставить работать стандартный сценарий использования.
С уважением