Возможно баг, но это не точно

Добрый день

Имеется вот такой конфиг:

map $ssl_preread_server_name $name {
    ru-sstp.domain.ru       ru-sstp-domain-ru;
    signal.domain.io        signal-domain-io;
    sg.domain.ru            sg-domain-ru;
    default                 ru-domain-ru;
}

upstream ru-sstp-domain-ru {
    server 127.0.0.1:1443;
}

upstream ru-domain-ru {
    server 127.0.0.1:443;
}

upstream signal-domain-io {
    server 127.0.0.1:4321;
}

upstream sg-domain-ru {
    server 127.0.0.1:4322;
}

server {
    listen         11.11.11.11:443;
    proxy_pass     $name;
    ssl_preread    on;
}

map $ssl_preread_server_name $signal_name {
    chat.signal.org                 signal-service;
    ud-chat.signal.org              signal-service;
    storage.signal.org              storage-service;
    cdn.signal.org                  signal-cdn;
    cdn2.signal.org                 signal-cdn2;
    cdn3.signal.org                 signal-cdn3;
    cdsi.signal.org                 cdsi;
    contentproxy.signal.org         content-proxy;
    grpc.chat.signal.org            gprc-chat;
    sfu.voip.signal.org             sfu;
    svr2.signal.org                 svr2;
    svrb.signal.org                 svrb;
    updates.signal.org              updates;
    updates2.signal.org             updates2;
    default                         deny;
}

resolver 127.0.0.1 status_zone=resolver valid=60s;

upstream signal-service {
    zone signal_service 64k;

    server chat.signal.org:443 resolve;
}

upstream storage-service {
    zone storage_service 64k;

    server storage.signal.org:443 resolve;
}

upstream signal-cdn {
    zone signal_cdn 64k;

    server cdn.signal.org:443 resolve;
}

upstream signal-cdn2 {
    zone signal_cdn2  64k;

    server cdn2.signal.org:443 resolve;
}

upstream signal-cdn3 {
    zone signal_cdn3 64k;

    server cdn3.signal.org:443 resolve;
}

upstream cdsi {
    zone signal_cdsi 64k;

    server cdsi.signal.org:443 resolve;
}

upstream content-proxy {
    zone content_proxy 64k;

    server contentproxy.signal.org:443 resolve;
}

upstream sfu {
    zone sfu 64k;

    server sfu.voip.signal.org:443 resolve;
}

upstream svr2 {
    zone svr2 64k;

    server svr2.signal.org:443 resolve;
}

upstream svrb {
    zone svrb 64k;

    server svrb.signal.org:443 resolve;
}

upstream updates {
    zone updates 64k;

    server updates.signal.org:443 resolve;
}

upstream updates2 {
    zone updates2 64k;

    server updates2.signal.org:443 resolve;
}

upstream gprc-chat {
    zone grpc_chat 64k;

    server grpc.chat.signal.org:443 resolve;
}

upstream deny {
    server 127.0.0.1:9;
}

upstream relay {
    server 127.0.0.1:4433;
}

server {
    listen                127.0.0.1:4433;
    proxy_pass            $signal_name;
    ssl_preread           on;
    proxy_bind            22.22.22.22;
}

server {
    listen              127.0.0.1:4321 ssl;
    server_name         signal.domain.io;

    ssl_certificate /etc/letsencrypt/live/signal.domain.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/signal.domain.io/privkey.pem;
    ssl_dhparam /etc/angie/ssl/dhparam.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    proxy_pass          relay;
}

server {
    listen              127.0.0.1:4322 ssl;
    server_name         sg.domain.ru;

    ssl_certificate /etc/letsencrypt/live/sg.domain.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sg.domain.ru/privkey.pem;
    ssl_dhparam /etc/angie/ssl/dhparam.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    proxy_pass          relay;
}

После первого соединения, которое задействует один из последних два сервера

10.0.0.1 [06/Mar/2026:13:39:00 +0300] TCP 200 5265 999 6.509 ``sg.domain.ru
127.0.0.1 [06/Mar/2026:13:39:00 +0300] TCP 200 1627 718 6.496 -
127.0.0.1 [06/Mar/2026:13:39:00 +0300] TCP 200 1513 579 6.505 -
127.0.0.1 [06/Mar/2026:13:39:00 +0300] TCP 200 1627 718 6.458 ``chat.signal.org
127.0.0.1 [06/Mar/2026:13:39:00 +0300] TCP 200 1513 579 6.467 ``chat.signal.org

Первый сервер перестаёт работать:

» curl -v https://sg.domain.ru/                                                    
* Host sg.domain.ru:443 was resolved.
* IPv6: (none)
* IPv4: 11.11.11.11
*   Trying 11.11.11.11:443...
* Connected to sg.domain.ru (11.11.11.11) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
^C

Просто виснет.

Помогите разобрать пжлст, возможно я где-то накосячил, ну или это бажок.

Спасибо большое!

А в логах ошибок пусто?

Но вообще не понимаю, как предполагалась работоспособность данной конструкции.

TLS соединение устанавливается с блоком server:

server {
    listen         11.11.11.11:443;
    proxy_pass     $name;
    ssl_preread    on;
}

При этом в SNI передается sg.domain.ru. Следовательно переменная $name через map:

map $ssl_preread_server_name $name {
    ru-sstp.domain.ru       ru-sstp-domain-ru;
    signal.domain.io        signal-domain-io;
    sg.domain.ru            sg-domain-ru;
    default                 ru-domain-ru;
}

получает значение sg-domain-ru, которое соответствует:

upstream sg-domain-ru {
    server 127.0.0.1:4322;
}

и далее соединение проксируется сюда:

server {
    listen              127.0.0.1:4322 ssl;
    server_name         sg.domain.ru;

    ssl_certificate /etc/letsencrypt/live/sg.domain.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sg.domain.ru/privkey.pem;
    ssl_dhparam /etc/angie/ssl/dhparam.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    proxy_pass          relay;
}

Где происходит TLS-терминация и уже без TLS соединение проксируется далее на:

    upstream relay {
        server 127.0.0.1:4433;
    }

т.е. сюда:

server {
    listen                127.0.0.1:4433;
    proxy_pass            $signal_name;
    ssl_preread           on;
    proxy_bind            22.22.22.22;
}

где ssl_preread разумеется не работает, т.к. у нас уже не TLS соединение.

Ха! Чёт я забыл туда посмотреть. В resolver добавил ipv6=off и всё поехало.

Лог вам на заметку:



2026/03/06 14:29:35 [crit] 3976007#3976007: *44 bind(22.22.22.22) failed (22: Invalid argument) while connecting to upstream, client: 127.0.0.1, server: 127.0.0.1:4433, upstream: “[2600:9000:a507:ab6d:4ce3:2f58:25d7:9cbf]:443”, bytes from/to client:0/0, bytes from/to upstream:0/0
2026/03/06 14:29:35 [notice] 3976006#3976006: signal 17 (SIGCHLD) received from 3976007
2026/03/06 14:29:35 [alert] 3976006#3976006: worker process 3976007 exited on signal 11 (core dumped)
2026/03/06 14:29:35 [notice] 3976006#3976006: start worker process 3976665

Спасибо!

Это скорее всего уже исправлено: angie: 41d15f25cefa

1 Like

Но как это ни странно, ОНО работает. :slight_smile: