Балансировка трафика на основе набора шифров#

В этой статье рассматривается балансировка трафика на основе набора шифров. На один VIP-адрес балансировщика нагрузки поступает два типа трафика:

  • TLS-трафик с шифрованием ГОСТ;

  • TLS-трафик без ГОСТ.

Для стандартного TLS выполняется Offload и балансировка на Angie ADC. Трафик ГОСТ направляется на отдельный бэкенд-сервер без расшифровки.

Настройка#

Конфигурация основного бэкенд-сервера:

http {
    default_type text/plain;

    server {
        listen 80;
        server_name localhost;

        location / {
            return 200 "Hello, this is default backend\n";
        }
    }
}

Конфигурация бэкенд-сервера для ГОСТ-трафика:

http {
    default_type text/plain;

    server {
        listen 443 ssl;
        server_name localhost;
        ssl_certificate /etc/angie-lb/crt/server.crt;
        ssl_certificate_key /etc/angie-lb/crt/server.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers IANA-GOST2012-GOST8912-GOST8912:GOST2012-MAGMA-MAGMAOMAC:GOST2012-KUZNYECHIK-KUZNYECHIKOMAC;
        ssl_prefer_server_ciphers on;

        location / {
            return 200 "Hello, this is GOST-based server\n";
        }
    }
}

Случай 1#

Трафик балансируется на ГОСТ-бэкенд, если ГОСТ присутствует в списке шифров (может присутствовать наряду с другими шифрами).

Конфигурация:

http {

    upstream backend {
        server IP.OF.MAIN.BACKEND:80;
    }

    server {
        listen       127.0.0.1:8443 ssl;
        ssl_certificate /etc/angie-lb/crt/cp.crt;
        ssl_certificate_key /etc/angie-lb/crt/cp.key;
        server_name  localhost;
        status_zone  default;
        location / {
            proxy_pass http://backend;
        }
    }

}

stream {

    map $ssl_preread_ciphers $handler {
        "~TLS_GOST" 127.0.0.1:9443;
        default     127.0.0.1:8443;
    }

    server {
        listen       443;
        ssl_preread  on;
        pass $handler;
    }

    server {
        listen       127.0.0.1:9443;
        proxy_pass   IP.OF.GOST.BACKEND:443;
    }
}

Случай 2#

Трафик балансируется на ГОСТ-бэкенд, если заданы только ГОСТ-шифры. Если помимо ГОСТ-шифров есть другие шифры, трафик отправляется на основной бэкенд.

Конфигурация:

http {

    upstream backend {
        server IP.OF.MAIN.BACKEND:80;
    }

    server {
        listen       127.0.0.1:8443 ssl;
        ssl_certificate /etc/angie-lb/crt/cp.crt;
        ssl_certificate_key /etc/angie-lb/crt/cp.key;
        server_name  localhost;
        status_zone  default;
        location / {
            proxy_pass http://backend;
        }
    }

}

stream {

    map $ssl_preread_ciphers $backend {
        "~^(TLS_GOST[^:]*)(:TLS_GOST[^:]*)*(:TLS_EMPTY_RENEGOTIATION_INFO_SCSV)?$"  127.0.0.1:9443;
        default 127.0.0.1:8443;
    }

    server {
        listen       443;
        ssl_preread  on;
        pass $backend;
    }

    server {
        listen       127.0.0.1:9443;
        proxy_pass   IP.OF.GOST.BACKEND:443;
    }
}

Проверка#

Случай 1#

Трафик без ГОСТ отправляется на основной бэкенд:

# curl --ciphers '!IANA-GOST2012-GOST8912-GOST8912:!GOST2012-MAGMA-MAGMAOMAC:!GOST2012-KUZNYECHIK-KUZNYECHIKOMAC:HIGH' --tlsv1.2 --tls-max 1.2 https://example.com
Hello, this is default backend

Трафик с ГОСТ отправляется на ГОСТ-бэкенд:

# curl --ciphers 'ALL' --tlsv1.2 --tls-max 1.2 https://example.com
Hello, this is GOST-based server

Случай 2#

Трафик без ГОСТ отправляется на основной бэкенд:

# curl --ciphers '!IANA-GOST2012-GOST8912-GOST8912:!GOST2012-MAGMA-MAGMAOMAC:!GOST2012-KUZNYECHIK-KUZNYECHIKOMAC:HIGH' --tlsv1.2 --tls-max 1.2 https://example.com
Hello, this is default backend

Трафик с ГОСТ отправляется на основной бэкенд:

# curl --ciphers 'ALL' --tlsv1.2 --tls-max 1.2 https://example.com
Hello, this is default backend

Трафик, где только ГОСТ, отправляется на ГОСТ-бэкенд:

# curl --ciphers 'IANA-GOST2012-GOST8912-GOST8912:GOST2012-MAGMA-MAGMAOMAC:GOST2012-KUZNYECHIK-KUZNYECHIKOMAC' --tlsv1.2 --tls-max 1.2 https://example.com
Hello, this is GOST-based server