---
# System prepended metadata

title: '**Использование Reverse Proxy**'
tags: [Reverse Proxy]

---

# **Использование 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 достаточно одной машины с веб-браузером.** 
![](https://i.imgur.com/bZQPITX.png)
Вы можете использовать такой стенд, но к сожалению, в ходе работы при установке 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 будет выглядить следующим образом.
![](https://i.imgur.com/8Qwbi6P.png)
Аналогично, настраиваем остальные адреса, но статические адреса я использовал следующие, для **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** и изменяем название и приветствие страницы на соответствующий сервер как на скриншоте.
![](https://i.imgur.com/RWmqYkS.png)
То есть **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 добавлять не нужно).
![](https://i.imgur.com/9DUAxje.png)
В итоге, у вас должно быть добавлено 2 сервера.
![](https://i.imgur.com/cKx3eHu.png)
Следующим пунктом настроим привязку URI к нашим Web Server. Переходим в Mapping и добавляем наши маппинги. 
![](https://i.imgur.com/0Yhwh0R.png)
Аналогично добавляем для второго сервера.
После этого, переходим по пути **System>Advanced>System Tunnable**  и добавляем туда указанную строчку.
![](https://i.imgur.com/gesP8O3.png)
Далее, переходим в основные настройки Squid Reverse Proxy, необходимо выставить параметры как на скриншоте, чтобы повесить на reverse proxy на 80 порт извне.
![](https://i.imgur.com/haj0HLK.png)
Кроме данных параметров ничего изменять не нужно, ip указываем вашего pfsense. Сохраняем параметры.
Также, необходимо перейти по пути **Interfaces>WAN** и проверить не стоит галочки на блокировку в конце страницы, их нужно убрать если они стоят.
![](https://i.imgur.com/VSduyTB.png)
После проведенных настроек, ваши страницы nginx должны открываться с внешней машины нашей лаборатории, но предверительно необходимо указать на машине в файле hosts следующие команды:
![](https://i.imgur.com/84gOAt1.png)
IP адрес указываем внешний вашего pfsense.
После этого пробуем открывать соответствующую страницу в бразуере.
![](https://i.imgur.com/moYZOUJ.png)
![](https://i.imgur.com/gmpZDCe.png)
Все должно открываться.
3. Настройка reverse proxy на базе nginx.
Для того, чтобы работал reverse proxy на базе nginx нужно будет произвести небольшую настройку на нашем pfsense, а затем перенастроить конфиги нашего reverse proxy.
Итак, в pfsense переходим по следующему пути **System>Advanced** и там указать TCP Port отличный от 443, например 5443.
![](https://i.imgur.com/WTAwYFD.png)
После этого, для входа в pfsense необходимо указывать порт 5443.
После применения данных настроек, переходим в проброс портов по пути **NAT>Port Forwarding** и пробрасываем с WAN интерфейса 80 и 443 порты, а также 22(для удобства настройки) до нашего nginx reverse proxy.
![](https://i.imgur.com/VjO1OWp.png)
Должно получиться вот так.
![](https://i.imgur.com/Bp7ZaHv.png)
Теперь, мы можем подключаться с хостовой машина по 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**

Наш сервер настроен, теперь по определенному имени данные ресурсы должны быть доступны извне.
![](https://i.imgur.com/d67ncZw.png)
![](https://i.imgur.com/PkbJCsA.png)
Кроме того, должен отрабатывать наш сервер default, к нему относяться любые имена из домена *.hackeru.tech, кроме тех, которые мы указали явно (web-1 и web-2). Проверим это (как видно из скриншота выше, где я правил hosts, у меня это имя web.hackeru.tech). 
![](https://i.imgur.com/uJmRsYQ.png)
Как видно все работает.
3. Добавляние TLS к ресурсам.
Для обеспечения безопасного подключения к нашим ресурсам добавим сертификат для шифрования соединения. Для начала, нам нужно сгенерировать приватный ключ и сертификат, которые необходимы для настройки. Можно использовать различные способы для получения ключевой пары, мы воспользуемся pfsense. Заходим на него и переходим по пути **System>Certificate Manager>Certificates** и там добавляем новый сертификат. Нам нужен сертификат типа wild-card, то есть тот который подходит к перечню доменных имен по определенной маске, для этого указываем в поля следюущие данные: 
![](https://i.imgur.com/x8zkD9H.png)
![](https://i.imgur.com/f6W08Gq.png)
Сертификат создан. нужно скачать их на нашу машину, скачиваем ключ и сертификат по следующим кнопочкам ![](https://i.imgur.com/v5uLjA2.png).
Нам нужно передать ключи и сертификат на наш 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, проверим это. Просто заходим на наши сайты.
![](https://i.imgur.com/0GFOWHg.png)
Как видим, все отлично отрабатывает.