Я хочу настроить 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 или другой? Это сводится к следующему: будет ли работать выходное правило mangle до или после NAT докера?
Я думал, что смогу поместить sslh в сеть докеров, чтобы не думать о NAT, но я все еще не могу заставить правила iptables соответствовать.
Я не знаю, как поступить.