Вопрос или проблема
Вот моя настройка:
- У меня есть несколько пространств имен, и некоторые из них содержат поды, которые открывают порты RDP.
- Порт 3389 блокируется файрволом, поэтому я должен использовать другой порт, который сопоставляется с портом 3389 на поде.
Так как это TCP-соединение, я попробовал:
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: rdp-ingress
namespace: ns1
spec:
entryPoints:
- metrics
routes:
- match: HostSNI(`ns1.example.domain.com`)
services:
- name: windows
port: 3389
tls:
secretName: tls-cert
Однако, похоже, что это завершает TLS-соединение, поэтому вместо этого мне нужен проброс:
tls:
passthrough: true
Поэтому я настроил Windows использовать этот сертификат (без подстановочных знаков) для RDP подключения, и это работает (я настроил сервис балансировки нагрузки для тестирования RDP, но это требует отдельный IP, которого мне нужно избегать.)
Это тоже не сработало.
Этот пост предполагает, что мне нужно использовать certresolver
, но у меня ничего из этого не настроено.
Интересно, есть ли способ настроить Traefik так, чтобы:
- Он принимал TCP-соединение на
ns1.example.domain.com:9100
- Использовался имеющийся сертификат, который содержит
san:DNS=ns1.example.domain.com
- Подключается к поду на порту 3389, также используя TLS.
Я думаю, что сертификаты RDP немного отличаются? Я также не уверен, влияет ли это на SNI. Я также не уверен, как может работать проброс; Traefik должен знать, как направить входящее TCP-соединение, и делает это, глядя на SNI, который содержится в сертификате. На основании этого поста кажется, что рукопожатие также содержит домен, так что SNI не только полагается на сертификат?
Есть ли способ настроить это в Traefik? 🙂
Ответ или решение
Настройка маршрутизации TCP через Traefik для работы с RDP (Remote Desktop Protocol) с использованием TLS SNI (Server Name Indication) представляет собой достаточно сложную задачу, особенно в условиях, когда необходимо обойти ограничения доступа через файервол на стандартный порт 3389. Давайте подробно рассмотрим, как можно настроить такую систему, учитывая все особенности.
Теория
Traefik и маршрутизация TCP
Traefik — это современные решения для осуществления маршрутизации HTTP/HTTPS и TCP-трафика в среды контейнеризации. Он поддерживает маршрутизацию основанную на DNS с использованием SNI, что позволяет адресовать трафик на основе доменных имен даже в случае TCP. Для RDP, который не подразумевает возможности работы на нестандартных портах через стандартный клиент, использование альтернативных портов с перенаправлением является жизненной необходимостью.
Особенности SNI и TLS-прохода
SNI — это расширение TLS, которое позволяет клиенту указывать имя хоста, к которому он пытается подключиться, в процессе TLS-рукопожатия. Это полезно для того, чтобы маршрутизатор мог принимать решение на основе хоста, до выполнения полного TLS-рукопожатия. В случае с Traefik и RDP имеется возможность использовать TLS-проход (TLS passthrough), что позволяет избежать терминации TLS-соединения на уровне Traefik, что критически важно в случае, если на конечных серверных службах требуется полная сквозная шифрация.
Пример
Ваша текущая конфигурация Traefik выглядит следующим образом, с простым использованием tls.passthrough: true
для попытки передачи TLS через Traefik:
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: rdp-ingress
namespace: ns1
spec:
entryPoints:
- metrics
routes:
- match: HostSNI(`ns1.example.domain.com`)
services:
- name: windows
port: 3389
tls:
passthrough: true
Эта конфигурация утверждает, что TLS-терминация не будет произведена на уровне Traefik, а трафик будет передаваться непосредственно до уровня RDP-сервиса.
Применение
-
Настройка TLS-прохода и соответствия имени хоста:
- Убедитесь, что все серверные службы могут корректно обрабатывать TLS, если трафик передается через Traefik без терминации.
- Удостоверьтесь, что ваш RDP-сервер правильно настроен и поддерживает необходимые сертификаты, включающие SNI.
-
Использование уже существующих сертификатов:
- Traefik позволяет использовать уже существующие сертификаты, которые включают SAN (Subject Alternative Name) для доменов, таких как ns1.example.domain.com, и это важно, так как в таком случае вы можете выделить ресурсы Traefik на связь с этими доменами без дополнительных сертификатных решений или использования резолверов.
-
Понимание SNI и его взаимосвязи с Traefik:
- В большинстве случаев SNI может видеть только имя хоста, но Traefik, благодаря своей поддержке passthrough, позволяет обрабатывать такие случаи, где полное TLS-проходное соединение сохраняет целостность полученной информации.
-
Роли
certresolver
в контексте TLS:certresolver
может не потребоваться, если вы уже располагаете корректно настроенными сертификатами для домена. Однако, если необходимо автоматическое получение сертификатов, использованиеCertResolver
является предпочтительным методом.
Если ваш текущий настройка не работает, то целесообразно внимательно проверить все элементы процесса TLS-передачи на соответствие требованиям как Traefik, так и самого PROTOCOL. Также стоит пройтись по логам Traefik для выявления каких-либо ошибок в процессе подключения и убедиться, что все необходимые DNS-записи и сертификаты корректно настроены.