Исходные данные:
corpmail.company.ru как имя Exchange-сервера во внутреннем и внешнем DNS.
Извне corpmail.company.ru (A) = 46.46.46.46
Внутри corpmail.company.ru (A) = 10.65.10.65
Адрес на внешнем интерфейсе pfSense = 46.46.46.46
Порт 443 не задействован извне другими службами.
У нас есть внешний сертификат, содержащий corpmail.company.ru в subject alternative name. Либо используем Lets Encrypt с пакетом acme.
У нас есть установленный пакет HAProxy.
Делаем backend:
Указываем имя ex01-back, говорим, что перенаправлять трафик на 10.65.10.65, на 443 порт и ставим галку Encrypt (SSL)
Connection timeout: 10000 мало. 1800000 соответствует 30 минутам.
Server timeout: 10000 мало. 1800000 соответствует 30 минутам.
Health check method: Basic
И включил статистику.
Делаем frontend:
Указываем имя ex01-front, адрес который будет слушать: либо выбираем интерфейс, либо выбираем виртуальный ip-адрес. Указываем порт 443 и SSL Offloading.
Количество соединений я указал 10000.
Тип http/https(offloading)
Далее составляем ACL, есть разные варинты, я делал по содержанию в URL.
Сначала делаем действия:
http-request deny с deny_status: 502 и пишем condition acl name = deny
use backend с use backend: ex01-back и пишем condition acl name = allow
Потом добавляем правила:
name = deny, expression: path contains: и value = ecp
name = deny, expression: path contains: и value = powershellname = allow, expression: path contains: и value = mapi
name = allow, expression: path contains: и value = owa
name = allow, expression: path contains: и value = Microsoft-Server-ActiveSync
name = allow, expression: path contains: и value = autodiscover
name = allow, expression: path contains: и value = ews
name = allow, expression: path contains: и value = OAB
name = allow, expression: path contains: и value = rpc
name = allow, expression: path contains: и value = public
Допустим, в Excange 2010 нет пути /powershell, но это будет актуально при переходе на более свежую версию.
Default backend оставляем пустым.
Оставляем use forwardfor option
use http-close option: http-keep-alive(default)
advanced passthru:
http-response set-header X-Xss-Protection 1;\ mode=block http-response set-header X-Content-Type-Options nosniff http-response set-header X-Robots-Tag noindex http-response set-header X-Frame-Options SAMEORIGIN http-response set-header Referrer-Policy same-origin
Certificate: выбираем наш внешний сертификат + add acl for certificate SAN
Advanced ssl options:
force-tlsv12 ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
и ставим галку allow clients without certificate to connect.
Backend:
Connetion timeout = 1800000
Server timeout = 1800000
Frontend:
Не забудьте добавить разрешающее правило firewall на внешнем интерфейсе вида external -> interface ip -> HTTPS или TCP 443.
Благодарности:
https://www.klehr.de/michael/exchange-2016-reverse-proxy-mit-pfsense-2-4-und-haproxy/
https://blog.devita.co/pfsense-to-proxy-traffic-for-websites-using-pfsense/
https://sysadms.de/2018/10/pfsense-haproxy-als-reverse-proxy/
http://ezoltan.blogspot.com/2014/10/highly-available-l7-load-balancing-for_24.html
0 коммент.:
Отправить комментарий