在 Ubuntu 16.04 服务器上重定向以在互联网上显示 OWA 时,我遇到了 HAPROXY 问题。我有一个域,并在 Windows Server 2012 R2 上安装了 Exchange Server 2013。我需要在 443 和 80 端口上使用带有 TCP 的第二个前端来连接 OWA。
问题是 OWA 有时会出现,刷新页面后会给出错误或我的另一个具有不同 CA 的站点,这是因为旧的前端 haproxy-in(模式 http)。我已将 LetsEncrypt 分配给所有站点的端口 443。
请问,我需要一个解决方案来打开 OWA 和其他网站。
这是我的第一个前端的 haproxy 配置文件:
frontend haproxy_in
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/mdl.ief.tishreen.edu.sy.pem crt /etc/haproxy/certs/mail.ief.tishreen.edu.sy.pem crt /etc/haproxy/certs/lib.ief.tishreen.edu.sy.pem crt /etc/haproxy/certs/ief.tishreen.edu.sy.pem crt /etc/haproxy/certs/www.ief.tishreen.edu.sy.pem crt /etc/haproxy/certs/educloud.ief.tishreen.edu.sy.pem crt /etc/haproxy/certs/vpn.ief.tishreen.edu.sy.pem
mode http
# Define Path For LetsEncrypt.........................
acl is_letsencrypt path_beg -i /.well-known/acme-challenge/
use_backend letsencrypt if is_letsencrypt
# Define hosts........................................
acl is_moodle hdr_dom(host) -i mdl.ief.tishreen.edu.sy
acl is_lib hdr_dom(host) -i lib.ief.tishreen.edu.sy
acl is_mail hdr_dom(host) -i mail.ief.tishreen.edu.sy
acl is_vpn hdr_dom(host) -i vpn.ief.tishreen.edu.sy
acl is_www hdr_dom(host) -i www.ief.tishreen.edu.sy
# Direct hosts to backend..............................
use_backend moodle if is_moodle
use_backend lib if is_lib
use_backend vpn if is_vpn
use_backend www if is_www
default_backend base
# Redirect port 80 t0 443 except lets encrypt............
redirect scheme https code 301 if !{ ssl_fc } !is_letsencrypt
### exchange owa frontend####
frontend exchange-server
bind *:80
bind *:443
mode tcp
acl is_mail hdr_dom(host) -i mail.ief.tishreen.edu.sy
use_backend mail if is_mail
default_backend base
backend mail
balance roundrobin
mode tcp
server vm3 172.17.16.22:443 check
######################
# #
# Backends #
# #
######################
backend letsencrypt
server letsencrypt 127.0.0.1:8888
backend moodle
balance roundrobin
mode http
server vm1 172.17.16.20:80 check
backend lib
balance roundrobin
mode http
server vm2 172.17.16.18:80/akasia check
backend vpn
balance roundrobin
mode http
server vm4 172.17.16.35:1194 check
backend www
balance roundrobin
mode http
server vm5 172.17.16.25:80 check
backend base
balance roundrobin
mode http
server vmtest 172.17.16.25:80 check
###############################
答案1
当 HAproxy 本身充当 SSL 终止器时,使用 tcp 作为 https 连接的后端模式将不起作用。
根据您的设置,有两种方法可以使您的配置正常工作:
1:编辑您的 OWA 配置以允许 http 连接,然后使用 http 作为后端模式,将 SSL 作业仅留给 HAProxy。
2:编辑你的 HAProxy 配置以在后端使用 https 并且不使用 ssl 验证,如下所示:
backend mail
balance roundrobin
mode http
server vm3 172.17.16.22:443 ssl verify none
答案2
尝试仅使用一个前端的此配置(我使用一个公共 IP 和两个带有 SSL 的内部服务器)两个服务器都可以通过端口 443 和 80 访问(需要 80 来更新 letsencrypt 证书)。服务器位于不同的子网中,没有问题。我在 haproxy 站点上没有任何证书,内部和公共 DNS 中的名称相同。
frontend ft_ssl_vip
mode tcp
bind *:443
bind *:80
tcp-request inspect-delay 5s
acl sslv3 req.ssl_ver 3
tcp-request content reject if sslv3
tcp-request content accept if { req_ssl_hello_type 1 }
default_backend bk_ssl_default
backend bk_ssl_default
mode tcp
# Using SNI to take routing decision
acl exchange1 req_ssl_sni -i email.tld.com
acl exchange2 req_ssl_sni -i autodiscover.tld.com
acl nextcloud1 req_ssl_sni -i cloud.tld.com
use-server server1 if exchange1
use-server server1 if exchange2
use-server server2 if nextcloud1
stick-table type binary len 32 size 30k expire 30m
acl clienthello req_ssl_hello_type 1
acl serverhello rep_ssl_hello_type 2
# use tcp content accepts to detects ssl client and server hello.
tcp-request inspect-delay 5s
tcp-request content accept if clienthello
# no timeout on response inspect delay by default.
tcp-response content accept if serverhello
stick on payload_lv(43,1) if clienthello
# Learn on response if server hello.
stick store-response payload_lv(43,1) if serverhello
option ssl-hello-chk
server server1 192.168.xx1.xx1 check
server server2 192.168.xx2.xx2 check