In part 2 of this series I installed nginx+ on both HA1 and HA2.
In this part, I configure nginx+ to support Microsoft Exchange 2010/13.
Other articles in the series:
- Installing and configuring keepalived
- Installing nginx+
- Configuring nginx+ for Microsoft Exchange
- Configuring Microsoft Exchange
- Tidying up
First, find your Exchange front-end SSL certificate and its serial number:
certutil -store my
Export the certificate (along with the private key) so it can be imported onto the nginx+ VMs:
certutil -exportpfx -p "password" -privatekey serialnumber mail.mdb-lab.com.pfx
Copy the PFX file to HA1 and HA2. Check the file came across okay:
openssl pkcs12 -info -in mail.mdb-lab.com.pfx
Import the certificate (you will be asked for the password you specified in the preceding step):
openssl pkcs12 -in mail.mdb-lab.com.pfx -nocerts -nodes -out mail.mdb-lab.com.key.enc openssl pkcs12 -in mail.mdb-lab.com.pfx -clcerts -nokeys -out mail.mdb-lab.com.cer openssl pkcs12 -in mail.mdb-lab.com.pfx -out cacerts.crt -nodes -nokeys -cacerts
The first command extracts the private key, the second the certificate, and the third the CA certificate(s). Next make the private key ready for nginx+
openssl rsa -in mail.mdb-lab.com.key.enc -out mail.mdb-lab.com.key
Check the private key is correct:
openssl rsa -in mail.mdb-lab.com.key -check
Move the certificate, private key and CA certificates to /etc/nginx/ssl/
rm -f mail.mdb-lab.com.key.enc rm -f mail.mdb-lab.com.pfx mkdir -p /etc/nginx/ssl mv -f mail.mdb-lab.com.* /etc/nginx/ssl/
Edit /etc/nginx/nginx.conf and make sure the following global settings are in place:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log info; pid /var/run/nginx.pid; events { worker_connections 1024; }
Add the following lines to the http block in /etc/nginx/nginx.conf, replacing values for your CAS servers where necessary:
http { log_format main '$remote_addr - $remote_user [$time_local] ' '"$request'' $status $body_bytes_sent ' '"$http_user_agent" "$upstream_addr"'; #set the log access_log /var/log/nginx/access.log main; keepalive_timeout 3h; proxy_read_timeout 3h; tcp_nodelay on; upstream exchange { zone exchange-general 64k; server 172.17.80.21:443; # Replace with IP address of a your CAS server 172.17.80.22:443; # Replace with IP address of a your CAS sticky learn create=$remote_addr lookup=$remote_addr zone=client_sessions:10m timeout=3h; } server { # redirect to HTTPS listen 80; location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; client_max_body_size 2G; ssl_certificate /etc/nginx/ssl/mail.mdb-lab.com.cer; ssl_certificate_key /etc/nginx/ssl/mail.mdb-lab.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; status_zone exchange-combined; # redirect from main page to /owa/ location = / { return 301 "/owa/"; } } location = /favicon.ico { empty_gif; access_log off; } location / { proxy_pass https://exchange; proxy_buffering off; proxy_http_version 1.1; proxy_request_buffering off; proxy_set_header Connection ''Keep-Alive''; } }
Add the stream block to /etc/nginx/nginx.conf also:
stream { upstream exchange-smtp { zone exchange-smtp 64k; server 172.17.80.31:25; # Replace with IP address of a your Hub Transport server 172.17.80.32:25; # Replace with IP address of a your Hub Transport } upstream exchange-smtp-ssl { zone exchange-smtp-ssl 64k; server 172.17.80.31:465; # Replace with IP address of a your Hub Transport server 172.17.80.32:465; # Replace with IP address of a your Hub Transport } upstream exchange-smtp-submission { zone exchange-smtp-submission 64k; server 172.17.80.31:587; # Replace with IP address of a your Hub Transport server 172.17.80.32:587; # Replace with IP address of a your Hub Transport } upstream exchange-imaps { zone exchange-imaps 64k; server 172.17.80.21:993; # Replace with IP address of a your CAS server 172.17.80.22:993; # Replace with IP address of a your CAS } server { listen 25; #SMTP status_zone exchange-smtp; proxy_pass exchange-smtp; } server { listen 465; #SMTP SSL status_zone exchange-smtp-ssl; proxy_pass exchange-smtp-ssl; } server { listen 587; #SMTP submission status_zone exchange-smtp-submission; proxy_pass exchange-smtp-submission; } }
Test the configuration before putting it live:
nginx -t
If everything is correct, it will yield the following:
Modify iptables to allow traffic through the host firewall:
for i in {25,80,135,139,443,465,587,60000,60001}; do iptables -I INPUT -p tcp --dport $i -m state --state NEW,ESTABLISHED -j ACCEPT; done
Save the new iptables rulebase:
service iptables save
To get nginx+ running we need to disable SELinux temporarily:
setenforce 0
Edit /etc/selinux/config:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
Change SELINUX=enforcing to SELINUX=permissive
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
Start the service:
service nginx start
Make sure the config is the same on both HA1 and HA2. In part 5 I’ll configure rsync to ensure the configs are kept in sync.
That’s it for configuring nginx+. In part 4 I’ll configure Exchange to support our nginx+ configuration.