我以前做过的一个 nginx 配置,如下:
stream {
map $ssl_preread_server_name $upstream {
www.somedomain.cn nginx;
web.somedomain.cn nginx;
ovn.somedomain.cn openvpn;
sks.somedomain.cn socks5;
default ssh;
}
server {
listen 10.10.10.10:443;
resolver 8.8.8.8;
proxy_pass $upstream;
ssl_preread on;
}
upstream ssh {
server 127.0.0.1:22;
}
upstream openvpn {
server 127.0.0.1:1194;
}
upstream nginx {
server 127.0.0.1:443;
}
upstream socks5 {
server 127.0.0.1:1081;
}
}
根据 nginx 的 ssl_preread 读到的域名信息来区分不同的目的地。正常的访问转到 nginx ,对于 ssh 访问因为没有域名信息所以等几秒后会转到 ssh 上。
对于 openvpn 和 sockets5 ,需要客户端启动一个 stunnel 软件,该软件采用 https 方式连接上来,打通一个隧道供 openvn 和 sockets 客户端使用。