全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 3014|回复: 12

[nginx] 分享一个用Nginx TLS隧道+ssl_preread实现单端口无限复用的方法

[复制链接]
发表于 2022-12-1 13:15:20 | 显示全部楼层 |阅读模式
先说有什么用:
省流版:完全没用

不省流版:
比如你买了一个NAT VPS,而他只给你10个端口,你嫌不够用。
用这个方法可以一个端口无限复用
限制就是需要一台有多个端口的机器中转

原理就是使用2台VPS,都安装了Nginx然后两者之间搭建了TLS隧道。

直接上配置举个例子,中转机配置
  1. stream {

  2.     server {
  3.         listen 50001;
  4.         proxy_ssl on;
  5.         ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;
  6.         ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;
  7.         proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  8.         proxy_ssl_server_name on;
  9.         proxy_ssl_name ssh.example.com;
  10.         proxy_pass 123.123.123.123:12345;
  11.     }

  12.     server {
  13.         listen 50002;
  14.         proxy_ssl on;
  15.         ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;
  16.         ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;
  17.         proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  18.         proxy_ssl_server_name on;
  19.         proxy_ssl_name netcat.example.com;
  20.         proxy_pass 123.123.123.123:12345;
  21.     }

  22.     server {
  23.         listen 50003;
  24.         proxy_ssl on;
  25.         ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;
  26.         ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;
  27.         proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  28.         proxy_ssl_server_name on;
  29.         proxy_ssl_name web.example.com;
  30.         proxy_pass 123.123.123.123:12345;
  31.     }

  32. }
复制代码


目标落点机配置
  1. stream {

  2.     resolver 1.1.1.1 8.8.8.8 [2606:4700:4700::1111] [2001:4860:4860::8888] valid=300s;
  3.     resolver_timeout 10s;

  4.     map_hash_bucket_size 64;
  5.     map $ssl_preread_server_name $proxy_pass_target {

  6.         ssh.example.com 127.0.0.1:50001;
  7.         netcat.example.com 127.0.0.1:50002;
  8.         web.example.com 127.0.0.1:50003;

  9.         default 127.0.0.1:65535;

  10.     }

  11.     server {
  12.         listen 12345;
  13.         ssl_preread on;
  14.         proxy_pass $proxy_pass_target;
  15.     }

  16.     server {
  17.         listen 127.0.0.1:50001 ssl;
  18.         ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;
  19.         ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;
  20.         ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  21.         proxy_pass 127.0.0.1:22;
  22.     }

  23.     server {
  24.         listen 127.0.0.1:50002 ssl;
  25.         ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;
  26.         ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;
  27.         ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  28.         proxy_pass 127.0.0.1:123;
  29.     }

  30.     server {
  31.         listen 127.0.0.1:50003 ssl;
  32.         ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;
  33.         ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;
  34.         ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  35.         proxy_pass 127.0.0.1:443;
  36.     }

  37. }
复制代码


在以上例子中,
中转机的50001、50002、50003端口分别对应了目标机器的ssh, netcat, https web服务。
连接到中转机的50001、50002、50003端口后,分别添加不同的proxy_ssl_name,
然后中转到落地目标机器的12345端口。
经过目标机器识别不同的ssl_preread_server_name后分别转到目标机器的50001、50002、50003端口
然后卸掉ssl,再中转到对应的服务端口。

这个功能的重点是ssl_preread_server_name这个功能,
如果你看懂了以上配置,对以上例子进行举一反三后,可以在落地机器搭配多个map ssl_preread_server_name proxy_pass_target块实现更多功能,
以及中转机和落地机器使用proxy_protocol进行源IP的传递。
比如:使用2个map ssl_preread_server_name块,同时将一台机器的443端口作为网站服务器与(指定域名的)反代服务器。
不过我想这个功能你们也应该不需要就不贴配置了,非常的长就是了。

如果你看完还不知道到底有什么用就说明你根本不需要这个功能。
反正我自己用了好多年了,非常好用~~~

特别提一嘴:这个功能不是让你来单端口复用梯子的,TLS隧道不防墙,不要瞎揣测,不用试。

评分

参与人数 1威望 +5 收起 理由
bannelu + 5 很给力!

查看全部评分

发表于 2022-12-1 13:34:18 | 显示全部楼层
阅读权限 1 有什么用?

省流版:完全没用
不省流版:
阅读权限 1 游客都能看,最低阅读权限 10 才能拦住游客,但也会拦住神仙~
发表于 2022-12-1 13:26:50 | 显示全部楼层
6 我喜欢省流版
发表于 2022-12-1 13:27:02 | 显示全部楼层
作用就是:完全没用 可把我乐坏了
发表于 2022-12-1 13:28:45 | 显示全部楼层
为楼主点赞,一颗爱分享的心。
发表于 2022-12-1 13:33:54 | 显示全部楼层
一眼就看到省流版
发表于 2022-12-1 13:35:37 | 显示全部楼层
技术贴绑定
发表于 2022-12-1 13:56:25 | 显示全部楼层
跟一个端口配多个server_name有什么区别?
看完之后果然是:完全没用
发表于 2022-12-1 14:00:28 | 显示全部楼层
大佬,能不能实现:在一台中转机上,根据不同的域名进行转发,登陆不同服务器的远程桌面,即RDP
比如:
a.com 转发到 1.1.1.1:3389
b.com 转发到 2.2.2.2:3389
c.com 转发到 3.3.3.3:3389

这样,我只需要在远程桌面地址栏输入域名就登陆对应的服务器了。现在我用的是加端口号的方式,比较麻烦。

点评

不行。  发表于 2022-12-1 14:13
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-20 16:27 , Processed in 0.064113 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表