Назад | Перейти на главную страницу

Использование traefik и docker для безопасного публичного доступа к некоторым контейнерам

У меня есть 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 заголовок.