2 сервера, 1 общедоступный IP-адрес - внутреннее перенаправление поддомена

У меня есть 2 веб-сайта SSL серверов и 1 общедоступный IP-адрес.

У меня есть TLD (example.com), я бы хотел перенаправить server1.example.com на внутренний сервер A, а server2.example.com - на внутренний сервер B.

Как мне это сделать? Веб-серверы не являются IIS или Apache, но являются веб-приложениями управления, использующими порты 443.

7
задан 30 July 2017 в 23:12
2 ответа

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

Они использовали haproxy, я предпочитаю nginx, потому что вы можете обслуживать SSL по отдельности, контролировать сертификаты немного лучше, и меньше хаоса, потому что вы можете настраивать сайты по отдельности. Для этого, и я гораздо больше знаком с nginx, чем с haproxy - мы должны были иметь такую установку на конкретном программном обеспечении, которое мы развернули, где у нас был один входящий IP-адрес для веб-трафика, и это было оно, но у нас было восемь или девять страниц веб-администрирования на внутренних IP-адресных серверах.

В зависимости от вашей операционной системы, в которой я бы назвал выделенную внешнюю систему, вы бы установили nginx.

Добавьте следующие строфы в конец вашего nginx. conf http, который теоретически должен быть в /etc/nginx; обновите их соответственно для ваших доменов:

# First Server
server {
    listen 443 ssl;

    server_name server1.example.com;

    ssl_certificate /path/to/SSL/cert;
    ssl_certificate_key /path/to/SSL/cert/privkey;

    # Secure SSL configs
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:AES128+EECDH:AES128+EDH";
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off; # Requires nginx >= 1.5.9
    ssl_dhparam /etc/ssl/dhparam.2048.pem; # To protect against LOGJAM

    location / {
        add_header X-Forwarded-For $remote_ip
        add_header X-Forwarded-Proto https;
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options SAMEORIGIN;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        proxy_pass https://internal.ip.address.1:443/;
    }
}

# Second Server
server {
    listen 443 ssl;

    server_name server2.example.com;

    ssl_certificate /path/to/SSL/cert;
    ssl_certificate_key /path/to/SSL/cert/privkey;

    # Secure SSL configs
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:AES128+EECDH:AES128+EDH";
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off; # Requires nginx >= 1.5.9
    ssl_dhparam /etc/ssl/dhparam.2048.pem; # To protect against LOGJAM

    location / {
        add_header X-Forwarded-For $remote_ip
        add_header X-Forwarded-Proto https;
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options SAMEORIGIN;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        proxy_pass https://internal.ip.address.2:443/;
    }
}

# Catch all for all other responses, return 410 GONE message.
server {
    listen 80 default_server;
    listen 443 default_server;

    server_name server1.example.com;

    ssl_certificate /path/to/a/bogus/self-signed/SSL/cert;
    ssl_certificate_key /path/to/a/bogus/self-signed/SSL/cert/privkey;

    # Secure SSL configs
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:AES128+EECDH:AES128+EDH";
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off; # Requires nginx >= 1.5.9
    ssl_dhparam /etc/ssl/dhparam.2048.pem; # To protect against LOGJAM

    return 410;
}

Вам нужно запустить openssl dhparam -out /etc/ssl/dhparam.2048 .pem 2048 либо в качестве суперпользователя, либо с помощью sudo, в зависимости от вашей системы, но как только вы это сделаете и создадите файл dhparam.2048.pem, вы можете перезапустить процесс NGINX на вашей системе, и протестировать ваши сайты. Убедитесь, что весь трафик портов 80 и 443 переадресован на эту систему, чтобы она могла корректно передать его на внутренние системы.

.
4
ответ дан 2 December 2019 в 23:17

Вы должны использовать обратный прокси (например, HAProxy, nginx, squid ...) перед этими двумя серверами. Привяжите общедоступный IP-адрес к интерфейсу прокси, а затем используйте расширение SSL SNI для маршрутизации трафика по имени домена на внутренние серверы.

Пример HAProxy ( https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/ ):

# Adjust the timeout to your needs
defaults
  timeout client 30s
  timeout server 30s
  timeout connect 5s

# Single VIP 
frontend ft_ssl_vip
  bind 10.0.0.10:443
  mode tcp

  tcp-request inspect-delay 5s
  tcp-request content accept if { req_ssl_hello_type 1 }

  default_backend bk_ssl_default

# Using SNI to take routing decision
backend bk_ssl_default
  mode tcp

  acl application_1 req_ssl_sni -i application1.domain.com
  acl application_2 req_ssl_sni -i application2.domain.com

  use-server server1 if application_1
  use-server server2 if application_2
  use-server server3 if !application_1 !application_2

  option ssl-hello-chk
  server server1 10.0.0.11:443 check
  server server2 10.0.0.12:443 check
  server server3 10.0.0.13:443 check
14
ответ дан 2 December 2019 в 23:17

Теги

Похожие вопросы