需求缘由:

  • 当 VPS 在墙外时,SSH 的默认 22端口 是个非常敏感的端口,极为容易被墙主动干扰造成 SSH 登录失败。
  • 若是被墙扫描到正在连接 22端口 且墙的执行策略决定干扰你这个连接,则此时不仅 22端口 被阻断,而是所有端口都会被关闭会话。虽然一分钟内就能恢复其他端口畅通(22端 口仍被阻断),但一些保持会话的 Web 网页服务会异常需要重新刷新页面建立会话。

解决思路:

SSH使用非22端口
1、根本性修改SSH配置文件,使用其他非 22 端口
2、其他端口转发到 22 端口

注意事项:

Nginx 反代 TCP 协议必须使用 stream 模块,不能使用 http 模块,因 http 的 proxy_pass 无法承载TCP协议,所以关于stream的配置只能写到Nginx的主配置文件,而不是某个新建网站的子配置文件。

更多问题

关于Nginx proxy_connect_timeout 的问题

Nginx反向代理TCP协议端口

  • 查询Nginx确认已安装模块"–with-stream",宝塔面板安装Nginx环境默认是带有stream模块的

      root@vps:~# nginx -V
      nginx version: nginx/1.20.1
      built with OpenSSL 1.1.1k  25 Mar 2021
      TLS SNI support enabled
      configure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=srclib/ngx_devel_kit --add-module=srclib/lua_nginx_module --add-module=srclib/ngx_cache_purge --add-module=srclib/nginx-sticky-module --with-openssl=srclib/openssl --with-pcre=srclib/pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-http_dav_module --add-module=srclib/nginx-dav-ext-module
    
  • stream代码模块追加到Nginx的主配置文件

  • 务必注意:stream 模块与 http 模块处于同一级!捋清楚 Nginx主配置文件 中你要添加位置的上一个 “}” 的定义范围,不要级别错误!

  • 将以下 stream代码模块 追加到 Nginx主配置文件nginx.conf,可以添加最末尾,可以添加 http模块 前面,也可以将添加到 “worker_rlimit_nofile 51200 和 events 之间”:

       #stream模块与http模块处于同一级;这两个模块可以共存。
      stream {   
      upstream ssh{    
          server 127.0.0.1:22;       #源服务
          }
      upstream http{
          server 127.0.0.1:80;       #源服务
          }
      server {
          listen 22822;                    #监听代理主机的端口
          proxy_connect_timeout 1h;
          proxy_timeout 1h;
          proxy_pass ssh;            #转向的服务
          }
      server {
          listen 22880;                    ##监听代理主机的端口
          proxy_connect_timeout 1h;
          proxy_timeout 1h;
          proxy_pass http;            ##转向的服务
          }
      }
    
  • 重新加载配置,完成

参考 Nginx反向代理TCP协议【反代SSH端口】

Q.E.D.