level 1
好好好好丶卡
楼主
场景:
有一个三方建立起来的通信网络:第1方有两个tcp的服务端;第2方有一个tcp服务端,一个tcp客户端,该客户端连接第1方的一个服务端;第3方有两个tcp服务端,分别连接第1方的另一个服务端和第2方的服务端。
第1方运行两个tcp的服务端,需要两个端口来接受tcp连接。为两个tcp连接打开两个端口看起来很容易,但是在一些情况下存在困难。上述通信方式可能是单个任务的通信,并且该任务可能在生产环境中并行运行。这将会导致一个问题:多个任务并行运行时将开启多个tcp端口,其数量是任务数的2倍,但这在一些行业是不被允许的,例如银行和保险公司等,这些公司的防火墙只允许一个tcp端口去接受新的tcp连接。一个很自然的能解决该问题的方法是设置代理,那么nginx就是最好的选择。
新的问题来了,当任务并行运行时,一个公司中会有多个tcp服务端同时运行,并且只有一个tcp端口被允许去接受新的连接,nginx是如何知道将哪个tcp连接转发到哪个内部tcp服务端呢?我们的解决方案是根据SNI转发。因此,当任务的tcp客户端想去连接他的tcp服务端时:
1. 首先创建一个tcp连接至本地的nginx;
2. 本地nginx创建新的tls连接至对端的nginx,并将TLS SNI设置为该任务的任务ID;
3. 对端的nginx接受新的tls连接,然后根据TLS SNI值,创建新的tcp连接至内部tcp服务端。
进行1-3步后,客户端可以连接到对应的服务端,并且其他的客户端也可以根据不同的TLS SNI值连接至对应的服务端。
第1方的nginx配置:
stream {
map $ssl_server_name $stream_map {
mission_task_1 upstream_task_1;
mission_task_2 upstream_task_2;
}
upstream upstream_task_1 {
server 127.0.0.1:1313;
}
upstream upstream_task_2 {
server 127.0.0.1:1314;
}
server {
listen 8185 ssl;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_pass $stream_map;
proxy_ssl off;
#ssl_preread on;
}
}
第2方的nginx配置:
stream {
map $ssl_server_name $stream_map {
mission_task_3 upstream_task_3;
}
upstream upstream_task_3 {
server 127.0.0.1:1315;
}
server {
listen 8185 ssl;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_pass $stream_map;
proxy_ssl off;
#ssl_preread on;
}
server {
listen 9185;
proxy_pass 192.168.23.169:8185;
proxy_ssl on;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_ssl_server_name on;
proxy_ssl_name mission_task_1;
}
}
第3方的nginx配置:
stream {
server {
listen 9185;
proxy_pass 192.168.30.110:8185;
proxy_ssl on;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_ssl_server_name on;
proxy_ssl_name mission_task_3;
}
server {
listen 8185;
proxy_pass 192.168.23.169:8185;
proxy_ssl on;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_ssl_server_name on;
proxy_ssl_name mission_task_2;
}
}
问题:
在上边的配置中,我们发现:如果将ssl_preread设置为“on”,第1方的nginx将不能转发tcp连接至内部的tcp服务端,因此我们设置成了“off”,但是不知道具体的原因,求大佬告知
2023年01月13日 03点01分
1
有一个三方建立起来的通信网络:第1方有两个tcp的服务端;第2方有一个tcp服务端,一个tcp客户端,该客户端连接第1方的一个服务端;第3方有两个tcp服务端,分别连接第1方的另一个服务端和第2方的服务端。
第1方运行两个tcp的服务端,需要两个端口来接受tcp连接。为两个tcp连接打开两个端口看起来很容易,但是在一些情况下存在困难。上述通信方式可能是单个任务的通信,并且该任务可能在生产环境中并行运行。这将会导致一个问题:多个任务并行运行时将开启多个tcp端口,其数量是任务数的2倍,但这在一些行业是不被允许的,例如银行和保险公司等,这些公司的防火墙只允许一个tcp端口去接受新的tcp连接。一个很自然的能解决该问题的方法是设置代理,那么nginx就是最好的选择。
新的问题来了,当任务并行运行时,一个公司中会有多个tcp服务端同时运行,并且只有一个tcp端口被允许去接受新的连接,nginx是如何知道将哪个tcp连接转发到哪个内部tcp服务端呢?我们的解决方案是根据SNI转发。因此,当任务的tcp客户端想去连接他的tcp服务端时:
1. 首先创建一个tcp连接至本地的nginx;
2. 本地nginx创建新的tls连接至对端的nginx,并将TLS SNI设置为该任务的任务ID;
3. 对端的nginx接受新的tls连接,然后根据TLS SNI值,创建新的tcp连接至内部tcp服务端。
进行1-3步后,客户端可以连接到对应的服务端,并且其他的客户端也可以根据不同的TLS SNI值连接至对应的服务端。
第1方的nginx配置:
stream {
map $ssl_server_name $stream_map {
mission_task_1 upstream_task_1;
mission_task_2 upstream_task_2;
}
upstream upstream_task_1 {
server 127.0.0.1:1313;
}
upstream upstream_task_2 {
server 127.0.0.1:1314;
}
server {
listen 8185 ssl;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_pass $stream_map;
proxy_ssl off;
#ssl_preread on;
}
}
第2方的nginx配置:
stream {
map $ssl_server_name $stream_map {
mission_task_3 upstream_task_3;
}
upstream upstream_task_3 {
server 127.0.0.1:1315;
}
server {
listen 8185 ssl;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_pass $stream_map;
proxy_ssl off;
#ssl_preread on;
}
server {
listen 9185;
proxy_pass 192.168.23.169:8185;
proxy_ssl on;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_ssl_server_name on;
proxy_ssl_name mission_task_1;
}
}
第3方的nginx配置:
stream {
server {
listen 9185;
proxy_pass 192.168.30.110:8185;
proxy_ssl on;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_ssl_server_name on;
proxy_ssl_name mission_task_3;
}
server {
listen 8185;
proxy_pass 192.168.23.169:8185;
proxy_ssl on;
ssl_certificate /home/ttt/nginx-cfg/cert/server1.crt;
ssl_certificate_key /home/ttt/nginx-cfg/cert/server1.key;
proxy_ssl_server_name on;
proxy_ssl_name mission_task_2;
}
}
问题:
在上边的配置中,我们发现:如果将ssl_preread设置为“on”,第1方的nginx将不能转发tcp连接至内部的tcp服务端,因此我们设置成了“off”,但是不知道具体的原因,求大佬告知