Menu Close

利用Haproxy进行端口转发并实现端口复用

介绍

之前我们看了如何利用nginx进行端口转发,其实更轻量的haproxy也许更合适。

原因很简单,纯粹,效率高,支持udp,简单。

介绍一下HAProxy:

简单的来说 HAProxy 就是一个负载均衡,TCP 和 HTTP 的代理程序,开源,高可用,C 写成。他原本的作用是将前端的大量流量分发到后端的服务器中,用于负载特别大的 WEB 网站的,这里被大材小用了。

使用 HAProxy 中转 SS 流量至少需要两台 VPS,国内一台,国外一台,SS 客户端直接连国内的 VPS,而通过国内的 VPS 转发流量到国外的 VPS 上。

安装

  1. Debian/Ubuntu
  2. sudo apt install y haproxy
  3. Centos
  4. sudo yum install y haproxy

配置文件位置:/etc/haproxy/haproxy.cfg,我们只需要修改配置文件即可。

转发

这里我们只示范转发到域名的方式,分为tls模式和非tls模式。

非tls模式

监听本地49999端口,转发到test1.vpsxb.net的80端口

  1. global
  2. ulimitn 51200
  3. log /dev/log local0
  4. log /dev/log local1 notice
  5. chroot /var/lib/haproxy
  6. pidfile /var/run/haproxy.pid
  7. user haproxy
  8. group haproxy
  9. daemon
  10. maxconn 20480
  11. maxconnrate 20480
  12. maxsslconn 20480
  13. spreadchecks 0
  14. defaults
  15. log global
  16. mode tcp
  17. option httpserverclose
  18. option dontlognull
  19. timeout connect 5000
  20. timeout client 120000
  21. timeout server 120000
  22.  
  23. frontend frontend_49999_frontend
  24. bind *:49999
  25. bind :::49999 v6only
  26. mode tcp
  27. tcprequest inspectdelay 2s
  28. tcprequest content accept if { req.ssl_hello_type 1 }
  29. acl is_test1.vpsxb.net hdr_dom(host) i n test1.vpsxb.net
  30. use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
  31. backend backend_49999_backend_test1.vpsxb.net
  32. mode tcp
  33. server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:80 cookie test1.vpsxb.net_server
  34.  

tls模式

监听本地49999端口,转发到test1.vpsxb.net的443端口

  1. global
  2. ulimitn 51200
  3. log /dev/log local0
  4. log /dev/log local1 notice
  5. chroot /var/lib/haproxy
  6. pidfile /var/run/haproxy.pid
  7. user haproxy
  8. group haproxy
  9. daemon
  10. maxconn 20480
  11. maxconnrate 20480
  12. maxsslconn 20480
  13. spreadchecks 0
  14. defaults
  15. log global
  16. mode tcp
  17. option httpserverclose
  18. option dontlognull
  19. timeout connect 5000
  20. timeout client 120000
  21. timeout server 120000
  22.  
  23. frontend frontend_49999_frontend
  24. bind *:49999
  25. bind :::49999 v6only
  26. mode tcp
  27. tcprequest inspectdelay 2s
  28. tcprequest content accept if { req.ssl_hello_type 1 }
  29. acl is_test1.vpsxb.net req_ssl_sni i n test1.vpsxb.net
  30. use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
  31. backend backend_49999_backend_test1.vpsxb.net
  32. mode tcp
  33. server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:443 cookie test1.vpsxb.net_server
  34.  

端口复用

非tls模式

监听本地49999端口,转发到test1.vpsxb.net和test2.vpsxb.net的80端口:

  1. global
  2. ulimitn 51200
  3. log /dev/log local0
  4. log /dev/log local1 notice
  5. chroot /var/lib/haproxy
  6. pidfile /var/run/haproxy.pid
  7. user haproxy
  8. group haproxy
  9. daemon
  10. maxconn 20480
  11. maxconnrate 20480
  12. maxsslconn 20480
  13. spreadchecks 0
  14. defaults
  15. log global
  16. mode tcp
  17. option httpserverclose
  18. option dontlognull
  19. timeout connect 5000
  20. timeout client 120000
  21. timeout server 120000
  22.  
  23. frontend frontend_49999_frontend
  24. bind *:49999
  25. bind :::49999 v6only
  26. mode tcp
  27. tcprequest inspectdelay 2s
  28. tcprequest content accept if { req.ssl_hello_type 1 }
  29. acl is_test1.vpsxb.net hdr_dom(host) i n test1.vpsxb.net
  30. acl is_test2.vpsxb.net hdr_dom(host) i n test2.vpsxb.net
  31. use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
  32. use_backend backend_49999_backend_test2.vpsxb.net if is_test2.vpsxb.net
  33. backend backend_49999_backend_test1.vpsxb.net
  34. mode tcp
  35. server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:80 cookie test1.vpsxb.net_server
  36. backend backend_49999_backend_test2.vpsxb.net
  37. mode tcp
  38. server backend_49999_backend_test2.vpsxb.net_server test2.vpsxb.net:80 cookie test2.vpsxb.net_server
  39.  

