本文最后更新于 9 个月前,文中所描述的信息可能已发生改变。
Haproxy(High Availability Proxy)是一种开源软件,广泛用于负载均衡和高可用性服务。相比于 Nginx,Haproxy在作为转发用途的时候更单纯,并不需要额外配置其他的代理参数。在反向代理方面,Haproxy 支持 TCP 协议的转发,在网络第四层上直接将流量转发至源站,从而实现 SSL Passthrough 的效果。这使得中转服务器并不需要部署相关域名的 SSL 证书即可完成转发。
我之前一直在中转机上使用的 Nginx,缺点是每一个需要加速的域名都需要额外配置 SSL/TLS 证书,非常繁琐。这时 Haproxy 完美解决了这个问题,基于 TCP 协议的转发可以在不解密 SSL 证书的情况下直接转发流量至 Cloudflare 节点,并通过 SNI 验证防止被别人滥用。
由于我在 Cloudflare 中配置了 严格 的加密策略,所以源服务器上配置了 Cloudflare 的自签证书,这导致无法使用 Haproxy 直接将流量转发到源站服务器。所以如果源站服务器已经配置好了 SSL/TLS 证书,直接将后端填写为源站即可,可以减少被滥用的风险。
安装Haproxy非常简单:apt update && apt instal haproxy -y
。配置文件路径位于/etc/haproxy/haproxy.conf
,Haproxy的配置主要包含以下几个片段:
- frontend:该片段配置了hrproxy如何接收客户端的请求,如监听端口,SNI识别都将在这里配置。
- backend:backend用于定义后端服务器,将搭配fronted一起使用。
- listen:该部分合并了frontend和backend,允许前端和后端的配置语句同时出现,简化了配置文件。
下面是一个frontend的示例配置文件,同时监听 ipv4 和 ipv6 的 80,443 端口,并且拒接没有携带 sni 或 host 的访问(比如直接访问 https://ip 或http://ip)
frontend http_frontend
bind *:80
mode http
# acl (Access Control List) 允许定义一些基准条件,用于筛选流量
# -i 指忽略大小写
# -m reg 可以使用正则匹配
# is_www.baidu.com 为该acl的名称
# 每个acl会根据流量返回true or false
acl check_host hdr(Host) -m reg .*\.(baidu.com|google.com)
# 如果Host头部不匹配,则拒绝请求
http-request reject unless check_host
# 重定向到https协议
http-request redirect scheme https code 301 if check_host
frontend https_frontend
bind *:443
mode tcp
# 如果没有sni,则拒绝
tcp-request content reject unless { req_ssl_sni -m found }
acl is_www.baidu.com req_ssl_sni -i www.baidu.com
acl is_www.google.com req_ssl_sni -i www.google.com
tcp-request content reject unless is_www.baidu.com or is_www.google.com
# 设置默认后端为 default_https
default_backend default_https
当运行在 http 模式时,haproxy 可以识别请求的 header 信息并进行更精准的流量控制。
backend示例配置:
backend default_https
server cloudflare1 1.1.1.1:443 check
建议在中转机上 ping www.cloudflare.com
以找到最合适转发的节点。
尝试直接在浏览器中访问 IP:连接被重置。