侧边栏壁纸
  • 累计撰写 56 篇文章
  • 累计创建 39 个标签
  • 累计收到 69 条评论

目 录CONTENT

文章目录

ssh(sftp)和https共用同一端口【Nginx根据TLS、Alpn、SNI分流】

草莓牛奶
2023-01-11 / 0 评论 / 0 点赞 / 622 阅读 / 2,332 字 / 正在检测是否收录...
温馨提示:
「博客文章out of date 会及时更新,无特殊说明仍然有效,欢迎指正内容中的错误」

一、ssh(sftp)和https共用同一端口【Nginx根据TLS/SSL分流】

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能,SFTP 为 SSH的其中一部分。

stream {
    upstream ssh {
        server ssh.example.com:22;
    }

    upstream web {
        server tls.example.com:443;
    }

    map $ssl_preread_protocol $upstream {
        ""      ssh;
        default web;
    }

    # SSH and SSL on the same port
    server {
        listen      443;
        listen [::]:443;

        proxy_pass $upstream;
        ssl_preread on;
    }
}

ssl_preread_protocol 指令是用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的协议类型,以便将请求路由到正确的后端服务器。可以用来在同一个 IP 地址上,同时部署多个服务器,例如部署不同协议的服务器 (HTTP / HTTPS)或不同版本的服务器( TLS 1.2 / 1.3) 。

Generated by Chatgpt:

这段代码定义了一个 nginx 的配置文件的一部分,它定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器。

这段代码中定义了三个部分:

  • upstream 指令,定义了两个上游服务器集群,一个是 ssh 集群,另一个是 web 集群,两个集群都只有一台服务器,ssh 集群的服务器监听在 ssh.example.com 上的端口22,web 集群的服务器监听在tls.example.com上的端口443
  • map 指令, 定义了一个名为 $upstream 的变量,并使用了 $ssl_preread_protocol 来进行映射。如果 $ssl_preread_protocol 的值是空字符串,那么 $upstream 的值就是 ssh;如果 $ssl_preread_protocol 的值是其他值,那么 $upstream 的值就是 web。
  • server 指令,定义了一个流式协议服务器,监听端口443 (支持ipv6) ,开启了ssl_preread指令。并且使用了 proxy_pass 指令将请求转发到 $upstream 变量对应的上游服务器集群。当请求到达这个服务器时,会先预读取请求中的协议类型,如果是"" (也就是空字符串) 就转发到 ssh 集群,否则转发到web集群, 这样就支持了在同一端口上使用不同协议来提供服务。

总的来说, 这段代码定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器,并且使用了ssl_preread_protocol来预读取协议类型,基于协议类型来路由请求,实现在同一个端口上支持多种协议的服务

关于上述配置后,可能会存在后端或日志中存在内网IP的问题,解决方法详见nginx使用stream转发传递真实IP

二、【Nginx根据ALPN分流】

ssl_preread_alpn_protocols 指令支持一个由空格分隔的协议列表作为参数,每个协议都必须是一个有效的协议名称。在 ALPN 中支持的协议取决于客户端和服务器使用的 SSL/TLS 库。

常见的 ALPN 协议有:

  • h2: HTTP/2 协议
  • http/1.1: HTTP/1.1 协议
  • h3: HTTP/3协议
stream {
	map $ssl_preread_alpn_protocols $proxy {
    	~\h2\b           127.0.0.1:8001;
    	~\http/1.1\b     127.0.0.1:8002;
    	~\xmpp-client\b  127.0.0.1:8003;
	}

	server {
    	listen      9000;
        listen [::]:9000;
    	proxy_pass  $proxy;
    	ssl_preread on;
	}
}

xmpp-client 是 Extensible Messaging and Presence Protocol (XMPP) 客户端协议的名称,它是一种开放协议,通常用于在应用之间进行实时通信。XMPP 允许跨平台和跨语言的通信,它可以用于多种应用,如即时通信(IM)、网络会议和消息推送等。

ssl_preread_alpn_protocols 指令中使用 xmpp-client,意味着你要预读取这种协议类型,并在请求中匹配,然后路由到特定的后端服务器,通常是xmpp相关的服务器.

三、【Nginx根据SNI分流】

ssl_preread_server_name 指令是 nginx 中用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的 Server Name Indication (SNI) 信息。 SNI 是一种扩展,允许客户端在进行 SSL/TLS 握手时向服务器发送主机名,以便服务器可以根据主机名来选择适当的证书。

stream {
	map $ssl_preread_server_name $name {
    	backend.example.com      backend;
    	default                  backend2;
	}

	upstream backend {
    	server 192.168.0.2:12345;
	}

	upstream backend2 {
    	server 192.168.0.3:12345;
	}

	server {
    	listen      12346;
    	listen [::]:12346;
    	proxy_pass  $name;
    	ssl_preread on;
	}
}

