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

55次阅读

共计 3337 个字符,预计需要花费 9 分钟才能阅读完成。

先说有什么用:省流版:完全没用。不省流版:比如你买了一个 NAT VPS,而他只给你 10 个端口,你嫌不够用。用这个方法可以一个端口无限复用限制就是需要一台有多个端口的机器中转原理就是使用 2 台 VPS,都安装了 Nginx 然后两者之间搭建了 TLS 隧道。直接上配置举个例子,中转机配置 stream {    server {        listen 50001;        proxy_ssl on;        ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;        ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;        proxy_ssl_server_name on;        proxy_ssl_name ssh.example.com;        proxy_pass 123.123.123.123:12345;   }    server {        listen 50002;        proxy_ssl on;        ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;        ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;        proxy_ssl_server_name on;        proxy_ssl_name netcat.example.com;        proxy_pass 123.123.123.123:12345;   }    server {        listen 50003;        proxy_ssl on;        ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;        ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;        proxy_ssl_server_name on;        proxy_ssl_name web.example.com;        proxy_pass 123.123.123.123:12345;   }}复制代码目标落点机配置 stream {    resolver 1.1.1.1 8.8.8.8 [2606:4700:4700::1111] [2001:4860:4860::8888] valid=300s;    resolver_timeout 10s;    map_hash_bucket_size 64;    map $ssl_preread_server_name $proxy_pass_target {        ssh.example.com 127.0.0.1:50001;        netcat.example.com 127.0.0.1:50002;        web.example.com 127.0.0.1:50003;        default 127.0.0.1:65535;   }    server {        listen 12345;        ssl_preread on;        proxy_pass $proxy_pass_target;   }    server {        listen 127.0.0.1:50001 ssl;        ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;        ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;        proxy_pass 127.0.0.1:22;   }    server {        listen 127.0.0.1:50002 ssl;        ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;        ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;        proxy_pass 127.0.0.1:123;   }    server {        listen 127.0.0.1:50003 ssl;        ssl_certificate /usr/local/nginx/conf/ssl/example.com/fullchain.cer;        ssl_certificate_key /usr/local/nginx/conf/ssl/example.com/example.com.key;        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;        proxy_pass 127.0.0.1:443;   }}复制代码在以上例子中,中转机的 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 隧道不防墙,不要瞎揣测,不用试。supervps 2022-12-01 13:26 26 我喜欢省流版 Myan 2022-12-01 13:27 3 作用就是:完全没用 可把我乐坏了 spr1ng 2022-12-01 13:27 4 说的好 sagit 2022-12-01 13:28 5 为楼主点赞,一颗爱分享的心。fjm 2022-12-01 13:33 6 一眼就看到省流版 G.K.D 2022-12-01 13:34 7 阅读权限 1 有什么用?省流版:完全没用。不省流版:阅读权限 1 游客都能看,最低阅读权限 10 才能拦住游客,但也会拦住神仙~ bannelu 2022-12-01 13:35 8 技术贴绑定 larry 2022-12-01 13:56 9 跟一个端口配多个 server_name 有什么区别?看完之后果然是:完全没用。

正文完