关于nginx的 ssl_preread选项的问题

230 views
Skip to first unread message

goutong

unread,
Jan 12, 2023, 3:40:32 AM1/12/23
to openresty

有一个三方建立起来的通信网络:第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”,这个对我来说很陌生,能告诉我原因吗?

Reply all
Reply to author
Forward
0 new messages