# **Использование Reverse Proxy**
###### tags: `Reverse Proxy`
***В данной работе будет показано использования обратного прокси-сервера SQUID на базе PfSense и использования обратного прокси-сервера на базе nginx для обеспечения безопасности. Для выполнения данной работы необходимо подготовить следующий стенд (в данной инструкции использовался EVE-NG).***
* Межсетевой экран (PfSense(SQUID))
* Свичи для имитации DMZ и LAN (cisco в примере)
* Машина с браузером в LAN зоне для теста и настройки pfsense (у меня Kali)
* 3 машины (желательно Debian, 2 для создания веб-сервисов(nginx), 1 reverse proxy на nginx)
**В результате у вас должен быть примерно следующий стенд. У вас должен быть настроен pfsense с squid с прошлого занятия. В зоне 192.168.100.0 достаточно одной машины с веб-браузером.**

Вы можете использовать такой стенд, но к сожалению, в ходе работы при установке Squid, мощности моей машины не хватило для обеспечния корректной работы, поэтому мне пришлось убрать IPS Snort с прошлой работы и работать без LAN зоны. Моменты, где будут различия по настройке буду описывать. У меня схема выглядит вот так.
*Итак, начнем!*
1. **Добавление необходимых машин, их обновление и первичная настройка**
Добавляем в зону DMZ 3 машины Debian, назвать можно как вам удобно, но рекомендуется как на скриншоте (ReverseProxy, DebWeb1, DebWeb2). Соответственно, это будет 2 веб-сервера на которые мы будем проксировать внешние соединения (сразу определимся с понятием reverse proxy - тип прокси-сервера, который ретранслирует запросы клиентов из внешней сети на один или несколько серверов, логически расположенных во внутренней сети.) и непосредственно один из примеров реализации reverse proxy (на nginx).
Заходим на каждый из этих трёх серверов и настраиваем сеть, как это сделать можно посмотреть во 2 пункте инструкции (https://hackmd.io/@25kh5VF_RE2wLelXKgDhjQ/HJ5P4S7Rd)
Но, необходимо настроить статические адреса, то есть конфиг сети для reverse proxy будет выглядить следующим образом.

Аналогично, настраиваем остальные адреса, но статические адреса я использовал следующие, для **web1 - 172.16.12.201** для **web2 - 172.16.12.202**.
После настройки сети, необходимо полность обновить сервер и установить nginx на всех серверах. Для этого, на каждом из серверов по очередно выполняем следующие команды:
> **apt update**
> **apt upgrade**
> **apt install nginx**
После того, как установка завершена необходимо на каждом настроить стандартную страницу nginx для этого выполняем на каждом сервер команду **nano /var/www/html/index.nginx-debian.html** и изменяем название и приветствие страницы на соответствующий сервер как на скриншоте.

То есть **Web1, Web2 и reverse proxy** соответственно.
**!!!Если у вас используется второй pfsense в локальной сети, то вам возможно понадобиться необходимо добавить маршрут на машинах с nginx до локальной сети через интерфейс pfsense смотрящий в dmz примерно команда такая - ip route add 192.168.100.0/24 via 172.16.12.254**
2. Настройка pfsense на reverse proxy.
Для того, чтобы наш pfsense мог выполнять функцию reverse proxy настроим его следующим образом. Заходим в pfsense и там переходим по пути **Service>Squid Reverse Proxy**, там переходим во вкладку **Web Servers**, где добавляем наши сервера (сервер reverse proxy nginx добавлять не нужно).

В итоге, у вас должно быть добавлено 2 сервера.

Следующим пунктом настроим привязку URI к нашим Web Server. Переходим в Mapping и добавляем наши маппинги.

Аналогично добавляем для второго сервера.
После этого, переходим по пути **System>Advanced>System Tunnable** и добавляем туда указанную строчку.

Далее, переходим в основные настройки Squid Reverse Proxy, необходимо выставить параметры как на скриншоте, чтобы повесить на reverse proxy на 80 порт извне.

Кроме данных параметров ничего изменять не нужно, ip указываем вашего pfsense. Сохраняем параметры.
Также, необходимо перейти по пути **Interfaces>WAN** и проверить не стоит галочки на блокировку в конце страницы, их нужно убрать если они стоят.

После проведенных настроек, ваши страницы nginx должны открываться с внешней машины нашей лаборатории, но предверительно необходимо указать на машине в файле hosts следующие команды:

IP адрес указываем внешний вашего pfsense.
После этого пробуем открывать соответствующую страницу в бразуере.


Все должно открываться.
3. Настройка reverse proxy на базе nginx.
Для того, чтобы работал reverse proxy на базе nginx нужно будет произвести небольшую настройку на нашем pfsense, а затем перенастроить конфиги нашего reverse proxy.
Итак, в pfsense переходим по следующему пути **System>Advanced** и там указать TCP Port отличный от 443, например 5443.

После этого, для входа в pfsense необходимо указывать порт 5443.
После применения данных настроек, переходим в проброс портов по пути **NAT>Port Forwarding** и пробрасываем с WAN интерфейса 80 и 443 порты, а также 22(для удобства настройки) до нашего nginx reverse proxy.

Должно получиться вот так.

Теперь, мы можем подключаться с хостовой машина по ssh к адресу wan pfsense и нас будет перенаправлять в nginx reverse proxy/
Подключаемся по ssh и выполняем настройку для этого выполняем следующие команды:
> **cd /etc/nginx/sites-available/**
> **nano web-1.conf**
Сюда вставляем конфигурацию для того, чтобы nginx перенаправляли запросы к нужному бекенду, у меня конфиг выглядит так:
> server {
> listen 80;
> server_name web-1.hackeru.tech;
> access_log /var/log/nginx/mirea.tech-access.log;
> error_log /var/log/nginx/mirea.tech-error.log;
> location / {
> proxy_pass http://172.16.12.201;
> proxy_set_header Host $host;
> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
> proxy_set_header X-Real-IP $remote_addr;
> }
> }
Аналогичные команды выполняем для **web-2.conf**, со следующим конфигом:
> server {
> listen 80;
> server_name web-2.hackeru.tech;
> access_log /var/log/nginx/mirea.tech-access.log;
> error_log /var/log/nginx/mirea.tech-error.log;
> location / {
> proxy_pass http://172.16.12.202;
> proxy_set_header Host $host;
> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
> proxy_set_header X-Real-IP $remote_addr;
> }
> }
Конфиг Default, можно оставить по-умолчанию.
Далее, для правильного порядка применения конфигов нужно их переименовать, выполняем следующие команды:
> **mv web-1.conf 001-web-1.conf**
> **mv web-2.conf 002-web-2.conf**
> **mv default.conf 999-default.conf**
Для того, чтобы конфиги применились нужно добавить данные конфиги в папку с помощью создания символической ссылки из папки, для этого выполним следующие команды:
> **cd ../sites-enabled/**
> Удаляем существующие ссылки
> **rm default**
> После этого создаем ссылки на все новые конфиги
> **ln -s /etc/nginx/sites-available/001-web-1.conf ./**
> **ln -s /etc/nginx/sites-available/002-web-2.conf ./**
> **ln -s /etc/nginx/sites-available/999-defaul.conf ./**
> Также, необходимо расскоментировать строчку **server_names_hash_bucket_size 64;** в файле **nginx.conf**
> Проверить конфиг, можно командой **nginx -t**
> Если все хорошо, перезапускаем службу **systemctl restart nginx**
Наш сервер настроен, теперь по определенному имени данные ресурсы должны быть доступны извне.


Кроме того, должен отрабатывать наш сервер default, к нему относяться любые имена из домена *.hackeru.tech, кроме тех, которые мы указали явно (web-1 и web-2). Проверим это (как видно из скриншота выше, где я правил hosts, у меня это имя web.hackeru.tech).

Как видно все работает.
3. Добавляние TLS к ресурсам.
Для обеспечения безопасного подключения к нашим ресурсам добавим сертификат для шифрования соединения. Для начала, нам нужно сгенерировать приватный ключ и сертификат, которые необходимы для настройки. Можно использовать различные способы для получения ключевой пары, мы воспользуемся pfsense. Заходим на него и переходим по пути **System>Certificate Manager>Certificates** и там добавляем новый сертификат. Нам нужен сертификат типа wild-card, то есть тот который подходит к перечню доменных имен по определенной маске, для этого указываем в поля следюущие данные:


Сертификат создан. нужно скачать их на нашу машину, скачиваем ключ и сертификат по следующим кнопочкам .
Нам нужно передать ключи и сертификат на наш nginx reverse proxy для этого воспользуемся командой:
**scp -r /root/Downloads/\* root@172.16.12.250:/root/**
После того как перекинули файлы перейдем на машину nginx reverse proxy. Для удобства создадим в папке nginx папку ssl и перекинем в нее скаченную ключевую пару, для этого выполним команды:
> **mkdir /etc/nginx/ssl**
> **mv /root/\* /etc/nginx/ssl**
Теперь же, нужно создать новые конфиги, которые будут использовать наши сертификаты для терминирования соединения. Аналогичным образом создаем конфиги для ssl.
> **cd /etc/nginx/sites-available/**
> **nano 001-web-1-ssl.conf**
> **nano 002-web-2-ssl.conf**
> **nano 999-default-ssl.conf**
Содержание данных конфигов соответственно:
web-1:https://drive.google.com/drive/folders/1Nij6cjDDwIDuGdZwfvp3J0IkgqLZe34U?usp=sharing
web-2:https://drive.google.com/drive/folders/1Nij6cjDDwIDuGdZwfvp3J0IkgqLZe34U?usp=sharing
Default:https://drive.google.com/drive/folders/1Nij6cjDDwIDuGdZwfvp3J0IkgqLZe34U?usp=sharing
**Обратите внимания на пути к ssl в конфигах у вас могут отличаться имя и путь, а также другие данные например ip адрес сервера.**
Далее, добавляем символьные ссылки на новые конфиги, предварительно удалив старые:
> **cd ../sites-enabled/**
> **rm \***
> **ln -s /etc/nginx/sites-available/001-web-1-ssl.conf ./**
> **ln -s /etc/nginx/sites-available/002-web-2-ssl.conf ./**
> **ln -s /etc/nginx/sites-available/999-defaul-ssl.conf ./**
> Проверяем конфиг командой **nginx -t**
> Скорее всего, он ругнется на то, что не сформирован сертификат diffi-helman для обмена симметричнымы ключами. Создадим его:
> openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
> После проверяем конфиг еще раз **nginx -t**
> Если все хорошо, перезапускаем службу **systemctl restart nginx**
После этого, наш сервер будет использовать для соединения ssl, проверим это. Просто заходим на наши сайты.

Как видим, все отлично отрабатывает.