понедельник, 23 ноября 2015 г.

Reverse Proxy для Lync 2013 / SfB на Nginx 1.8


Ранее я уже писал, как можно создать Lync Reverse Proxy с помощью Apache. Сегодня мы рассмотрим более интересный и, вероятно, правильный вариант. Нам для этого потребуется сервер или ВМ с ОС Linux Centos 6.7 (можно другой дистрибутив, но настройки могут незначительно отличаться) с двумя сетевыми интерфейсами - внешним и внутренним.

Итак, приступим.



1. Добавим репозирорий Nginx:

# yum install http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

2. Выполним установку Nginx:

# yum install nginx

3. Удалим дефолтные конфиги:

# rm -f cd /etc/nginx/conf.d/*

4. Создадим новый конфиг:

# vim  /etc/nginx/conf.d/lync.conf

### Задаем внутренние имена для серверов 
# Lyncdiscover 
upstream lyncdiscover_backend {
        server lyncdiscoverinternal.lin.local:8080;
keepalive 180;
}
# Lync Frontend Pool
upstream lync_backend {
server lync-frontend.lin.local:4443;
keepalive 180;
}
# Office Web Apps
upstream wac_backend {
        server WAC.lin.local:443;
        keepalive 180;
}

# Lync Frontend Pool Proxy
server {
        # Внешний IP и порт, которые слушаем
listen 104.40.211.35:443;  
        # Имена, которые слушаем
server_name meet.lin.by dialin.lin.by lync.lin.by;
ssl on;
       # Запрещаем использование устаревших протоколов
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_session_cache shared:SSL:10m;
ssl_prefer_server_ciphers on;
        # Указываем путь к сертификату и ключу
ssl_certificate /etc/httpd/ssl/cert.crt;
ssl_certificate_key /etc/httpd/ssl/private.key;
        # Лог
error_log /var/log/lync_revprx_error_log warn;
        # Рутовая папка сайта (надо создать)
root /var/www/webext.atservers.net;
# Настройки проксирования
location / {
# Версия прокси 1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
  proxy_read_timeout 3600;
# Настройки буферов
proxy_buffering on;
proxy_buffers 128 4k;
# Настройка заголовков
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Проксирование
proxy_pass https://lync_backend;
proxy_redirect default;
}
}

# Lyncdiscover Proxy
server {
    listen 104.40.211.35:80;
    # Проксировать все подключения для 80 порта
    server_name  "";
    location / {
        root /var/www/webext.atservers.net;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://lyncdiscover_backend;
    }
}

# Office Web Apps Proxy
server {
        listen 104.40.211.35:443;
        server_name webapp.lin.by;
        ssl on;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
        ssl_session_cache shared:SSL:10m;
        ssl_prefer_server_ciphers on;
        ssl_certificate /etc/httpd/ssl/cert.crt;
        ssl_certificate_key /etc/httpd/ssl/private.key;
        error_log /var/log/lync_revprx_error_log warn;
        root /var/www/webext.atservers.net;
        location / {
                proxy_http_version      1.1;
                proxy_set_header        Connection "";
                proxy_buffering         on;
                proxy_buffers           128 4k;
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto $scheme;
                proxy_pass              https://wac_backend;
                proxy_redirect          default;
        }
}

Чтобы завершить редактирование в vim необходимо нажать ESC, затем :wq

5. Создадим корневую папку для сайта:

# mkdir /var/www/webext.atservers.net

6. Положить сертификат и ключ (например, с помощью cpssh или ftp):
/etc/httpd/ssl/cert.crt
/etc/httpd/ssl/private.key

Можно так же создать файлы с помощью vim и через буфер обмена добавить в них данные их сертификата и ключа, как мы создавали конфиг в п.4

7. Установить права на файл ключа:

# chmod 600 /etc/httpd/ssl/private.key

8. Добавить в файл /etc/hosts записи:

# vim /etc/hosts

10.1.0.100 lyncdiscoverinternal.lin.local lync-frontend.lin.local
10.1.0.101 wac.lin.local

10.1.0.100 и 10.1.0.101 - локальные IP серверов Frontend и WAC

9. Перезапускаем nginx:

# /etc/init.d/nginx restart

10. Проверяем подключение. Если все настроено корректно, Lync клиент подключится.

Вот и все, данные настройки можно выполнить минут за 15. Если что-то не получается, напишите вопрос в комментариях - попробую помочь.


6 комментариев:

  1. Все работает. Жаль только у меня купленный и установленный Lync в организации так и не решились ввести в эксплуатацию по полной. стоит себе и мы им пользуемся для нужд техотдела когда надо что то показать или поремонтировать на производствах ))

    ОтветитьУдалить
  2. Артем, спасибо за статью.
    Не удавалось настроить reverse proxy - ios упорно не дружил.
    Через nginx взлетел моментально. Дополнительно пришлось отключить SELinux:
    vim /etc/selinux/config

    SELINUX=disabled

    ОтветитьУдалить
  3. Применил Вашу конфигурацию, для своей организации, nginx поднялся без проблем, и все вроде бы работает, но при попытке проти тест на lync connectivity analyzer выдается ошибка
    The credentials were not authorized by the server. Please verify your login credentials and try again.
    Не знаю куда копать и что делать, подскажите пожалуйста.

    ОтветитьУдалить
    Ответы
    1. А вы отключили selinux (как в посте выше)? И после этого надо выполнить рестарт машины.

      Удалить
    2. У меня не получилось с nginx и конфигурацией выше.
      Авторизация на WebTicket не работает - 401я ошибка. Пришлось сделать на haproxy - тогда все заработало.
      В логах nginx при попытке входа через мобильное приложение:
      [18/Nov/2020:12:34:23 +0300] "GET /?sipuri=sip:user1@company.com HTTP/1.1" 200 1090 "-" "AndroidLync"

      [18/Nov/2020:12:34:24 +0300] "GET /Autodiscover/AutodiscoverService.svc/root/user?originalDomain=company.com HTTP/1.1" 401 1293 "-" "AndroidLync"

      [18/Nov/2020:12:34:25 +0300] "POST /WebTicket/WebTicketService.svc/mex HTTP/1.1" 200 19461 "-" "AndroidLync"

      [18/Nov/2020:12:34:26 +0300] "POST /WebTicket/WebTicketService.svc HTTP/1.1" 401 1293 "-" "AndroidLync"

      [18/Nov/2020:12:34:26 +0300] "POST /WebTicket/WebTicketService.svc HTTP/1.1" 401 1293 "-" "AndroidLync"

      [18/Nov/2020:12:34:26 +0300] "POST /WebTicket/WebTicketService.svc HTTP/1.1" 401 1293 "-" "AndroidLync"

      Возможно, с приложением что-то не так.

      Удалить
    3. Чтобы решить такую проблему использовал модуль - https://github.com/gabihodoroaga/nginx-ntlm-module

      Удалить