Nginx與Trojan共用443端口
這個部分主要是摘自Trojan 共用 443 端口方案缴饭。
首先是為什么Nginx可以同時在443偵聽多個https服務?因為是通過不同的SNI(TLS 服務器名稱指示)來區(qū)分不同的域名的。
在虛擬主機流行前,一個服務 IP 只會有一個 TLS 服務站點彬向,只會有一張 SSL 證書,所以請求來了就只有一張證書攻冷,沒得選直接用就好了娃胆。
后面虛擬主機流行起來,一個服務 IP 可以有多個 TLS 服務站點讲衫,那就有多個 SSL 證書缕棵,那怎么明確這次請求用哪張證書呢?
于是就有了 SNI(TLS 服務器名稱指示)涉兽,它要求在一個 IP 有多個 TLS 服務站點的情況下招驴,客戶端在初始 TLS 握手期間指定要連接到哪個站點,數(shù)據(jù)上的實現(xiàn)就是在 Client Hello 階段里面新增一個 server_name 字段枷畏。
這是原文的流量圖
首先得明確别厘,Trojan 是無法通過 Nginx 在 7 層進行代理的,所以它設(shè)定必須在流量入口拥诡,Nginx 都只能掛在它的后面触趴。
所以總的來說,就是所有流量都是通過443先打到Nginx渴肉,再由Nginx負責分發(fā)冗懦,轉(zhuǎn)到相應的端口。
Nginx 支持基于 SNI 的 4 層轉(zhuǎn)發(fā)仇祭。簡單說就是:識別 SNI 信息披蕉,然后直接轉(zhuǎn)發(fā) TCP/UDP 數(shù)據(jù)流。這個可以比 7 層的虛擬主機轉(zhuǎn)發(fā)厲害太多了乌奇,該功能由 ngx_stream_ssl_preread_module 模塊提供没讲,但是 Nginx 默認不啟用該模塊,配置起來也很簡單礁苗,需要注意的是該模塊屬于 stream 爬凑,不是大家常用的 http。
P.S. 下面的Nginx配置和Trojan配置都是摘自原文
Nginx配置如下
user nginx;
pid /var/run/nginx.pid;
# 其他配置保持默認即可
# 流量轉(zhuǎn)發(fā)核心配置
stream {
# 這里就是 SNI 識別试伙,將域名映射成一個配置名
map $ssl_preread_server_name $backend_name {
web.cn.chengxiaobai web;
vmess.cn.chengxiaobai vmess;
trojan.cn.chengxiaobai trojan;
# 域名都不匹配情況下的默認值
default web;
}
# web嘁信,配置轉(zhuǎn)發(fā)詳情
upstream web {
server 127.0.0.1:10240;
}
# trojan,配置轉(zhuǎn)發(fā)詳情
upstream trojan {
server 127.0.0.1:10241;
}
# vmess迁霎,配置轉(zhuǎn)發(fā)詳情
upstream vmess {
server 127.0.0.1:10242;
}
# 監(jiān)聽 443 并開啟 ssl_preread
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $backend_name;
ssl_preread on;
}
}
http {
# 這塊保持不變即可
}
Trojan配置如下
{
"run_type": "server",
"local_addr": "127.0.0.1",
"local_port": 10241,
"remote_addr": "127.0.0.1",//轉(zhuǎn)發(fā)回 nginx 默認頁面
"remote_port": 80,
"password": [
"密碼"
],
"log_level": 3,
"ssl": {
"cert": "證書地址.crt",
"key": "證書地址.key",
"key_password": "",
"cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384",
"cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
"prefer_server_cipher": true,
"alpn": [
"http/1.1"
],
"alpn_port_override": {
"h2": 81
},
"reuse_session": true,
"session_ticket": false,
"session_timeout": 600,
"plain_http_response": "",
"curves": "",
"dhparam": ""
},
"tcp": {
"prefer_ipv4": false,
"no_delay": true,
"keep_alive": true,
"reuse_port": false,
"fast_open": false,
"fast_open_qlen": 20
},
"mysql": {
"enabled": false,
"server_addr": "127.0.0.1",
"server_port": 3306,
"database": "trojan",
"username": "trojan",
"password": "",
"cafile": ""
}
}
Nginx 層統(tǒng)一管理收斂流量入口吱抚,整個主機只用開啟 443 和 SSH 端口即可,同時各個模塊都做了偽裝考廉,「非標請求」看到的都是正常的頁面秘豹,而且 WS 協(xié)議的 CDN 大法完美支持。
同時得益于 Nginx 的優(yōu)秀性能和對 HTTP 協(xié)議的支持力度昌粤,全部請求都可以 HTTP2既绕。