我使用流模块来传递 tls 流量,因为无法反向代理,例如因为我没有证书(本地 3CX 安装)或它破坏了某些东西(带有客户端证书的 ssl vpn)。然后我将“其余”转发到同一主机上的另一个 IP(127.0.0.1)进行反向代理。问题是 remote_addr 并不总是 127.0.0.1,而且似乎没有办法设置“真实”远程地址。为了解决这个问题,我启用了 proxy_protocol 并使用了 $proxy_protocol_addr。
然而这会破坏所有直通网站,而且我还没有找到一种方法来有条件地仅为“默认”启用 proxy_protocol
我这样做是为了能够在 sni 上匹配并对所有网站使用单个 IP。
我并不拘泥于这种方式,如果有人知道如何以不同/更好的方式实现这一点,我洗耳恭听。
stream {
map $ssl_preread_server_name $targetBackend {
3cx.example.com 192.168.1.2:443;
vpn.example.com 192.168.1.3:443;
default 127.0.0.1:443;
}
server {
listen 192.168.1.100:443;
proxy_connect_timeout 1;
proxy_timeout 3s;
resolver 192.168.1.1;
proxy_protocol on;
proxy_pass $targetBackend;
ssl_preread on;
}
那么...如何使 proxy_protocol 有条件(据我所知,如果在流上下文中不起作用)或以其他方式解决它?
答案1
似乎您需要安装一个前端来3cx
解码vpn
PROXY 协议并将其转换为实际 Web 服务器的 HTTP 请求。
另一种选择是针对 Web 服务和代理协议设置单独的 nginx 实例。