tls模式

监听本地49999端口,转发到test1.vpsxb.net和test2.vpsxb.net的443端口:

  1. global
  2. ulimitn 51200
  3. log /dev/log local0
  4. log /dev/log local1 notice
  5. chroot /var/lib/haproxy
  6. pidfile /var/run/haproxy.pid
  7. user haproxy
  8. group haproxy
  9. daemon
  10. maxconn 20480
  11. maxconnrate 20480
  12. maxsslconn 20480
  13. spreadchecks 0
  14. defaults
  15. log global
  16. mode tcp
  17. option httpserverclose
  18. option dontlognull
  19. timeout connect 5000
  20. timeout client 120000
  21. timeout server 120000
  22.  
  23. frontend frontend_49999_frontend
  24. bind *:49999
  25. bind :::49999 v6only
  26. mode tcp
  27. tcprequest inspectdelay 2s
  28. tcprequest content accept if { req.ssl_hello_type 1 }
  29. acl is_test1.vpsxb.net req_ssl_sni i n test1.vpsxb.net
  30. acl is_test2.vpsxb.net req_ssl_sni i n test2.vpsxb.net
  31. use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
  32. use_backend backend_49999_backend_test2.vpsxb.net if is_test2.vpsxb.net
  33. backend backend_49999_backend_test1.vpsxb.net
  34. mode tcp
  35. server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:443 cookie test1.vpsxb.net_server
  36. backend backend_49999_backend_test2.vpsxb.net
  37. mode tcp
  38. server backend_49999_backend_test2.vpsxb.net_server test2.vpsxb.net:443 cookie test2.vpsxb.net_server
  39.  

tls与非tls混用:

监听本地49999端口,转发到test1.vpsxb.net的80端口和test2.vpsxb.net的443端口:

  1. global
  2. ulimitn 51200
  3. log /dev/log local0
  4. log /dev/log local1 notice
  5. chroot /var/lib/haproxy
  6. pidfile /var/run/haproxy.pid
  7. user haproxy
  8. group haproxy
  9. daemon
  10. maxconn 20480
  11. maxconnrate 20480
  12. maxsslconn 20480
  13. spreadchecks 0
  14. defaults
  15. log global
  16. mode tcp
  17. option httpserverclose
  18. option dontlognull
  19. timeout connect 5000
  20. timeout client 120000
  21. timeout server 120000
  22.  
  23. frontend frontend_49999_frontend
  24. bind *:49999
  25. bind :::49999 v6only
  26. mode tcp
  27. tcprequest inspectdelay 2s
  28. tcprequest content accept if { req.ssl_hello_type 1 }
  29. acl is_test1.vpsxb.net hdr_dom(host) i n test1.vpsxb.net
  30. acl is_test2.vpsxb.net req_ssl_sni i n test2.vpsxb.net
  31. use_backend backend_49999_backend_test1.vpsxb.net if is_test1.vpsxb.net
  32. use_backend backend_49999_backend_test2.vpsxb.net if is_test2.vpsxb.net
  33. backend backend_49999_backend_test1.vpsxb.net
  34. mode tcp
  35. server backend_49999_backend_test1.vpsxb.net_server test1.vpsxb.net:80 cookie test1.vpsxb.net_server
  36. backend backend_49999_backend_test2.vpsxb.net
  37. mode tcp
  38. server backend_49999_backend_test2.vpsxb.net_server test2.vpsxb.net:443 cookie test2.vpsxb.net_server
  39.  

重启haproxy

systemctl restart haproxy.service

我们查看下haproxy状态,已经正常运行:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注