参考内容:

Module ngx_stream_ssl_preread_module (nginx.org)

Nginx配置一个端口同时处理多种协议 ### 一、ssh(sftp)和https共用同一端口【Nginx根据TLS/SSL分流】

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能,SFTP 为 SSH的其中一部分。

stream {
    upstream ssh {
        server ssh.example.com:22;
    }

    upstream web {
        server tls.example.com:443;
    }

    map $ssl_preread_protocol $upstream {
        ""      ssh;
        default web;
    }

    # SSH and SSL on the same port
    server {
        listen      443;
        listen [::]:443;

        proxy_pass $upstream;
        ssl_preread on;
    }
}

ssl_preread_protocol 指令是用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的协议类型,以便将请求路由到正确的后端服务器。可以用来在同一个 IP 地址上,同时部署多个服务器,例如部署不同协议的服务器 (HTTP / HTTPS)或不同版本的服务器( TLS 1.2 / 1.3) 。

Generated by Chatgpt:

这段代码定义了一个 nginx 的配置文件的一部分,它定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器。

这段代码中定义了三个部分:

  • upstream 指令,定义了两个上游服务器集群,一个是 ssh 集群,另一个是 web 集群,两个集群都只有一台服务器,ssh 集群的服务器监听在 ssh.example.com 上的端口22,web 集群的服务器监听在tls.example.com上的端口443
  • map 指令, 定义了一个名为 $upstream 的变量,并使用了 $ssl_preread_protocol 来进行映射。如果 $ssl_preread_protocol 的值是空字符串,那么 $upstream 的值就是 ssh;如果 $ssl_preread_protocol 的值是其他值,那么 $upstream 的值就是 web。
  • server 指令,定义了一个流式协议服务器,监听端口443 (支持ipv6) ,开启了ssl_preread指令。并且使用了 proxy_pass 指令将请求转发到 $upstream 变量对应的上游服务器集群。当请求到达这个服务器时,会先预读取请求中的协议类型,如果是"" (也就是空字符串) 就转发到 ssh 集群,否则转发到web集群, 这样就支持了在同一端口上使用不同协议来提供服务。

总的来说, 这段代码定义了一个使用 SSL/TLS 和 SSH 协议的流式协议服务器,并且使用了ssl_preread_protocol来预读取协议类型,基于协议类型来路由请求,实现在同一个端口上支持多种协议的服务

关于上述配置后,可能会存在后端或日志中存在内网IP的问题,解决方法详见nginx使用stream转发传递真实IP

二、【Nginx根据ALPN分流】

ssl_preread_alpn_protocols 指令支持一个由空格分隔的协议列表作为参数,每个协议都必须是一个有效的协议名称。在 ALPN 中支持的协议取决于客户端和服务器使用的 SSL/TLS 库。

常见的 ALPN 协议有:

  • h2: HTTP/2 协议
  • http/1.1: HTTP/1.1 协议
  • h3: HTTP/3协议
stream {
	map $ssl_preread_alpn_protocols $proxy {
    	~\h2\b           127.0.0.1:8001;
    	~\http/1.1\b     127.0.0.1:8002;
    	~\xmpp-client\b  127.0.0.1:8003;
	}

	server {
    	listen      9000;
        listen [::]:9000;
    	proxy_pass  $proxy;
    	ssl_preread on;
	}
}

xmpp-client 是 Extensible Messaging and Presence Protocol (XMPP) 客户端协议的名称,它是一种开放协议,通常用于在应用之间进行实时通信。XMPP 允许跨平台和跨语言的通信,它可以用于多种应用,如即时通信(IM)、网络会议和消息推送等。

ssl_preread_alpn_protocols 指令中使用 xmpp-client,意味着你要预读取这种协议类型,并在请求中匹配,然后路由到特定的后端服务器,通常是xmpp相关的服务器.

三、【Nginx根据SNI分流】

ssl_preread_server_name 指令是 nginx 中用来在进行 SSL/TLS 握手之前,预读取客户端发送过来的 Server Name Indication (SNI) 信息。 SNI 是一种扩展,允许客户端在进行 SSL/TLS 握手时向服务器发送主机名,以便服务器可以根据主机名来选择适当的证书。

stream {
	map $ssl_preread_server_name $name {
    	backend.example.com      backend;
    	default                  backend2;
	}

	upstream backend {
    	server 192.168.0.2:12345;
	}

	upstream backend2 {
    	server 192.168.0.3:12345;
	}

	server {
    	listen      12346;
    	listen [::]:12346;
    	proxy_pass  $name;
    	ssl_preread on;
	}
}

参考内容:

Module ngx_stream_ssl_preread_module (nginx.org)

Nginx配置一个端口同时处理多种协议

0

评论区