求助,NGINX反代与stream模块如何共用443端口。

57次阅读

共计 3274 个字符,预计需要花费 9 分钟才能阅读完成。

stream 模块如下:
问题:一但加入这个 443,我的另一组普通 location / {反代 443 站点就打不开了,这个 stream 的 sni 反代是可以的。不换端口的情况下,可不可以两组共存呢?
stream {
# 加一组 map,根据规则过滤 $ssl_preread_server_name(也就是请求的 SNI)
# 将过滤过的 SNI 存入自定义变量 $filtered_sni_name,
# 如果没有匹配到任何规则,则默认为一个 443 端口没有服务的本地回环。
map $ssl_preread_server_name $filtered_sni_name {
~^(.*|)netflix.com$ $ssl_preread_server_name;
~^(.*|)netflix.net$ $ssl_preread_server_name;
~^(.*|)nflximg.com$ $ssl_preread_server_name;
~^(.*|)nflximg.net$ $ssl_preread_server_name;
~^(.*|)nflxvideo.net$ $ssl_preread_server_name;
~^(.*|)nflxext.com$ $ssl_preread_server_name;
~^(.*|)nflxso.net$ $ssl_preread_server_name;
~^(.*|)fast.com$ $ssl_preread_server_name;
default "127.255.255.255";
}
server {
resolver 1.1.1.1;
listen 443;
ssl_preread on;
# 只代理经过 SNI 过滤的流量,
# 其他流量都被丢入不存在的地址
proxy_pass $filtered_sni_name:443;
}

stream 监听 443 端口,没有匹配到规则的域名转发到本地 10443 端口(10443 只是示例),10443 提供反向代理服务

hanada 发表于 2023-1-7 21:36
stream 监听 443 端口,没有匹配到规则的域名转发到本地 10443 端口(10443 只是示例),10443 提供反向代理服务 …

嗯,我也刚想到了这个方法。不知道还需不需要什么端口复用之类的,感觉有点复杂,研究中

squalll 发表于 2023-1-7 21:38
嗯,我也刚想到了这个方法。不知道还需不需要什么端口复用之类的,感觉有点复杂,研究中 …

stream 匹配不上的都 fallback 到 127.0.0.1:10443 就好了啊,http 块的 server 都用 10443 端口监听,10443 就是 http 模块管理的,可以多域名,不想被 fallback 到不存在的域名的话可以在 http 块下也加个默认 server 来拒绝匹配不上的域名请求

hanada 发表于 2023-1-7 21:41
stream 匹配不上的都 fallback 到 127.0.0.1:10443 就好了啊,http 块的 server 都用 10443 端口监听,10443 就是 htt …

# 如果没有匹配到任何规则,则默认为一个 443 端口没有服务的本地回环。
map $ssl_preread_server_name $filtered_sni_name {

~^(.*|)netflix.com$ $ssl_preread_server_name;
~^(.*|)netflix.net$ $ssl_preread_server_name;
~^(.*|)nflximg.com$ $ssl_preread_server_name;
~^(.*|)nflximg.net$ $ssl_preread_server_name;
~^(.*|)nflxvideo.net$ $ssl_preread_server_name;
~^(.*|)nflxext.com$ $ssl_preread_server_name;
~^(.*|)nflxso.net$ $ssl_preread_server_name;
~^(.*|)fast.com$ $ssl_preread_server_name;

default "127..0.0.1:444";
}
老大能帮看看嘛,我这样写,好像不行。444 端口肯定是没问题的(调成 443 就可以访问)
他那个 map 我不太熟,不知道如何写“否则”,是不是就是那个 default?可是 default 改成 127.0.0.1:444 还是不行。(但是这个 location 我改 443 就可以访问)
看到你的回复 百度了 NGINX fallback 参数以及 NGINX SNI fallback 等,全都没结果啊。。。能告知下吗

squalll 发表于 2023-1-7 22:06
# 如果没有匹配到任何规则,则默认为一个 443 端口没有服务的本地回环。
map $ssl_preread_serve …

你多了个. 吧。。。还有就是这里没啥特殊符号,没必要外面加双引号的。还有你下面 server 块有:443,这样就变成了 127.0.0.1:444:443 了,当然访问不来哦,可以 443 去掉,https 协议默认就是 443
server {
resolver 1.1.1.1;
listen 443;
ssl_preread on;
proxy_pass $filtered_sni_name;
}

hanada 发表于 2023-1-7 23:00
你多了个. 吧。。。还有就是这里没啥特殊符号,没必要外面加双引号的。还有你下面 server 块有:443,这样就 …

不是多个. 的问题,刚才那属于笔误
好像问题就在你说的 443 这上面。
之前情况:
本地内部页面使用其他端口,比如 1443
SNI 使用 443
proxy_pass $filtered_sni_name:443;
结果就是之前那样,只有外部 SNI 的奈飞能打开
而内部各种打不开,折腾一晚上了,毫无变化
按照您说的:
proxy_pass $filtered_sni_name; 去掉 443
终于有些变化了,成了本地打的开,奈飞打不开了。。。。。
似乎问题就在这上,但是如何修改才能俩都打得开呢,不过你的思路是非常对的,问题就在俩人端口不一样上。。。。。那你就把端口号也放上去吧
map $ssl_preread_server_name $filtered_sni_name {

~^(.*|)netflix.com$ $ssl_preread_server_name:443;
~^(.*|)netflix.net$ $ssl_preread_server_name:443;
~^(.*|)nflximg.com$ $ssl_preread_server_name:443;
~^(.*|)nflximg.net$ $ssl_preread_server_name:443;
~^(.*|)nflxvideo.net$ $ssl_preread_server_name:443;
~^(.*|)nflxext.com$ $ssl_preread_server_name:443;
~^(.*|)nflxso.net$ $ssl_preread_server_name:443;
~^(.*|)fast.com$ $ssl_preread_server_name:443;
default 127.0.0.1:444;
}终于 2 个都通了。
跑去看官方 ngx_stream_ssl_preread_module 模块例子,发现他每个
后端都写了端口。
而我试图在本地监听正常而奈飞异常情况下
修改
~^(.*|)netflix.com$ $ssl_preread_server_name;

~^(.*|)netflix.com$ $ssl_preread_server_name:443;
终于解决了。
所以你的问题是对的,就是端口重复了。而下面写死了 443,就肯定是 127.0.0.1:1443:443 而在上方源分别自定义端口就好了额。。。现在才看见你的回复。。。
谢谢大佬,提点这么多

正文完
 0