У меня есть 16-ядерный сервер на 128 ГБ, который обрабатывает все виды вещей дома. На виртуальной машине я запускаю контроллер домена Windows, и все мои ПК с Windows присоединены к этому домену.
На сервере я также запускаю несколько сервисов в контейнерах Docker. Первоначально я обращался к ним, запоминая порты, на которых я их запускал, но когда я нашел Traefik, я настроил его и добавил записи DNS в свой DNS домена, чтобы все службы указывали на IP-адрес сервера.
Я также установил свой собственный внутренний центр сертификации в своем ящике pfsense и создал подстановочный сертификат для всех моих маршрутизируемых служб Traefik.
Я использую «официальный» образ Docker Traefik, и моя конфигурация выглядит так.
docker-compose.yml
services:
traefik:
image: traefik:1.5.4
restart: always
ports:
- 8088:8080
- 80:80
- 443:443
networks:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /docker/containers/traefik/traefik.toml:/traefik.toml
- /docker/containers/traefik/acme.json:/acme.json
container_name: traefik
networks:
web:
external: true
Чтобы traefik.toml я добавил
# Entrypoints to be used by frontends that do not specify any entrypoint.
# Each frontend can specify its own entrypoints.
#
# Optional
# Default: ["http"]
#
defaultEntryPoints = ["http", "https"]
################################################################
# Entrypoints configuration
################################################################
# Entrypoints definition
#
# Optional
# Default:
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
certFile = "/certs/wildcard.internal.my.domain.com.crt"
keyFile = "/certs/wildcard.internal.my.domain.com.key"
Затем для данного контейнера Docker я установил Этикетки лайк traefik.basic.frontend.rule
чтобы выполнить все необходимые настройки, чтобы маршрутизация работала для этого контейнера.
Это отлично работает, и весь трафик к моим службам может быть выполнен с использованием легко запоминающихся URL-адресов, и весь трафик зашифрован через SSL с использованием сертификата wild card без необходимости создавать новые сертификаты для каждого сервера или изменять конфигурации.
Теперь «проблема» в том, что я хочу разместить на сервере несколько общедоступных веб-сайтов. В качестве аргумента я хочу, чтобы все в internal.my.domain.com было доступно только в моей сети и, например, что-то вроде foo.my.domain.com и bar.my.domain.com было доступно извне. Я понимаю, что мне придется создать общедоступные записи для этих доменов, указывающие на мой сервер здесь, дома.
Но мои вопросы
Кроме того, имея четырехпортовый сетевой адаптер на моем блоке pfsense и несколько внешних IP-адресов, я также думаю о том, чтобы иметь один внешний IP-адрес, который я использую для общедоступных материалов, и один, который обрабатывает мой «нормальный» трафик. Контролировать этот IP-адрес, который я использую для всего личного трафика, не так просто узнать, как пинговать одно из моих внешних имен хоста, а затем DOS, когда я играю в игру :).
Могу ли я настроить контейнеры Docker так, чтобы некоторые из них были доступны только внутри сети, а некоторые - снаружи?
Не добавляйте домены в свой DNS. Для контейнеров интрасети используйте домен, например myservice.myintranet.local
, которая не разрешима извне.
Если вам нужна дополнительная безопасность, вы можете создать другую точку входа с Белый список IP. Или вы можете использовать ярлыки (прочтите последние 2 строки этой таблицы), если хотите.
Могу ли я настроить traefik для обработки маршрутизации трафика к нужным контейнерам, а также для обработки того, что некоторые из них являются «внешними», а некоторые - только внутренними?
Traefik обслуживает ваш контейнер на основе Host
заголовок, поэтому вам нужно только настроить фильтрацию IP (а не создавать общедоступные записи DNS) для защиты контейнеров / доменов интрасети извне, при этом разрешая трафик в ваши общедоступные контейнеры / домены.
Могу ли я настроить интеграцию Let's encrypt в traefik, чтобы обеспечить шифрование всех «внешних» адресов и сохранить самозаверяющий сертификат с подстановочными знаками моего собственного CA для моих внутренних сервисов?
Я никогда не тестировал это, но вы можете создать другую точку входа и использовать ее в своем конфигурация acme. Пример:
[entryPoints]
...
[entryPoints.httpsle]
address = ":443"
[entryPoints.httpsle.tls]
[acme]
...
entryPoint = "httpsle"
И используйте эту точку входа с метками для ваших общедоступных поддоменов, которые будут автоматически подписаны с помощью Let's Encrypt.
Как бы мне проще всего это настроить? Лучше ли использовать виртуальный интерфейс на моем сервере (под управлением Ubuntu) или другой выделенный порт Ethernet (у него два)?
Я думаю, что лучшим подходом было бы назначить вашему серверу 2 IP-адреса в вашей локальной сети, по одному для каждого порта Ethernet.
Как мне настроить traefik для обработки трафика на нескольких интерфейсах?
Вам не нужно ничего настраивать. Предоставляя вашему серверу 2 IP-адреса (один для публичного хостинга и один для личного трафика / интранета), он получит запрос к ним обоим. Затем Traefik направит запросы в правильный контейнер на основе Host
заголовок.