Рейтинг:0

Полностью прозрачный обратный прокси

флаг mx

Я пытаюсь настроить следующее:

— ... ... âââ    
...    
â Маршрутизатор â â â âСервер 1 â    
â NAT âPort forwardâ â â â    
â â ââââââââ⺠â Сервер 0 â âHTTP > â    
✓ ✓ ✓ ✓ ✓ ✓ ✓ HTTPS ✓    
— перенаправление    
- âââ    
- ... ... 
                                     192.168.178.4                       
                                                        -         
                                                        â â â         
                                                        â â â         
                                                        ✓ ✓ Сервер 2 ✓         
                                                        ââ⺠â �          
                                                            «Только HTTP»         
                                                            â         
                                                            ✓         
                                                            192.168.178.7       

Я хочу, чтобы сервер 0 действовал как полностью прозрачный прокси-сервер, который только перенаправляет трафик. Чтобы клиенты не устанавливали TLS-соединение с сервером 0, а напрямую с сервером 1/2, а автоматическое создание и обновление сертификата на основе запроса HTTP-01 на сервере 1/2 по-прежнему работает.

Bravo avatar
флаг us
не уверен, но поможет ли вообще [это](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy#transports)?
флаг in
Это не работает. Серверу 0 необходимо как минимум выполнить SNI, чтобы решить, какой сервер должен обрабатывать запрос. Вам необходимо завершить SSL на server0. (Или иметь возможность расшифровывать пакеты для их правильной пересылки)
djdomi avatar
флаг za
вы можете использовать squid и определить 2 маршрута для этих хостов
флаг us
Вы можете использовать nginx на сервере Server0 с модулем потокового TCP-прокси. nginx может анализировать поле TLS SNI из потока и передавать поток на сервер на основе SNI. https://serverfault.com/questions/1023756/nginx-stream-map-with-wildcard содержит конфигурацию, с которой вы можете начать.
Рейтинг:1
флаг mx

Редактировать: Если вас беспокоит, что соединение между вашим обратным прокси-сервером (который завершает туннель SSL) и сервером содержимого не защищено, хотя это работает и является безопасным, вам лучше настроить восходящий SSL или безопасный туннель, такой как SSH или IPSEC, между контент-сервер и обратный прокси-сервер.


У меня это работает:

Структура файла:

нгникс/
    конфиг/
        nginx.conf
    http_имя_сервера.js
    докер-compose.yml

nginx.conf

модули load_module/ngx_stream_js_module.so;

События {}

транслировать {
    js_import main из http_server_name.js;
    js_set $preread_server_name main.get_server_name;

    карта $preread_server_name $http {
        1.example.com server1_backend_http;
        2.example.com server2_backend_http;
    }

    карта $ssl_preread_server_name $https {
        1.example.com server1_backend_https;
        2.example.com server2_backend_https;
    }

    вышестоящий server1_backend_http {
        сервер 192.168.178.8:80;
    }
    
    вышестоящий server1_backend_https {
        сервер 192.168.178.8:443;
    }

    вышестоящий server2_backend_http {
        сервер 192.168.178.7:80;
    }

    сервер {
        слушать 443;  
        ssl_preread включен;
        прокси_пасс $https;
    }

    сервер {
        слушать 80;
        js_preread main.read_server_name;
        прокси_пасс $http;
    }
}

докер-compose.yml

версия: '3'

Сервисы:
  нгникс:
    изображение: nginx
    имя_контейнера: ngnix
    перезапуск: если не остановлен
    тома:
      - ./config/ngnix.conf:/etc/nginx/nginx.conf:ro
      - ./config/http_имя_сервера.js:/etc/nginx/http_имя_сервера.js:ro
    порты:
      - "192.168.178.4:80:80"
      - "192.168.178.4:443:443"

http_имя_сервера.js

вар имя_сервера = '-';

/**
 * Прочитать имя сервера из потока HTTP.
 *
 * @параметры
 *   Транслировать.
 */
функция read_server_name(s) {
  s.on('загрузить', функция (данные, флаги) {
    если (данные.длина || флаги.последний) {
      с.сделано();
    }

    // Если мы сможем найти заголовок Host.
    var n = data.indexOf('\r\nHost: ');
    если (п != -1) {
      // Определяем начало значения заголовка Host и следующего заголовка.
      вар start_host = n + 8;
      var next_header = data.indexOf('\r\n', start_host);

      // Извлекаем значение заголовка Host.
      server_name = data.substr(начальный_хост, следующий_заголовок - начальный_хост);

      // Удалить порт, если он задан.
      вар port_start = имя_сервера.indexOf(':');
      если (port_start != -1) {
        server_name = server_name.substr(0, port_start);
      }
    }
  });
}

функция get_server_name(s) {
  вернуть имя_сервера;
}

экспортировать по умолчанию {read_server_name, get_server_name}

Документация:
ngx_http_upstream_module
ngx_http_map_module
ngx_stream_proxy_module

Редактировать:
Читать этот пост в блоге для получения дополнительной информации

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.