Есть nginx с конфигурацией stream примерно такой:
stream {
map $ssl_preread_server_name $name {
vpn.example.com vpn;
default https;
}
upstream https {
server 127.0.0.1:443;
}
upstream vpn {
server 192.168.23.4:443;
}
server {
listen 192.168.23.101:443;
proxy_pass $name;
ssl_preread on;
# proxy_protocol on;
}
}
server {
listen 127.0.0.1:443 ssl;
server_name site.example.com;
ssl_certificate /root/.acme.sh/*.example.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/*.example.com/*.example.com.key;
location / {
proxy_pass http://site.local:8080;
}
}
В таком виде работает как https, так и sstp vpn, но теряется source ip и все коннекты идут от 127.0.0.1. А хотелось бы фильтровать по адресам, например на какие-то сайты пускать только с адресов, выдаваемых пользователям VPN.
Как одно из решений
https://docs.nginx.com/nginx/admin-guide/load-bala..., в stream вставляем proxy_protocol on(в моем примере он закомментирован), в бэкендах в listen добавляем proxy_protocol, всё отлично, исходные адреса теперь есть, фильтровать можно, но VPN не работает, вываливая ошибки вида:
[error] 11270#11270: *384329 recv() failed (104: Connection reset by peer) while proxying and reading from upstream, client: 1.2.3.4, server: 192.168.23.
101:443, upstream: "192.168.23.4:443", bytes from/to client:0/0, bytes from/to upstream:0/225
Тут в общем-то два вопроса возникает:
1. Можно ли при помощи proxy_protocol пробросить протокол SSTP, или это в принципе не получится и я делаю глупость?
2. Если отключать всё же proxy_protocol, где погибает source ip клиента и как его можно восстановить, для возможности ограничения доступа при помощи ngx_http_access_module?