Перейти до змісту

Проксі-сервер Pound

Pound відсутній в EPEL-9

На момент написання цієї статті на Rocky Linux 9.0 Pound неможливо встановити зі сховища EPEL. Хоча існують джерела пакетів SRPM, ми не можемо перевірити цілісність цих джерел. З цієї причини ми не рекомендуємо зараз встановлювати проксі-сервер Pound на Rocky Linux 9.0. Це може змінитися, якщо EPEL знову підніме Pound. Використовуйте цю процедуру спеціально для версій Rocky Linux 8.x.

Вступ

Pound — це незалежний від веб-сервера зворотний проксі та балансувальник навантаження, який дуже простий у налаштуванні та керуванні. Він не використовує веб-службу, але прослуховує порти веб-служби (http, https).

Тепер існує багато параметрів проксі-сервера, деякі з яких згадуються на цих сторінках документації. Існує документ про використання HAProxy тут, а в інших документах є посилання на використання Nginx для зворотного проксі.

Сервіси балансування навантаження дуже корисні для завантаженого середовища веб-сервера. Існує багато проксі-серверів, у тому числі згаданий раніше HAProxy, які використовують для багатьох типів послуг.

У випадку Pound його можна використовувати лише для веб-сервісів, але він хороший у тому, що він робить.

Передумови та припущення

Нижче наведено мінімальні вимоги для використання цієї процедури:

  • Бажання збалансувати навантаження між кількома веб-сайтами або готовність вивчити новий інструмент, щоб робити те саме.
  • Можливість запускати команди від імені користувача root або використовувати sudo для підвищення привілеїв.
  • Знайомство з редактором командного рядка. Автор використовує тут vi або vim, але замініть у вашому улюбленому редакторі.
  • Комфорт зі зміною портів прослуховування на кількох типах веб-серверів.
  • Я припускаю попередню інсталяцію серверів Nginx і Apache.
  • Я припускаю, що ви використовуєте сервери або контейнери Rocky Linux для всього тут.
  • Хоча в цьому документі є всілякі твердження щодо https, цей посібник стосується лише служби http. Щоб правильно виконувати https, ви повинні налаштувати ваш pound-сервер за допомогою справжнього сертифіката від справжнього центру сертифікації.

Підказка

Якщо у вас не встановлено жоден із цих серверів, ви можете зробити це в контейнерному середовищі (LXD або Docker) або на голому металі та запустити їх у роботу. Для цієї процедури ви повинні встановити їх разом із відповідними пакетами, увімкнути та запустити служби. Ми не будемо жодним чином їх суттєво змінювати.

dnf -y install nginx && systemctl enable --now nginx

або

dnf -y install httpd && systemctl enable --now httpd

Умовності

Для цієї процедури ми будемо використовувати два веб-сервери (відомі як внутрішні сервери), на одному з яких працює Nginx (192.168.1.111), а на другому — Apache (192.168.1.108).

Наш сервер Pound (192.168.1.103) є шлюзом.

Ви перемкнете свої порти прослуховування на внутрішніх серверах на 8080 для сервера Nginx і 8081 для сервера Apache. (Все буде відображено нижче.)

Примітка

Не забудьте змінити пов’язані IP-адреси на будь-які, які вони є у вашому середовищі, і замінити їх там, де це можливо, протягом цієї процедури.

Встановлення сервера Pound

Щоб інсталювати Pound, вам потрібно спочатку встановити EPEL (додаткові пакети для Enterprise Linux) і запустити оновлення:

dnf -y install epel-release && dnf -y update

Потім встановіть Pound. (Так, це велика "P"):

dnf -y install Pound

Налаштування Pound

Тепер, коли пакунки встановлено, нам потрібно налаштувати Pound. Автор використовує vi, щоб оновити це, але якщо ви віддаєте перевагу nano або щось інше, замініть це в:

vi /etc/pound.cfg

Файл містить інформацію за замовчуванням, що дозволяє легко побачити більшість стандартних компонентів Pound:

User "pound"
Group "pound"
Control "/var/lib/pound/pound.cfg"

ListenHTTP
    Address 0.0.0.0
    Port 80
End

ListenHTTPS
    Address 0.0.0.0
    Port    443
    Cert    "/etc/pki/tls/certs/pound.pem"
End

Service
    BackEnd
        Address 127.0.0.1
        Port    8000
    End

    BackEnd
        Address 127.0.0.1
        Port    8001
    End
End

Придивляючись ближче

  • «User» і «Group» - заповнюються під час інсталяції
  • Файл "Control" ніде не використовується.
  • Розділ «ListenHTTP» представляє службу http (порт 80) і «Address», який проксі-сервер слухатиме. Вам необхідно змінити це на фактичну IP-адресу нашого сервера Pound.
  • Розділ «ListenHTTPS» представляє службу https (порт 443) і «Address», який проксі-сервер слухатиме. Необхідно змінити це на IP-адресу сервера Pound.
  • Опція «Cert» — це самопідписаний сертифікат, наданий процесом встановлення Pound. Ви хочете замінити це у робочому середовищі справжнім сертифікатом за допомогою однієї з цих процедур: Генерація ключів SSL або ключі SSL із Let's Encrypt.
  • Розділ «Service» налаштовує «BackEnd» сервери з їх портами прослуховування. Ви можете мати скільки завгодно "BackEnd" серверів.

Зміна конфігурації

  • змініть IP-адресу під кожною опцією прослуховування на IP-адресу нашого сервера Pound, 192.168.1.103
  • змініть IP-адреси та порти в розділах «BackEnd» відповідно до нашої конфігурації, знайденої в «Умовних поняттях» вище (IP-адреси та порти)

Коли ви закінчите змінювати конфігурацію, ви повинні мати змінений файл, який виглядає приблизно так:

User "pound"
Group "pound"
Control "/var/lib/pound/pound.cfg"

ListenHTTP
    Address 192.168.1.103
    Port 80
End

ListenHTTPS
    Address 192.168.1.103
    Port    443
    Cert    "/etc/pki/tls/certs/pound.pem"
End

Service
    BackEnd
        Address 192.168.1.111
        Port    8080
    End

    BackEnd
        Address 192.168.1.108
        Port    8081
    End
End

Налаштування Nginx для прослуховування на 8080

Оскільки ви встановили порт прослуховування для Nginx у нашій конфігурації Pound на 8080, вам також потрібно внести цю зміну на запущеному сервері Nginx. Це можна зробити, змінивши nginx.conf:

vi /etc/nginx/nginx.conf

Ви просто хочете змінити рядок «listen» на новий номер порту:

listen       8080 default_server;

Збережіть зміни та перезапустіть службу nginx:

systemctl restart nginx

Налаштування Apache для прослуховування 8081

Оскільки ми встановили порт прослуховування для Apache у нашій конфігурації Pound на 8081, нам також потрібно зробити цю зміну на нашому запущеному сервері Apache. Для цього необхідно змінити httpd.conf:

vi /etc/httpd/conf/httpd.conf

Ви хочете змінити рядок «Listen» на новий номер порту:

Listen 8081

Збережіть зміни та перезапустіть службу httpd:

systemctl restart httpd

Перевірка та запуск

Після того, як ваші веб-служби запущені та прослуховують правильні порти на кожному з наших серверів, наступним кроком буде ввімкнення служби pound на сервері Pound:

systemctl enable --now pound

Важливо

Використання Nginx і Apache, як ми робимо тут для демонстрації, означатиме, що сервер Nginx майже завжди відповідатиме першим. З цієї причини для ефективного тестування вам потрібно буде призначити низький пріоритет серверу Nginx, щоб ви могли бачити обидва екрани. Це багато говорить про швидкість Nginx над Apache. Щоб змінити пріоритет для сервера Nginx, вам просто потрібно додати пріоритет (1-9, де 9 є найнижчим пріоритетом) у розділі «BackEnd» для сервера Nginx таким чином:

BackEnd
    Address 192.168.1.111
    Port    8080
    Priority 9
End

Коли ви відкриваєте IP проксі-сервера у веб-браузері, ви побачите один із цих двох екранів:

Pound Nginx

Або

Pound Apache

Використання "Emergency"

Єдине, що вам може знадобитися під час використання балансувальника навантаження, такого як Pound, це відключити виробничі сервери для обслуговування або мати запасний «BackEnd» для повного збою. Це робиться за допомогою оголошення "Emergency" у файлі pound.conf. На одну послугу можна мати лише одну «Надзвичайну» декларацію. У нашому випадку це з’явиться в кінці розділу «Service» у файлі конфігурації:

...
Service
    BackEnd
        Address 192.168.1.117
        Port    8080
    Priority 9
    End

    BackEnd
        Address 192.168.1.108
        Port    8081
    End
    Emergency
       Address 192.168.1.104
       Port 8000
   End
End

Цей сервер може відображати лише повідомлення "Down For Maintenance".

Міркування безпеки

Більшість документів, що стосуються проксі-серверів балансування навантаження, не розглядають питання безпеки. Наприклад, якщо це загальнодоступний веб-сервер, вам потрібно буде мати служби http і https, відкриті для світу на проксі-сервері балансування навантаження. Але як щодо «BackEnd» серверів?

Їм потрібен лише доступ через їхні порти з сервера Pound, але оскільки сервер Pound переспрямовує на 8080 або 8081 на серверах BackEnd, і оскільки сервери BackEnd мають http прослуховування цих наступних портів, ви можете використовувати назви служб для команд брандмауера на цих серверах BackEnd.

У цьому розділі буде розглянуто ці проблеми та команди firewalld, необхідні для блокування всього.

Важливо

Припускається, що ви маєте прямий доступ до відповідних серверів і не є віддаленим. Якщо ви віддалені, будьте вкрай обережні, видаляючи служби із зони firewalld!

Ви можете випадково заблокувати себе на своєму сервері.

Брандмауер - сервер Pound

Для сервера Pound, як зазначено вище, ми хочемо дозволити http і https зі світу. Було б найкраще розглянути, чи потрібно дозволити ssh зі світу. Якщо ви локально на сервері, це, мабуть, НІ. Тут автор припускає, що сервер доступний через вашу локальну мережу і що ви маєте прямий доступ до нього, тому ви заблокуєте ssh для своїх IP-адрес локальної мережі.

Щоб виконати це, ви будете використовувати вбудований брандмауер для Rocky Linux, firewalld і структуру команд firewall-cmd. Ви також будете використовувати дві вбудовані зони, «загальнодоступну» та «довірену», щоб не було складнощів.

Почнемо з додавання наших вихідних IP-адрес до «trusted» зони. Ось наша локальна мережа (у нашому прикладі: 192.168.1.0/24):

firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent

Потім додайте службу ssh до зони:

firewall-cmd --zone=trusted --add-service=ssh --permanent

Перезавантажте брандмауер за допомогою:

firewall-cmd --reload

Перелічіть зону, щоб ви могли бачити все за допомогою firewall-cmd --zone=trusted --list-all, що дасть вам щось на зразок цього:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.0/24
  services: ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Далі вам необхідно внести зміни в «публічну» зону, у якій за замовчуванням увімкнено службу ssh. Це потрібно обережно видалити (знову ж таки, ми припускаємо, що ви НЕ тут віддалені від сервера!) за допомогою наступного:

firewall-cmd --zone=public --remove-service=ssh --permanent
Вам також потрібно додати служби http і https:

firewall-cmd --zone=public --add-service=http --add-service=https --permanent

Далі перезавантажте брандмауер, перш ніж ви побачите зміни:

firewall-cmd --reload

Перерахуйте загальнодоступну зону за допомогою firewall-cmd --zone=public --list-all, яка покаже вам щось на зразок цього:

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client http https
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Це єдині зміни, які нам потрібно внести в балансувальник навантаження сервера pound у нашому лабораторному середовищі.

Брандмауер - внутрішні сервери

Для серверів "BackEnd" нам не потрібно дозволяти доступ із світу для будь-чого. Вам потрібно буде дозволити ssh з IP-адрес локальної мережі та http і https з нашого балансувальника навантаження Pound.

Це майже все.

Знову ж таки, ви збираєтеся додати службу ssh до вашої «довіреної» зони з тими самими командами, що використовуються для вашого сервера pound. Потім додайте зону під назвою «баланс», яку ви використовуватимете для решти http і https, і встановіть IP-адресу джерела на IP-адресу балансувальника навантаження.

Щоб спростити речі, використовуйте всі ті команди, які ви використовували для «довіреної» зони, в одному наборі команд:

firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent
firewall-cmd --zone=trusted --add-service=ssh --permanent
firewall-cmd --reload
firewall-cmd --zone=trusted --list-all

Після цього «довірена» зона повинна виглядати так:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.0/24
  services: ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Ще раз перевірте своє правило ssh з IP-адреси в локальній мережі, а потім видаліть службу ssh із «публічної» зони. Пам’ятайте наше попередження вище та робіть це, лише якщо у вас є локальний доступ до сервера!

firewall-cmd --zone=public --remove-service=ssh --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-all

Тепер публічна зона має виглядати так:

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Додайте цю нову зону для роботи з http і https. Пам’ятайте, що IP джерела тут має бути лише нашим балансувальником навантаження (у нашому прикладі: 192.168.1.103):

Примітка

Нова зона має бути додана з опцією --permanent і не може бути використана до перезавантаження брандмауера. Крім того, не забудьте --set-target=ACCEPT для цієї зони!

firewall-cmd --new-zone=balance --permanent
firewall-cmd --reload
firewall-cmd --zone=balance --set-target=ACCEPT
firewall-cmd --zone=balance --add-source=192.168.1.103 --permanent
firewall-cmd --zone=balance --add-service=http --add-service=https --permanent
firewall-cmd --reload
firewall-cmd --zone=balance --list-all

Результат:

balance (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.103
  services: http https
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Повторіть ці кроки на сервері іншого веб-сервера.

Після того, як до всього додано правила брандмауера, знову перевірте свій pound-сервер у браузері робочої станції.

Інша інформація

Є БАГАТО параметрів, які можна включити у ваш файл pound.conf, включаючи директиви повідомлень про помилки, параметри журналювання, значення часу очікування і т.д. Ви можете знайти те, що доступно, тут.

Зручно, Pound автоматично визначає, якщо один із «BackEnd» серверів офлайн, і вимикає його, щоб веб-сервіси могли продовжувати працювати без затримки. Він також автоматично бачить їх знову, коли вони знову в мережі.

Висновок

Pound пропонує інший варіант для тих, хто не хоче використовувати HAProxy або Nginx для балансування навантаження.

Pound, сервер балансування навантаження, дуже простий у встановленні, налаштуванні та використанні. Як зазначено тут, ви можете використовувати Pound як зворотний проксі, і існує багато варіантів проксі та балансування навантаження.

І ви завжди повинні пам’ятати про безпеку під час налаштування будь-якої служби, включаючи проксі-сервер балансування навантаження.

Author: Steven Spencer

Contributors: Ganna Zhyrnova