简单分享OpenResty下的443端口共用方案

简单分享OpenResty下的443端口共用方案

Bachelor LEE Lv2

前言

在某些特殊场景下(比如,流邦卡定向免流),需要用到443(SSL/TLS)端口,A服务需要用到,B服务也要用到,但是操作系统内同一时刻只允许一个程序来监听同一个端口。所以本文基于Debian 12 系统来分享一下443端口的共用方案。

首先安装OpenResty

  • 安装必要的依赖
1
2
sudo apt update
sudo apt install -y curl gnupg2 ca-certificates lsb-release
  • 添加 OpenResty 官方仓库
1
curl -fsSL https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty-archive-keyring.gpg
  • 添加 OpenResty 的仓库到 APT 源列表
1
echo "deb [signed-by=/usr/share/keyrings/openresty-archive-keyring.gpg] http://openresty.org/package/debian $(lsb_release -sc) openresty" | sudo tee /etc/apt/sources.list.d/openresty.list
  • 安装 OpenResty
1
2
sudo apt update
sudo apt install -y openresty
  • 启动和配置 OpenResty
1
2
sudo systemctl start openresty
sudo systemctl enable openresty

添加 stream模块

编辑 /etc/openresty/nginx.conf 文件,添加 stream 模块。

注意:stream模块和http模块应是平级关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    stream {
map $ssl_preread_server_name $backend_name {
a.example.com Server_A;
b.example.com Server_B;
default web; #默认情况
}
# web 后端服务
upstream web {
server 【ip】:【port】;
}
# Server_B 后端服务
upstream Server_B {
server 【ip】:【port】;
}
# Server_A 后端服务
upstream Server_A{
server 【ip】:【port】;
}
server {
listen 443 ;
listen [::]:443;
proxy_pass $backend_name;
ssl_preread on;
}
}

端口复用的原理

说到这里,就简单的说一下原理了。stream 模块是 OpenResty 提供的专门用来处理 TCP/UDP 协议的模块,通过 proxy_pass 指令转发请求到对应的 upstream 模块即可。而 map 指令则是用来定义一个映射关系的,通过 map 指令,我们可以将一个变量映射到另一个变量,从而实现端口复用。

分享一个流邦定向免流方案

我用的是Trojan协议进行流量转发,Trojan协议是使用TLS加密的,且流邦免流需要用到443端口,而网站https也需要用到443,刚好符合OpenResty挡在前面来分流。混淆用的抖音系列host p26.douyinpic.com自签证书trojan搭建这里不再赘述。

OpenResty 配置

tips: 如果原本https监听端口为443,需要修改为8443端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

events {
#保持默认
}

stream {
map $ssl_preread_server_name $backend_name {
p26.douyinpic.com trojan;
default web;
}
# web 后端服务
upstream web {
server 127.0.0.1:8443;
}
# trajon 后端服务
upstream trojan{
server 127.0.0.1:8083;
}
server {
listen 443 ;
listen [::]:443 ;
proxy_pass $backend_name;
ssl_preread on;
}
}

http {
# 保持默认即可
}

结语

OpenResty的stream模块是工作在 OSI模型的(四层)传输层,而http模块是工作在(七层)应用层。恰巧trojan是基于TCP传输,所以可以通过这种方法来实现443端口的复用。

  • 标题: 简单分享OpenResty下的443端口共用方案
  • 作者: Bachelor LEE
  • 创建于 : 2024-11-10 20:47:27
  • 更新于 : 2024-11-10 21:48:26
  • 链接: https://blog.inik.cc/2024/11/10/00356b776dfa.html
  • 版权声明: 本文章采用 CC BY-NC 4.0 进行许可。