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

1,419 阅读2分钟

需求缘由:

  • 当 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反向代理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**主配置文件****,**可以添加最末尾,可以添加 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重载配置文件。

完成,开始使用!

至此 SSH客户端 即可通过 VPS 的 22822端口 成功连接 SSH 服务!