介绍
之前我们看了如何利用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.vpsxb.net的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.vpsxb.net hdr_dom(host) –i –n test1.vpsxb.net
- use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
- backend backend_49999_backend_test1.vpsxb.net
- mode tcp
- server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:80 cookie test1.vpsxb.net_server
tls模式
监听本地49999端口,转发到test1.vpsxb.net的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.vpsxb.net req_ssl_sni –i –n test1.vpsxb.net
- use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
- backend backend_49999_backend_test1.vpsxb.net
- mode tcp
- server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:443 cookie test1.vpsxb.net_server
端口复用
非tls模式
监听本地49999端口,转发到test1.vpsxb.net和test2.vpsxb.net的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.vpsxb.net hdr_dom(host) –i –n test1.vpsxb.net
- acl is_test2.vpsxb.net hdr_dom(host) –i –n test2.vpsxb.net
- use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
- use_backend backend_49999_backend_test2.vpsxb.net if is_test2.vpsxb.net
- backend backend_49999_backend_test1.vpsxb.net
- mode tcp
- server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:80 cookie test1.vpsxb.net_server
- backend backend_49999_backend_test2.vpsxb.net
- mode tcp
- server backend_49999_backend_test2.vpsxb.net_server test2.vpsxb.net:80 cookie test2.vpsxb.net_server
tls模式
监听本地49999端口,转发到test1.vpsxb.net和test2.vpsxb.net的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.vpsxb.net req_ssl_sni –i –n test1.vpsxb.net
- acl is_test2.vpsxb.net req_ssl_sni –i –n test2.vpsxb.net
- use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
- use_backend backend_49999_backend_test2.vpsxb.net if is_test2.vpsxb.net
- backend backend_49999_backend_test1.vpsxb.net
- mode tcp
- server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:443 cookie test1.vpsxb.net_server
- backend backend_49999_backend_test2.vpsxb.net
- mode tcp
- server backend_49999_backend_test2.vpsxb.net_server test2.vpsxb.net:443 cookie test2.vpsxb.net_server
tls与非tls混用:
监听本地49999端口,转发到test1.vpsxb.net的80端口和test2.vpsxb.net的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.vpsxb.net hdr_dom(host) –i –n test1.vpsxb.net
- acl is_test2.vpsxb.net req_ssl_sni –i –n test2.vpsxb.net
- use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
- use_backend backend_49999_backend_test2.vpsxb.net if is_test2.vpsxb.net
- backend backend_49999_backend_test1.vpsxb.net
- mode tcp
- server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:80 cookie test1.vpsxb.net_server
- backend backend_49999_backend_test2.vpsxb.net
- mode tcp
- server backend_49999_backend_test2.vpsxb.net_server test2.vpsxb.net:443 cookie test2.vpsxb.net_server
重启haproxy
systemctl restart haproxy.service
我们查看下haproxy状态,已经正常运行: