Блокировка потока Nginx с фильтрацией поддоменов по шаблону

Блокировка потока Nginx с фильтрацией поддоменов по шаблону

Я настроил сервер Nginx как прокси-сервер L4 (прямой прокси-сервер с потоковым модулем) со следующей конфигурацией в файле nginx.conf:

stream {
resolver 8.8.8.8;
server {
    listen 443;
    ssl_preread on;
    proxy_connect_timeout 5s;
    proxy_pass $ssl_preread_server_name:$server_port;
  } 
}

все работает отлично, с конфигурацией выше. но предположим, что я хочу ограничить доступ URL-адресов, проходящих на мой прокси-сервер. Не ограничивая IP-адрес, а с помощью имен URL-адресов.
Я провел исследование и настроил следующий файл конфигурации, и каким-то образом мне удалось контролировать URL-адреса, проходящие на мой прокси-сервер.
Но проблема начинается отсюда. Если вызывается большой веб-сайт, поскольку у него много ссылок или поддоменов, загруженных за кулисами, и зная, что я ограничил разрешенные для передачи URL-адреса, а подстановочные знаки поддоменов не работают в блоке потока, я не могу полностью загрузить запрошенный веб-сайт.
Есть ли решение использовать его в блоке потока для поддержки подстановочных знаков для поддомена домена? моя новая конфигурация выглядит следующим образом:

stream {


 map $ssl_preread_server_name $name {
     ipchicken.com ipchicken.com;
     www.bbc.com www.bbc.com;
     www.bbc.co.uk www.bbc.co.uk;
     bbci.co.uk bbci.co.uk;
}


server {

    resolver 8.8.8.8;
    listen 443;
    ssl_preread on;
    proxy_connect_timeout 5s;
    proxy_pass $name:$server_port;
   }
 }

 events {
}

решение1

Вы ищете hostnamesключевое слово. С этим ключевым словом вы можете использовать *.example.comподстановочный знак для example.comдомена. Аналогично server_nameдирективе вы можете использовать .example.comдля обоих example.comи *.example.com:

map $ssl_preread_server_name $name {
    hostnames;
    .ipchicken.com    $ssl_preread_server_name;
    .bbc.com          $ssl_preread_server_name;
    .bbc.co.uk        $ssl_preread_server_name;
    .bbci.co.uk       $ssl_preread_server_name;
}

В качестве альтернативы вы можете использовать любое регулярное выражение внутри mapблока, например:

map $ssl_preread_server_name $name {
    # covers 'bbc.com', 'www.bbc.com' and 'static.bbc.com':
    ~^(?:www\.|static\.)?bbc\.com$    $ssl_preread_server_name;
    ...
}

Связанный контент