Я хочу настроить sslh на порту 443 для пересылки на https и openvpn, которые находятся в двух контейнерах докера. Поскольку в долгосрочной перспективе я хочу предоставлять списки ACL на основе IP для https, я хочу, чтобы sslh предоставлял истинный IP-адрес клиента веб-серверу (он же «прозрачный» режим sslh).

Как я понимаю из документации и этого ответа , sslh будет подделывать внешние запросы во внутренней сети и должен быть возвращен ответом сервера, чтобы перевести порт для связи с клиентом.

Моя проблема заключается в настройке iptables. Существует два варианта запуска sslh: на хосте или в контейнере внутри сети докеров.

Мне удалось настроить «по умолчанию», как описано в документации, чтобы работать, то есть: sslh на хосте мог прозрачно перенаправить на сервис на хосте.

Однако я не могу получить прозрачный sslh ни на хосте, ни в контейнере для работы с контейнеризованными серверами. Более конкретно, мои правила iptables для маркировки трафика, который должен быть направлен на sslh, никогда не соответствуют пакету.

Например, для веб-сервера https я бы:

iptables -t mangle -A OUTPUT -p tcp --sport 443 --source 172.25.0.2 --jump SSLH

Используя эту таблицу, я попытался понять, как виртуальные Ethernet-устройства контейнера, док-мост, док-станция NAT и iptables работают вместе, но я не могу обойти это.

Чтобы лучше обсудить это, давайте предположим следующее:

  • хост (eth0): 1.1.1.1
  • док-мост (br0): 172.25.0.0/16
    • веб-сервер (veth1): 172.25.0.2:443 (при необходимости отображается на хосте как 8443)
    • openvpn (veth2): 172.25.0.3:1194 (перенаправляется на хост при необходимости)
    • sslh в контейнере (взаимоисключающий с хостом sslh): 172.25.0.4:443 (перенаправлен на хост)
  • sslh на хосте (взаимоисключающий с контейнером sslh): порт 443
  • клиент: 8.8.8.8

Вот моя неудачная модель должна произойти, когда браузер подключается к хосту: 443 и sslh находится на хосте в прозрачном режиме

  • sslh подключается к 172.25.0.2:8443, выдавая себя за оригинального клиента 8.8.8.8
  • веб-сервер отвечает за рукопожатие TCP на 8.8.8.8 через veth1
  • пакет переходит на br0
  • маршрутизация решает отправить его через ent0
  • цепочка вывода iptables помечает его как трафик для sslh (это то, что у меня не работает)
  • метка указывает, что вместо этого следует направить пакет на локальное устройство lo
  • sslh забирает его, переводит порт и отправляет его обратно клиенту

Моя проблема в приведенном выше списке заключается в том, что я не знаю критериев фильтрации для исходящего трафика веб-серверов: должен ли я использовать внутренний порт 443 док-станции или сопоставленный порт 8443? Докер IP 172.25.0.2 или другой? Это сводится к следующему: будет ли правило вывода выводиться до или после NAT докера?

Я думал, что смогу поместить sslh в сеть докеров, чтобы не думать о NAT, но я все еще не могу заставить правила iptables соответствовать.

Я не знаю, как поступить.

Никто
источник