ssl preread
This commit is contained in:
parent
131eace9f5
commit
303b552451
5 changed files with 221 additions and 0 deletions
85
.gigacode/plans/nginx-ssl-preread.md
Normal file
85
.gigacode/plans/nginx-ssl-preread.md
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
# План добавления SSL preread map в роль nginx
|
||||||
|
|
||||||
|
## Описание задачи
|
||||||
|
Добавить поддержку создания stream-конфигураций с `ssl_preread` и `map` для маршрутизации TLS-трафика на основе SNI.
|
||||||
|
|
||||||
|
## Текущая структура
|
||||||
|
- `tasks/nginx-stream.yml` - импортирует конфигурацию stream
|
||||||
|
- `templates/nginx-stream.j2` - шаблон stream-конфигурации
|
||||||
|
- `defaults/main.yml` - переменная `nginx_streams` с примерами
|
||||||
|
|
||||||
|
## План реализации
|
||||||
|
|
||||||
|
### 1. Обновить шаблон `templates/nginx-stream.j2`
|
||||||
|
Добавить поддержку двух типов stream-конфигураций:
|
||||||
|
- **Обычный proxy** (текущий функционал)
|
||||||
|
- **SSL preread map** (новый функционал)
|
||||||
|
|
||||||
|
#### Для SSL preread map потребуется:
|
||||||
|
- `map` блок для сопоставления SNI-имён с upstream-ами
|
||||||
|
- `upstream` блоки для каждого target
|
||||||
|
- `server` блок с `ssl_preread on` и `proxy_pass $name`
|
||||||
|
|
||||||
|
### 2. Обновить `defaults/main.yml`
|
||||||
|
Добавить пример stream-конфигурации с ssl_preread:
|
||||||
|
```yaml
|
||||||
|
nginx_streams:
|
||||||
|
- stream: HTTPS_ssl_preread
|
||||||
|
listen_port: 443
|
||||||
|
type: ssl_preread
|
||||||
|
ssl_preread:
|
||||||
|
server_names:
|
||||||
|
- storagecat.ru: ocserv
|
||||||
|
default_target: https
|
||||||
|
upstreams:
|
||||||
|
- name: https
|
||||||
|
servers:
|
||||||
|
- 127.0.0.1:8443
|
||||||
|
- name: ocserv
|
||||||
|
servers:
|
||||||
|
- 127.0.0.1:9443
|
||||||
|
proxy_timeout: 4s
|
||||||
|
proxy_responses: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Обновить `tasks/nginx-stream.yml` (при необходимости)
|
||||||
|
Проверить, что задача корректно обрабатывает оба типа stream-конфигураций.
|
||||||
|
|
||||||
|
## Пример выходной конфигурации
|
||||||
|
```
|
||||||
|
# Ansible Managed: DO NOT EDIT
|
||||||
|
# Конфигурация для HTTPS_ssl_preread
|
||||||
|
|
||||||
|
map $ssl_preread_server_name $name {
|
||||||
|
storagecat.ru ocserv;
|
||||||
|
default https;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream https {
|
||||||
|
server 127.0.0.1:8443;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream ocserv {
|
||||||
|
server 127.0.0.1:9443;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443;
|
||||||
|
ssl_preread on;
|
||||||
|
proxy_protocol on;
|
||||||
|
proxy_pass $name;
|
||||||
|
proxy_timeout 4s;
|
||||||
|
proxy_responses 1;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Шаги реализации
|
||||||
|
1. Создать новый шаблон `templates/nginx-stream-ssl-preread.j2`
|
||||||
|
2. Обновить `templates/nginx-stream.j2` для поддержки обоих типов
|
||||||
|
3. Добавить пример в `defaults/main.yml`
|
||||||
|
4. Протестировать на примере из `playbooks/vm-balancer.yml`
|
||||||
|
|
||||||
|
## Вопросы для уточнения
|
||||||
|
- [x] Формат данных: расширить текущую структуру nginx_streams
|
||||||
|
- [x] Обязательные параметры: server_names, upstream_name, default_target
|
||||||
|
- [x] Дополнительные параметры: proxy_timeout, proxy_responses, proxy_bind, proxy_connect_timeout
|
||||||
|
|
@ -57,6 +57,26 @@
|
||||||
- 10.203.2.11:123
|
- 10.203.2.11:123
|
||||||
- 10.203.2.12:123
|
- 10.203.2.12:123
|
||||||
|
|
||||||
|
# Stream with SSL preread map
|
||||||
|
# - stream: HTTPS_ssl_preread
|
||||||
|
# listen_port: 443
|
||||||
|
# type: ssl_preread
|
||||||
|
# ssl_preread:
|
||||||
|
# ssl_preread: true
|
||||||
|
# proxy_protocol: true
|
||||||
|
# server_names:
|
||||||
|
# - storagecat.ru: ocserv
|
||||||
|
# default_target: https
|
||||||
|
# upstreams:
|
||||||
|
# - name: https
|
||||||
|
# servers:
|
||||||
|
# - 127.0.0.1:8443
|
||||||
|
# - name: ocserv
|
||||||
|
# servers:
|
||||||
|
# - 127.0.0.1:9443
|
||||||
|
# proxy_timeout: 4s
|
||||||
|
# proxy_responses: 1
|
||||||
|
|
||||||
nginx_virthosts:
|
nginx_virthosts:
|
||||||
- virthost_name: gigacoms.ru
|
- virthost_name: gigacoms.ru
|
||||||
listen: "80"
|
listen: "80"
|
||||||
|
|
|
||||||
|
|
@ -188,6 +188,31 @@ nginx_robots_disallowed_uris_list: []
|
||||||
# List any options here, ending with ;
|
# List any options here, ending with ;
|
||||||
#
|
#
|
||||||
nginx_streams: []
|
nginx_streams: []
|
||||||
|
|
||||||
|
# Stream example with SSL preread map
|
||||||
|
# nginx_streams:
|
||||||
|
# - stream: HTTPS_ssl_preread
|
||||||
|
# listen_port: 443
|
||||||
|
# type: ssl_preread
|
||||||
|
# ssl_preread:
|
||||||
|
# ssl_preread: true
|
||||||
|
# proxy_protocol: true
|
||||||
|
# server_names:
|
||||||
|
# - storagecat.ru: ocserv
|
||||||
|
# default_target: https
|
||||||
|
# upstreams:
|
||||||
|
# - name: https
|
||||||
|
# servers:
|
||||||
|
# - 127.0.0.1:8443
|
||||||
|
# - name: ocserv
|
||||||
|
# servers:
|
||||||
|
# - 127.0.0.1:9443
|
||||||
|
# proxy_timeout: 4s
|
||||||
|
# proxy_responses: 1
|
||||||
|
# proxy_connect_timeout: 30s
|
||||||
|
# responses: 1
|
||||||
|
# timeout: 4s
|
||||||
|
# connect_timeout: 30s
|
||||||
# Virtualhost example
|
# Virtualhost example
|
||||||
nginx_virthosts: []
|
nginx_virthosts: []
|
||||||
# - virthost_name: '{{ ansible_fqdn }}'
|
# - virthost_name: '{{ ansible_fqdn }}'
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,52 @@
|
||||||
|
{% if item.type == 'ssl_preread' %}
|
||||||
|
# Ansible Managed: DO NOT EDIT
|
||||||
|
# Конфигурация для {{ item.stream }} (SSL preread)
|
||||||
|
|
||||||
|
{% if item.ssl_preread is defined and item.ssl_preread.server_names is defined %}
|
||||||
|
map $ssl_preread_server_name $name {
|
||||||
|
{% for mapping in item.ssl_preread.server_names %}
|
||||||
|
{% if mapping is string %}
|
||||||
|
{{ mapping }};
|
||||||
|
{% else %}
|
||||||
|
{% for hostname, target in mapping.items() %}
|
||||||
|
{{ hostname }} {{ target }};
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
default {{ item.ssl_preread.default_target | default('https') }};
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if item.upstreams is defined %}
|
||||||
|
{% for upstream in item.upstreams %}
|
||||||
|
upstream {{ upstream.name }} {
|
||||||
|
{% for server in upstream.servers %}
|
||||||
|
server {{ server }};
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen {{ item.listen_port }};
|
||||||
|
{% if item.ssl_preread is defined and item.ssl_preread.ssl_preread | default(false) %}
|
||||||
|
ssl_preread on;
|
||||||
|
{% endif %}
|
||||||
|
{% if item.ssl_preread is defined and item.ssl_preread.proxy_protocol | default(false) %}
|
||||||
|
proxy_protocol on;
|
||||||
|
{% endif %}
|
||||||
|
proxy_pass $name;
|
||||||
|
{% if item.responses is defined %}
|
||||||
|
proxy_responses {{ item.responses }};
|
||||||
|
{% endif %}
|
||||||
|
{% if item.timeout is defined %}
|
||||||
|
proxy_timeout {{ item.timeout }};
|
||||||
|
{% endif %}
|
||||||
|
{% if item.connect_timeout is defined %}
|
||||||
|
proxy_connect_timeout {{ item.connect_timeout }};
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
# Ansible Managed: DO NOT EDIT
|
# Ansible Managed: DO NOT EDIT
|
||||||
# Конфигурация для {{ item.stream }}
|
# Конфигурация для {{ item.stream }}
|
||||||
|
|
||||||
|
|
@ -24,3 +73,4 @@ server {
|
||||||
proxy_connect_timeout {{ item.connect_timeout }};
|
proxy_connect_timeout {{ item.connect_timeout }};
|
||||||
{% endif %}
|
{% endif %}
|
||||||
}
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
|
||||||
41
test-nginx-stream.yml
Normal file
41
test-nginx-stream.yml
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
- name: Test nginx stream template
|
||||||
|
hosts: localhost
|
||||||
|
gather_facts: false
|
||||||
|
vars:
|
||||||
|
nginx_streams:
|
||||||
|
- stream: HTTPS_ssl_preread
|
||||||
|
listen_port: 443
|
||||||
|
type: ssl_preread
|
||||||
|
ssl_preread:
|
||||||
|
ssl_preread: true
|
||||||
|
proxy_protocol: true
|
||||||
|
server_names:
|
||||||
|
- storagecat.ru: ocserv
|
||||||
|
default_target: https
|
||||||
|
upstreams:
|
||||||
|
- name: https
|
||||||
|
servers:
|
||||||
|
- 127.0.0.1:8443
|
||||||
|
- name: ocserv
|
||||||
|
servers:
|
||||||
|
- 127.0.0.1:9443
|
||||||
|
proxy_timeout: 4s
|
||||||
|
proxy_responses: 1
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Render nginx stream template
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: roles/nginx/templates/nginx-stream.j2
|
||||||
|
dest: /tmp/test-nginx-stream.conf
|
||||||
|
mode: '0644'
|
||||||
|
loop: "{{ nginx_streams }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: item
|
||||||
|
|
||||||
|
- name: Display rendered config
|
||||||
|
ansible.builtin.debug:
|
||||||
|
var: item
|
||||||
|
loop: "{{ nginx_streams }}"
|
||||||
|
loop_control:
|
||||||
|
loop_var: item
|
||||||
Loading…
Reference in a new issue