Вопрос или проблема
Я пытаюсь настроить свой собственный Stealth VPN сервер, используя NGINX 1.18 в Debian 11. Следую этому руководству, но многие директивы не работают. Проблема в том, что когда я выполняю команду тестирования nginx -t
, вывод следующий:
- nginx: [emerg] unknown "ssl_preread_server_name" variable
Я изменил эту переменную с $ssl_preread_server_name
на $server_name
, если проблема только с этой конкретной переменной, и чтобы увидеть, есть ли другие ошибки, тест прошел, но была найдена другая ошибка переменной:
- nginx: [emerg] unknown "name" variable`
Это находится в моем последнем блоке сервера в файле nginx.conf
, поэтому я не ожидал найти какие-либо другие ошибки. Я проверил оригинальную базу данных переменных Nginx, и переменные $name
и $ssl_preread_server_name
официальные и существуют. Руководство, которому я следовал, говорит, что их следует назначать таким образом, и других руководств в интернете нет, так что я немного застрял.
На данный момент у меня проблема только с этими двумя переменными. Они находятся в блоке map
и последнем блоке server
. Большое спасибо за вашу помощь
Это весь мой код:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
##
# Servers
##
server {
# server_name 206.189.21.228;
listen 127.0.0.1:8000;
}
##
# map
##
map $ssl_preread_server_name $name {
default https;
206.189.21.228 vpn;
}
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
stream {
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
upstream https {
server unix:/etc/nginx/nginx_writing;
}
upstream vpn {
server unix:/etc/openvpn/openvpn_writing;
}
server {
listen unix:/etc/nginx/nginx_writing ssl;
# openvpn doesn't support unix-sockets
proxy_pass 127.0.0.1:1194;
}
server {
listen unix:/etc/nginx/nginx_writing2 ssl;
# could also use a unix-socket here
proxy_pass 127.0.0.1:8000;
}
server {
listen [::]:443 ipv6only=off;
proxy_protocol on;
proxy_pass $name;
}
}
Проблема в том, что ваш nginx не имеет необходимого модуля ngx_stream_ssl_preread
. Вам нужно найти сборку nginx, в которую включен этот модуль.
Ответ или решение
Похоже, вы столкнулись с проблемой при настройке вашего сервера Stealth VPN с использованием NGINX 1.18 на Debian 11. Ошибки, которые вы наблюдаете, такие как nginx: [emerg] unknown "ssl_preread_server_name" variable
и nginx: [emerg] unknown "name" variable
, указывают на отсутствие необходимых модулей или некорректную конфигурацию.
Диагностика проблемы
-
Отсутствие модуля ngx_stream_ssl_preread:
Ошибка с переменной$ssl_preread_server_name
связана с тем, что ваш текущий билд NGINX не включает модульngx_stream_ssl_preread
. Этот модуль необходим для предварительного чтения имени сервера SSL и использования переменных, связанных с ним. -
Некорректная переменная $name:
Ошибка с переменной$name
указывает на то, что такой переменной не существует в контексте вашей конфигурации. Обычно переменные создаются и назначаются в блокахmap
, но должны быть поддержаны самим NGINX, что в вашем случае не происходит.
Рекомендации по решению проблемы
Пошаговые действия:
-
Установите или скомпилируйте NGINX с нужными модулями:
- Проверьте, есть ли в вашем дистрибутиве Debian 11 возможность установить NGINX с необходимыми модулями. Иногда можно найти пакеты в репозиториях, которые уже включают поддержку нужных модулей.
-
Если таких пакетов нет, вам нужно будет скомпилировать NGINX вручную, добавив в него модуль
ngx_stream_ssl_preread
. Это можно сделать примерно следующим образом:sudo apt-get update sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0 ./configure --with-stream_ssl_preread_module make sudo make install
-
Перепроверьте конфигурацию блока map:
- Убедитесь, что структура блока
map
корректна и что переменная$ssl_preread_server_name
будет корректно заполняться в процессе.
- Убедитесь, что структура блока
-
Альтернативы и обходные пути:
- Если вы не можете обновить или перекомпилировать NGINX, существует альтернативный способ изолировать передаваемый трафик без использования модуля
ssl_preread
. Однако это может потребовать изменения вашей архитектуры и выбора других инструментов или прокси-серверов.
- Если вы не можете обновить или перекомпилировать NGINX, существует альтернативный способ изолировать передаваемый трафик без использования модуля
Заключение
Ошибка, с которой вы столкнулись, является следствием отсутствия соответствующих модулей в вашем дискретном билде NGINX. Это обычная проблема при настройке сложных конфигураций, особенно если вы работаете с нестандартными решениями, такими как Stealth VPN. Рекомендую следовать инструкциям по сборке NGINX с необходимыми модулями, что позволит избежать многих подобных ошибок и обеспечит правильную обработку SSL-трафика в вашем сетевом окружении.