我正在使用带有 SSTP 的 MikroTik 路由器,并且我有一个运行带有 HTTP 和 HTTPS 的 httpd 的 Fedora 服务器,但我只有来自我的 ISP 的一个 IPv4 地址。
我目前有 SSTP 在端口 444 上运行,但我需要将其移动到端口 443 以绕过防火长城(最近中国政府开始阻止 PPTP,所以我想完全隐藏在端口 443 上)。
我找到了关于 HAproxy 的 SNI 负载平衡的文档,但我还没有让它工作,例如 https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/
这是我的设置(编辑于 2018 年 7 月 5 日 22:20 CET)
frontend main 192.168.0.3:443 ssl ca-cert /etc/pki/tls/certs/sstp.crt
use_backend sstp if { ssl_fc_sni sstp.mydoamin.com }
use_backend websites if { ssl_fc_sni www.mydomain.com }
default_backend websites
backend websites
mode tcp
balance roundrobin
server www 127.0.0.1:443 check
backend sstp
mode tcp
balance roundrobin
server router 192.168.0.1:444 ca-cert /etc/pki/tls/certs/sstp.crt
编辑后端以包含 ca-cert 后,当我将 default_backend 更改为 sstp 时,我可以获得 sstp 连接
haproxy -d 没有给我太多调试信息。我对使 SNI 工作的语法不够熟悉,但我正在取得进展...
刚刚尝试了示例中的确切语法,但还是不起作用
frontend main 192.168.0.3:443 ssl ca-cert /etc/pki/tls/certs/sstp.crt
use_backend sstp if { ssl_fc_sni sstp.example.com }
acl application_1 req_ssl_sni -i sstp.example.com
use_backend sstp if application_1
default_backend websites
答案1
终于破解了。这是解决方案:
frontend main 192.168.0.3:443 ssl
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend websites if { req_ssl_sni -m found }
default_backend sstp
这里唯一的问题是使用公共 IP 不起作用。
于 2018 年 7 月 6 日 13:00 CET 编辑,将 req_ssl_sni 从匹配我的域名更改为仅检查是否存在 SNI
逻辑(又名访问控制列表)的文档可在此处找到 https://www.haproxy.com/de/documentation/hapee/1-7r1/traffic-management/acls/