介绍

之前我们看了如何利用nginx进行端口转发,其实更轻量的haproxy也许更合适。
原因很简单,纯粹,效率高,支持udp,简单。
介绍一下HAProxy:
简单的来说 HAProxy 就是一个负载均衡,TCP 和 HTTP 的代理程序,开源,高可用,C 写成。他原本的作用是将前端的大量流量分发到后端的服务器中,用于负载特别大的 WEB 网站的,这里被大材小用了。
使用 HAProxy 中转 SS 流量至少需要两台 VPS,国内一台,国外一台,SS 客户端直接连国内的 VPS,而通过国内的 VPS 转发流量到国外的 VPS 上。
安装
Debian/Ubuntu: sudo apt install -y haproxy Centos: sudo yum install -y haproxy
配置文件位置:/etc/haproxy/haproxy.cfg,我们只需要修改配置文件即可。
转发
这里我们只示范转发到域名的方式,分为tls模式和非tls模式。
非tls模式
监听本地49999端口,转发到test1.www.vpsxb.cn的80端口
global
    ulimit-n 51200
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
    maxconn 20480
    maxconnrate 20480
    maxsslconn 20480
    spread-checks 0
defaults
    log global
    mode tcp
    option http-server-close
    option dontlognull
    timeout connect 5000
    timeout client 120000
    timeout server 120000
frontend frontend_49999_frontend
	bind *:49999 
	bind :::49999  v6only
	mode tcp
	tcp-request inspect-delay 2s
   	tcp-request content accept if { req.ssl_hello_type 1 }
	acl is_test1.www.vpsxb.cn hdr_dom(host) -i -n test1.www.vpsxb.cn
	use_backend backend_49999_backend_test1.www.vpsxb.cn if is_test1.www.vpsxb.cn
backend backend_49999_backend_test1.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test1.www.vpsxb.cn_server test1.www.vpsxb.cn:80 cookie test1.www.vpsxb.cn_server 
tls模式
监听本地49999端口,转发到test1.www.vpsxb.cn的443端口
global
    ulimit-n 51200
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
    maxconn 20480
    maxconnrate 20480
    maxsslconn 20480
    spread-checks 0
defaults
    log global
    mode tcp
    option http-server-close
    option dontlognull
    timeout connect 5000
    timeout client 120000
    timeout server 120000
frontend frontend_49999_frontend
	bind *:49999 
	bind :::49999  v6only
	mode tcp
	tcp-request inspect-delay 2s
   	tcp-request content accept if { req.ssl_hello_type 1 }
	acl is_test1.www.vpsxb.cn req_ssl_sni -i -n test1.www.vpsxb.cn
	use_backend backend_49999_backend_test1.www.vpsxb.cn if is_test1.www.vpsxb.cn
backend backend_49999_backend_test1.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test1.www.vpsxb.cn_server test1.www.vpsxb.cn:443 cookie test1.www.vpsxb.cn_server 
端口复用
非tls模式
监听本地49999端口,转发到test1.www.vpsxb.cn和test2.www.vpsxb.cn的80端口:
global
    ulimit-n 51200
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
    maxconn 20480
    maxconnrate 20480
    maxsslconn 20480
    spread-checks 0
defaults
    log global
    mode tcp
    option http-server-close
    option dontlognull
    timeout connect 5000
    timeout client 120000
    timeout server 120000
frontend frontend_49999_frontend
	bind *:49999 
	bind :::49999  v6only
	mode tcp
	tcp-request inspect-delay 2s
   	tcp-request content accept if { req.ssl_hello_type 1 }
	acl is_test1.www.vpsxb.cn hdr_dom(host) -i -n test1.www.vpsxb.cn
	acl is_test2.www.vpsxb.cn hdr_dom(host) -i -n test2.www.vpsxb.cn
	use_backend backend_49999_backend_test1.www.vpsxb.cn if is_test1.www.vpsxb.cn
	use_backend backend_49999_backend_test2.www.vpsxb.cn if is_test2.www.vpsxb.cn
backend backend_49999_backend_test1.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test1.www.vpsxb.cn_server test1.www.vpsxb.cn:80 cookie test1.www.vpsxb.cn_server 
backend backend_49999_backend_test2.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test2.www.vpsxb.cn_server test2.www.vpsxb.cn:80 cookie test2.www.vpsxb.cn_server 
tls模式
监听本地49999端口,转发到test1.www.vpsxb.cn和test2.www.vpsxb.cn的443端口:
global
    ulimit-n 51200
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
    maxconn 20480
    maxconnrate 20480
    maxsslconn 20480
    spread-checks 0
defaults
    log global
    mode tcp
    option http-server-close
    option dontlognull
    timeout connect 5000
    timeout client 120000
    timeout server 120000
frontend frontend_49999_frontend
	bind *:49999 
	bind :::49999  v6only
	mode tcp
	tcp-request inspect-delay 2s
   	tcp-request content accept if { req.ssl_hello_type 1 }
	acl is_test1.www.vpsxb.cn req_ssl_sni -i -n test1.www.vpsxb.cn
	acl is_test2.www.vpsxb.cn req_ssl_sni -i -n test2.www.vpsxb.cn
	use_backend backend_49999_backend_test1.www.vpsxb.cn if is_test1.www.vpsxb.cn
	use_backend backend_49999_backend_test2.www.vpsxb.cn if is_test2.www.vpsxb.cn
backend backend_49999_backend_test1.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test1.www.vpsxb.cn_server test1.www.vpsxb.cn:443 cookie test1.www.vpsxb.cn_server 
backend backend_49999_backend_test2.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test2.www.vpsxb.cn_server test2.www.vpsxb.cn:443 cookie test2.www.vpsxb.cn_server 
tls与非tls混用:
监听本地49999端口,转发到test1.www.vpsxb.cn的80端口和test2.www.vpsxb.cn的443端口:
global
    ulimit-n 51200
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
    maxconn 20480
    maxconnrate 20480
    maxsslconn 20480
    spread-checks 0
defaults
    log global
    mode tcp
    option http-server-close
    option dontlognull
    timeout connect 5000
    timeout client 120000
    timeout server 120000
frontend frontend_49999_frontend
	bind *:49999 
	bind :::49999  v6only
	mode tcp
	tcp-request inspect-delay 2s
   	tcp-request content accept if { req.ssl_hello_type 1 }
	acl is_test1.www.vpsxb.cn hdr_dom(host) -i -n test1.www.vpsxb.cn
	acl is_test2.www.vpsxb.cn req_ssl_sni -i -n test2.www.vpsxb.cn
	use_backend backend_49999_backend_test1.www.vpsxb.cn if is_test1.www.vpsxb.cn
	use_backend backend_49999_backend_test2.www.vpsxb.cn if is_test2.www.vpsxb.cn
backend backend_49999_backend_test1.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test1.www.vpsxb.cn_server test1.www.vpsxb.cn:80 cookie test1.www.vpsxb.cn_server 
backend backend_49999_backend_test2.www.vpsxb.cn
	mode tcp
	server backend_49999_backend_test2.www.vpsxb.cn_server test2.www.vpsxb.cn:443 cookie test2.www.vpsxb.cn_server 
重启haproxy
systemctl restart haproxy.service
我们查看下haproxy状态,已经正常运行:



