# **Использование 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) Как видим, все отлично отрабатывает.