原帖来自于Vmess + TCP + TLS 方式的 HTTP 分流和网站伪装
这里只是塞了个trojan进去, 背景 请看原帖。
利用haproxy listen 443端口,同时处理web+trojan+v2ray流量。
流程图如下:( 不知道为啥gist不显示,typora里倒是显示正常 )
s=>start: Start
e=>end: End
op_haproxy=>operation: haproxy
sub_haproxy=>subroutine: due to tcp
in_haproxy=>inputoutput: https in port:443
out_trojan=>inputoutput: to trojan:port:8080
out_apache=>inputoutput: to apache:port:4443
out_v2ray_tcp=>inputoutput: to v2ray tcp configure:port:2333
out_default=>inputoutput: to default web:port:80
is_trojan=>condition: if trojan domain
is_cdn=>condition: if CDN domain
is_wss=>condition: if WSS domain
is_tcp=>condition: if TCP domain
is_http=>condition: if HTTP request
s->in_haproxy
in_haproxy->op_haproxy
op_haproxy->is_trojan
is_trojan(yes, right)->out_trojan
is_trojan(no)->is_cdn
is_cdn(yes, right)->out_apache
is_cdn(no)->is_wss
is_wss(yes, right)->out_apache
is_wss(no)->is_tcp
is_tcp(yes, right)->sub_haproxy
is_tcp(no)->out_default
sub_haproxy(right)->is_http
is_http(yes)->out_default
is_http(no)->out_v2ray_tcp
out_trojan->e
out_apache->e
out_v2ray_tcp->e
out_default->e
haproxy bind 433端口,对流量进行分流处理。
示例给出trojan代理,v2ray的CDN,WSS和TCP代理方式,分成以下3组:
- trojan代理
- v2ray的CDN和WSS代理
- v2ray的TCP代理
通过sni区分域名请求,转发上述流量。
TCP需要特别处理,在haproxy上处理tls后分流,http流量给web,其余的交给v2ray处理。
- haproxy1.8以上,apache2.4以上
trojan listen 8080端口,若请求域名是trojan的则分给trojan处理
apache https listen 4443端口,若请求域名是CDN/WSS的则分给apache处理
v2ray TCP listen 2333端口,若请求域名是TCP则在haproxy上终结ssl后分流给apache的80端口和v2ray的tcp配置端口
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
# mkdir /run/haproxy 要确保这个path存在
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# ca-base /etc/ssl/certs
# crt-base /etc/ssl/private
# 仅使用支持 FS 和 AEAD 的加密套件
ssl-default-bind-ciphers 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
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
# 禁用 TLS 1.2 之前的 TLS
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
tune.ssl.default-dh-param 2048
defaults
log global
mode tcp
option dontlognull
timeout connect 5s
# 空闲连接等待时间,这里使用与 V2Ray 默认 connIdle 一致的 300s
timeout client 300s
timeout server 300s
frontend tcp_in
bind *:443 alpn h2,http/1.1
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
# trojan域名代理trojan
# CDN域名代理v2ray wss走CDN的情况
# WSS域名代理v2ray的wss模式
acl is_Trojan req_ssl_sni -i trojan.domain.com
acl is_CDN req_ssl_sni -i cdn.domain.com
acl is_WSS req_ssl_sni -i wss.domain.com
# TCP域名分流
acl is_TCP req_ssl_sni -i tcp.domain.com
use_backend TROJAN if is_Trojan
use_backend CDN if is_CDN
use_backend WSS if is_WSS
use_backend TCP if is_TCP
# 其它任何tcp 443端口流量交给web
default_backend default_web
# 8080是trojan端口
# 4443是apache tls端口,CDN和WSS在apache和v2ray里是一样的配置,靠apache解tls反代ws给v2ray处理
# apache可以是其它的web server
backend TROJAN
server trojan 127.0.0.1:8080
backend CDN
server v2ray_cdn 127.0.0.1:4443
backend WSS
server v2ray_wss 127.0.0.1:4443
backend TCP
server TCP_TLS abns@/var/run/haproxy_tcp.sock send-proxy-v2
frontend TCP_TLS
mode tcp
bind abns@/var/run/haproxy_tcp.sock accept-proxy ssl crt /etc/ssl/private/tcp.domain.com.pem
# 解tls后正常http给web,否则交给v2ray的tcp处理
use_backend default_web if HTTP
default_backend v2ray_tcp
# 2333是v2ray的tcp端口
backend v2ray_tcp
server server_v2ray_tcp 127.0.0.1:2333
backend default_web
server web 127.0.0.1:80
ps:mkdir /run/haproxy 要确保这个path存在否则无法启动
提供一个思路而已,有更好的思路欢迎提comment
这种方式配置v2ray不能工作