Haproxy 实践运用

本文最后更新于 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的配置主要包含以下几个片段:

  1. frontend:该片段配置了hrproxy如何接收客户端的请求,如监听端口,SNI识别都将在这里配置。
  2. backend:backend用于定义后端服务器,将搭配fronted一起使用。
  3. listen:该部分合并了frontend和backend,允许前端和后端的配置语句同时出现,简化了配置文件。

下面是一个frontend的示例配置文件,同时监听 ipv4 和 ipv6 的 80,443 端口,并且拒接没有携带 sni 或 host 的访问(比如直接访问 https://iphttp://ip

shell
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:连接被重置。

Cloudflared 在 Ipv6-Only 环境下无法启动
Windows AutoHotKey:短按Caps切换输入法,长按大小写锁定